PDA

View Full Version : گفتگو: طراحی یک دیکشنری با تعداد کلمات ثابت



css-man
شنبه 12 آذر 1390, 20:03 عصر
من یه پروژه ای دارم که باید یک دیکشنری انگلیسی به فارسی طراحی کنم
یه فیلد برای نوشتن کلمه داشته باشه با یک دکمه وقتی که کلمه نوشته شد و دکمه زده شد یا معنی نمایش داده بشه یا بگه کلمه وجود نداره یا املای کلمه غلط هست
کلمه ها حدودا 1000 تا هست با معانیشون که میشه 2000 تا

لطفا راهنمائیم کنید

MSN_Issue
شنبه 12 آذر 1390, 21:37 عصر
اگه دقیقا بگید کجاشو مشکل دارید بهتر میشه راهنمایی کرد ... !

css-man
شنبه 12 آذر 1390, 23:05 عصر
کلا نمی دونم چی کار باید بکنم
کلمات انگلیسی و معانیه فارسیشونو توی دیتابیس قرار بدم یا نه کلا یه توضیح اجمالی از نحوه نوشتن این برنامه میخوام

saina2006
شنبه 12 آذر 1390, 23:59 عصر
نحوه نوشتن ساده هست، همه کلمات و معانی رو در دیتابیس بزار و بعد دیتابیس رو برای اون کلمه سرچ کن و جواب کوئری رو برگردون

من یه دفعه که خودم میخواستم این کار رو انجام بدم به خاطر سرعت بالاتر از singelton Pattern استفاده کردم که فکر نمیکنم برای شما مفید باشه اما سرعت رو خیلی بالا میبره چون لازم نیست دیگه هیچوقت به دیتابیس وصل بشه اما حجم زیادی هم از مموری اشغال میکنه

css-man
یک شنبه 13 آذر 1390, 00:18 صبح
کلمات و معانی هردو یکجا قرار بگیرن در دیتا بیس؟

سوال بعدی هم اینکه میخوام چیزایی که سرچ میشه یه جا ذخیره بشه مثلا تویه یه صفحه یا یه فایل متنی

saina2006
یک شنبه 13 آذر 1390, 00:28 صبح
ببین برای هر tuple دو تا attribute در نظر بگیر که یکیش کلمه هست یکی هم معنی کلمه، حالا هر کلمه ای که وارد شد توی کلمات دنباش بگرد و اگر پیدا شد معنیش رو برگردون و هر کلمه ای که وارد شد رو توی یه table دیگه وارد کن.
کار سختی نیست فکر نکنم حتی دو ساعت هم کار داشته باشه.

css-man
یک شنبه 13 آذر 1390, 14:45 عصر
ببین برای هر tuple دو تا attribute در نظر بگیر که یکیش کلمه هست یکی هم معنی کلمه، حالا هر کلمه ای که وارد شد توی کلمات دنباش بگرد و اگر پیدا شد معنیش رو برگردون و هر کلمه ای که وارد شد رو توی یه table دیگه وارد کن.
کار سختی نیست فکر نکنم حتی دو ساعت هم کار داشته باشه.

میشه ساده تر توضیح بدید من تازه کارم

pejman_view
دوشنبه 14 آذر 1390, 00:27 صبح
میشه ساده تر توضیح بدید من تازه کارم
سلام
امیدوارم خوب باشید،

ساده ترش اینه که اولین کاری می کنید یک جدول اطلاعاتی بسازید فرضاً اسم این جدول هم می گذاریم : glossary
و این جدول کلاً 3 تا فیلد داره: 1- id
2- en
3- fa
حالا چون ما می خواهیم از انگلیسی به فارسی جستجو کنیم باید فیلد en را index قرار بدید و id هم primary key

CREATE TABLE glossary{
id INT NOT NULL AUTO_INCREMENT,
en VARCHAR(255) NOT NULL,
fa VARCHAR(255) NOT NULL,
index(en),
primary key(id)
};


حالا راحت با استفاده از یک کوئری ساده که پایین هم مثال خواهم زد راحت می توانید کلمه را پیدا کرده و خوشبختانه دیکشنری هم یک یا دو کلمه ایی است، و قراره از انگلیسی به فارسی برگرده بنابراین مشکل خاصی ندارید.

SELECT * FROM glossary WHERE en = 'word'

یا


SELECT * FROM glossary WHERE en LIKE 'word%'


فرق دو کوئری بالا در این است که اولین کوئری دقیقاً عین کلمه word را جستجو می کند، در دومی کلماتی را که با word شروع می شود را جستجو می کند.

مرا ببخشید که اگر سطح پایین توضیح دادم اما با توجه به اینکه گفتید تازه کارید من بصورت سطح پایین توضیح دادم اما اگر سطح بالاتر خواستید که متدهای جستجوها و ساخت دیتابیس در یک فایل را توضیح بدهم بفرمایید تا براتون توضیح بدم.

css-man
دوشنبه 14 آذر 1390, 01:37 صبح
حیف که فقط یک دکمه تشکر داره وگرنه 1000 بار ازتون تشکر میکردم خیلی خوب منو متوجه کردید

مرسی

css-man
چهارشنبه 16 آذر 1390, 02:18 صبح
من اینو نوشتم
چند تا کلمه دستی تو دیتابیس وارد کردم که این پیغام رو برای کلمه فارسی میده

1 row(s) inserted.
Inserted row id: 3
Warning: #1366 Incorrect string value: '\xD8\xAE\xD8\xAF\xD8\xA7...' for column 'fa' at row 1


میخوام یه جوری بگم که بین حروف کوچیک و بزرگ فرقینذاره

مشکلات بعدی مو بعدا مطرح میکنم

مرسی

css-man
چهارشنبه 16 آذر 1390, 02:19 صبح
اینم کدی که تا حالا نوشتم




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<div id="container">
<?php
require_once('head.html');
require_once('arm.html');
require_once('dic.html');
require_once('trans.html');
require_once('footer.html');
$word = $_POST['word'];
if(!$word){
echo "شما هیچ کلمه ای برای ترجمه وارد نکرده اید";
}
$qry = "SELECT * FROME glossary WHERE en = 'word' ";
$result = mysql_query($qry);
echo $result;
?>
</div>
</body>
</html>

MMSHFE
چهارشنبه 16 آذر 1390, 08:12 صبح
با سلام، ابتدا باید این نکته رو بگم که بهتره جدولتون رو موقع ایجاد کردن، با کدگذاری utf8_bin یا utf8_persian_ci ذخیره کنید.
حالا جدا از ساخت صفحه فرم برای وارد کردن کلمه موردنظر برای جستجو توسط کاربر (که فکر نمیکنم توی اون مشکلی داشته باشین)، این کد رو توی صفحه مقصد فرمتون بنویسید (کد خودتون رو تغییر دادم) :


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Result</title>
</head>

<body>
<div id="container">
<?php
require_once 'head.html';
require_once 'arm.html';
require_once 'dic.html';
require_once 'trans.html';
require_once 'footer.html';
mysql_connect('localhost', 'root', '') or die('خطا در اتصال');
mysql_select_db('db_name') or die('خطا در انتخاب پايگاه داده ها');
mysql_query('SET NAMES \'utf8\'');
if(isset($_POST['word']) && $_POST['word'] != '') {
$word = mysql_real_escape_string(strtolower($_POST['word']));
$qry = "SELECT * FROME `glossary` WHERE (`en`='{word}') ORDER BY `id` LIMIT 1";
$result = mysql_query($qry);
if($result && mysql_num_rows($result) > 0) {
$result = mysql_fetch_assoc($result);
echo $result['fa'];
}
else {
echo 'کلمه مورد نظر شما یافت نشد. لطفاً املای آنرا بررسی کنید';
}
}
else {
echo 'شما هيچ کلمه اي براي جستجو وارد نکرده ايد';
}
?>
</div>
</body>
</html>

حالا کافیه توی دیتابیس هم موقع ذخیره کردن کلمات، اونها رو با حروف کوچک ذخیره کنید. وجود تابع strtolower به شما این تضمین رو میده که اگه کاربر با حروف بزرگ هم کلمه رو جستجو کنه، کد شما دنبال معادل حروف کوچک اون توی دیتابیس میگرده.
موفق باشید.

css-man
پنج شنبه 17 آذر 1390, 01:14 صبح
با سلام، ابتدا باید این نکته رو بگم که بهتره جدولتون رو موقع ایجاد کردن، با کدگذاری utf8_bin یا utf8_persian_ci ذخیره کنید.
حالا جدا از ساخت صفحه فرم برای وارد کردن کلمه موردنظر برای جستجو توسط کاربر (که فکر نمیکنم توی اون مشکلی داشته باشین)، این کد رو توی صفحه مقصد فرمتون بنویسید (کد خودتون رو تغییر دادم) :



mysql_query('SET NAMES \'utf8\'');
if(isset($_POST['word']) && $_POST['word'] != '') {
$word = mysql_real_escape_string(strtolower($_POST['word']));
$qry = "SELECT * FROME `glossary` WHERE (`en`='{word}') ORDER BY `id` LIMIT 1";
$result = mysql_query($qry);
if($result && mysql_num_rows($result) > 0) {




اگر امکان داره ُset/name .... رو هم یه توضیح بدید که کارش چیه

mysql_real_escape_string این تابع رو هم برام کارش رو بگید خیلی عالی میشه
ممنونم

MMSHFE
پنج شنبه 17 آذر 1390, 11:19 صبح
با سلام، 'SET NAMES 'utf8 به موتور MySQL اعلام میکنه که اطلاعاتی که قراره بین صفحات وب و پایگاه داده ها رد و بدل بشه، با کدگذاری UTF-8 ذخیره شده. درنتیجه، بصورت درست و خوانا توی دیتابیس ذخیره میشن و موقع خوندن هم به درستی ظاهر خواهند شد. این مسئله در زمانی که میخوایم اطلاعات فارسی توی دیتابیس ذخیره کنیم، اهمیت زیادی پیدا میکنه.
mysql_real_escape_string هم باعث میشه کلمه ای که کاربر توی کادر ورود کلمه تایپ کرده، درصورت داشتن اسکریپتهای SQL مخرب و خطرناک، به یک رشته امن تبدیل بشه و کارکترهای غیر مجاز اون، تبدیل به کارکترهای بی خطر بشن که به این کار اصطلاحاً میگن Escapeکردن.
موفق باشید.

css-man
پنج شنبه 17 آذر 1390, 14:08 عصر
سلام وممنون از راهنمائیتون

من تغییراتی که گفته بودید رو انجام دادم و یک لغت رو به دیتابیس وارد کردم بصورت دستی ولی ترجمه نمیکنه فقط پیغام چک کردن املای کلمه رو که در آخر اضافه کردید رو میده




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<div id="container">
<?php
require_once('head.html');
require_once('arm.html');
require_once('dic.html');
require_once('trans.html');
require_once('footer.html');
mysql_connect('localhost','root','')or die('خطا در اتصال به پایگاه داده');
mysql_select_db('glossary')or die ('خطا در ارتباط با بانک اطلاعاتی');
mysql_query('SET NAME\'UTF8\'');
if(isset($_POST['word']) && $_POST['word'] != ''){
$word = mysql_real_escape_string(strtolower($_POST['word']));
$qry = " SELECT * FROM 'glossary' WHERE ('en' = {'word'}) ORDER BY 'id' LIMIT 1 ";
$result = mysql_query($qry);
if($result && mysql_num_rows($result) > 0 ){
$result = mysql_fetch_assoc($result);
echo $result['fa'];
}
else {
echo 'کلمه مورد نظر شما یافت نشد . لطفا املای آن را بررسی کنید';
}
}
else{
echo 'شما هیچ کلمه ای وارد نکرده اید';
}


?>
</div>

pejman_view
پنج شنبه 17 آذر 1390, 14:59 عصر
سلام

خط 21 اصلاح شده لطفاً این خط را جایگزین کنید:

$qry = " SELECT * FROM 'glossary' WHERE ('en' = '".{$word}."') ORDER BY 'id' LIMIT 1 ";

با آرزوی موفقیت

css-man
جمعه 18 آذر 1390, 00:03 صبح
تغییر دادم ولی از } ایراد گرفت وقتی هم به ( تبدیل کردم بازم کار نکرد

pejman_view
جمعه 18 آذر 1390, 09:36 صبح
تغییر دادم ولی از } ایراد گرفت وقتی هم به ( تبدیل کردم بازم کار نکرد
سلام

بصورت زیر اصلاحش کنید.


$qry = " SELECT * FROM 'glossary' WHERE ('en' = '".$word."') ORDER BY 'id' LIMIT 1 ";

MMSHFE
جمعه 18 آذر 1390, 10:05 صبح
با سلام، ای کد رو بررسی کنید:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Result</title>
</head>

<body>
<div id="container">
<?php
require_once 'head.html';
require_once 'arm.html';
require_once 'dic.html';
require_once 'trans.html';
require_once 'footer.html';
mysql_connect('localhost', 'root', '') or die('خطا در اتصال');
mysql_select_db('glossary') or die('خطا در انتخاب پايگاه داده ها');
mysql_query('SET NAMES \'utf8\'');
if(isset($_POST['word']) && $_POST['word'] != '') {
$word = mysql_real_escape_string(strtolower($_POST['word']));
$qry = "SELECT * FROME `glossary` WHERE (`en`='{$word}') ORDER BY `id` LIMIT 1";
$result = mysql_query($qry);
if($result && mysql_num_rows($result) > 0) {
$result = mysql_fetch_assoc($result);
echo $result['fa'];
}
else {
echo 'کلمه مورد نظر شما یافت نشد. لطفاً املای آنرا بررسی کنید';
}
}
else {
echo 'شما هيچ کلمه اي براي جستجو وارد نکرده ايد';
}
?>
</div>
</body>
</html>

دقت کنید که توی کد بالا، فرض بر اینه که جدول شما به نام glossary توی دیتابیس به نام glossary ذخیره شده و دارای فیلدهای en و fa هست. موفق باشید.

pejman_view
جمعه 18 آذر 1390, 10:24 صبح
سلام

ممنون از کاربر MMSHFE بله اگر ارور هم داد ، ارور را کپی و پیست کنید ما بهتر می توانیم مشکلش را پیدا کنیم. و برای اینکه خیالمان هم در مورد دیتابیس راحت بشه لطفاً mysql_error() هم اکو کنید که اگر در دیتابیس هم مشکلی بود متوجه بشیم.

با تشکر

css-man
جمعه 18 آذر 1390, 11:46 صبح
این تمام کدی هست که من نوشتم فقط قسمت else ها اجرا میشه
کلمه ای نمینویسم پیغام مناسب رو میده
هر کلمه ی دیگه ای هم که مینویسم میگه املای کلمه رو چک کن یعنی else یکی مونده به آخر



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<div id="container">
<?php
require_once('head.html');
require_once('arm.html');
require_once('dic.html');
require_once('trans.html');
require_once('footer.html');
mysql_connect('localhost','root','')or die('خطا در اتصال به پایگاه داده');
mysql_select_db('glossary')or die ('خطا در ارتباط با بانک اطلاعاتی');
mysql_query('SET NAME\'UTF8\'');
if(isset($_POST['word']) && $_POST['word'] != ''){
$word = mysql_real_escape_string(strtolower($_POST['word']));
$qry = " SELECT * FROM 'dic' WHERE ('en' = '{$word}') ORDER BY 'id' LIMIT 1 ";
$result = mysql_query($qry);
if($result && mysql_num_rows($result) > 0 ){
$result = mysql_fetch_assoc($result);
echo $result['fa'];
}
else {
echo 'کلمه مورد نظر شما یافت نشد . لطفا املای آن را بررسی کنید';
}
}
else{
echo 'شما هیچ کلمه ای وارد نکرده اید';
}


?>
</div>
</body>
</html>

pejman_view
جمعه 18 آذر 1390, 12:59 عصر
سلام


چون شرطی که در خط 23 است جواب درست را نمایش نمی دهد، اگر خطایی در کوئری در خط 21 هم باشد باز هم می نویسد "کلمه مورد نظر شما یافت نشد . لطفا املای آن را بررسی کنید" بنابراین دو راه دارید
راه اول: که یک طرف && رو پاک کنید و هر دفعه چک کنید ببینید کدام گزاره اش صحیح نمی باشد.
راه دوم :
لطفاً کد زیر را کپی کنید و اجرا کنید و هر خطایی که داد اینجا کپی و پیست کنید



mysql_connect('localhost','root','')or die('خطا در اتصال به پایگاه داده');
mysql_select_db('glossary',$dbc)or die ('خطا در ارتباط با بانک اطلاعاتی');
mysql_query('SET NAME\'UTF8\'');
if(isset($_POST['word']) && $_POST['word'] != ''){
$word = mysql_real_escape_string(strtolower($_POST['word']));
$qry = " SELECT * FROM 'dic' WHERE ('en' = '{$word}') ORDER BY 'id' LIMIT 1 ";
$result = mysql_query($qry) or die(mysql_error());
if($result && mysql_num_rows($result) > 0 ){
$result = mysql_fetch_assoc($result);
echo $result['fa'];
}
else {
echo 'کلمه مورد نظر شما یافت نشد . لطفا املای آن را بررسی کنید';
}
}
else{
echo 'شما هیچ کلمه ای وارد نکرده اید';
}


?>
</div>
</body>
</html>

css-man
جمعه 18 آذر 1390, 13:10 عصر
78941



این پیغام ها رو میده

css-man
جمعه 18 آذر 1390, 14:39 عصر
بالاخره این ماجرا با کمک دوستان خوبم pejman_view و MMSHFE

حل شد
باید از pejmane عزیز 2000 بار تشکر کنم بخاطر کمکهاش