PDA

View Full Version : سوال: بهترین راه کار برای Select های پیاپی



ghiravani
یک شنبه 15 اردیبهشت 1392, 02:14 صبح
با سلام خدمت دوستان محترم.

برای مثال یک جدول لغات دیکشنری داریم به صورت زیر
id , english_word , persian_word

حالا می خوایم کاربر وقتی جمله وارد میکنه، هر کلمه از جمله، معنیش در جدول سرچ بشه و در یک سطر نمایش داده بشه.
برای این کار من به این صورت برنامه نوشتم:


<?php

$text = $_POST['text'];
$text = explode(' ',$text);//برای جدا کردن کلمات در جمله
$sizeof = sizeof($text);//محاسبه تعداد کلمات در جمله
for($i=0;$i<$sizeof;$i++)
{
$query = 'SELECT * FROM `dic_table` WHERE `english_word`="'.$text[$i].'"';
echo $text[$i].' = '.@mysql_result($result,0,2).'<br/>';
}

?>


اما مشکل همیشه همین جایی هست که در حلقه به صورت مداوم در دیتابیس سرچ انجام میشه. حجم دیتابیس بالاست و اگر جمله طولانی باشه، سرعت خیلی پایین میاد. راه حلی وجود نداره برای این Select های داخل حلقه ها؟

ممنون

omid_student
یک شنبه 15 اردیبهشت 1392, 11:20 صبح
سلام
خوب چه کاری توی هر حلقه یه بار کوئری اجرا بشه!
شما اول رشته پرس و جو رو توی حلقه درست کنید و در انتها اجرا کنید
در ضمن به جای تساوی در کوئری بهتره که از like %expersion% s استفاده کنید این بهتره یا از عبارات منظم
اگه خواستی میونی ایمیل بدی بهت بگم چون الان وقت نمیکنم دوست عزیز

MMSHFE
یک شنبه 15 اردیبهشت 1392, 11:33 صبح
اینو امتحان کنید:


$text = '\'' . implode('\',\'', array_map('trim', explode(' ', $_POST['text']))) . '\''; // convert hello world to 'hello','world'
$query = "SELECT * FROM `dic_table` WHERE (`english_word` IN ({$text})";
$result = mysql_query($query);
if($result && mysql_num_rows($query) > 0) {
while($row = mysql_fetch_assoc($result)) {
echo '<p>' . $row['persian_word'] . '</p>' . PHP_EOL;
}
}

ghiravani
دوشنبه 16 اردیبهشت 1392, 11:28 صبح
اینو امتحان کنید:


$text = '\'' . implode('\',\'', array_map('trim', explode(' ', $_POST['text']))) . '\''; // convert hello world to 'hello','world'
$query = "SELECT * FROM `dic_table` WHERE (`english_word` IN ({$text})";
$result = mysql_query($query);
if($result && mysql_num_rows($query) > 0) {
while($row = mysql_fetch_assoc($result)) {
echo '<p>' . $row['persian_word'] . '</p>' . PHP_EOL;
}
}


ممنونم دوست عزیز
اما نتیجه ای نمایش نمیده. حتی دستور if رو تغییر دادم به 1==1 تا ببینم چه خطایی میده، نوشت:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given

MMSHFE
دوشنبه 16 اردیبهشت 1392, 12:11 عصر
این یعنی خطایی توی کوئری هست. اگه ممکنه کد کاملی که نوشتین همراه با ورودیها و... رو بگذارین تا بررسی کنم. یکبار هم query$ رو چاپ کنید. راستی، فکر کنم آخر کوئری یک پرانتز رو نبستم!

ghiravani
دوشنبه 16 اردیبهشت 1392, 12:52 عصر
این یعنی خطایی توی کوئری هست. اگه ممکنه کد کاملی که نوشتین همراه با ورودیها و... رو بگذارین تا بررسی کنم. یکبار هم query$ رو چاپ کنید. راستی، فکر کنم آخر کوئری یک پرانتز رو نبستم!

ممنون اما با پرانتز آخر هم برطرف نشد.
در فایل های ضمیمه، فایل fulldic.zip ، جدول لغات هست که لازمه ابتدا یک دیتابیس بسازید و بعد این رو ایمپورت کنید.
فایل دوم هم فایل اجرایی PHP هست.

ممنونم

MMSHFE
دوشنبه 16 اردیبهشت 1392, 16:43 عصر
این کد رو تست کنید:


<?php
$db = mysql_connect('localhost','root','');
mysql_select_db('dic',$db);
mysql_query('SET NAMES \'utf8\'', $db);
//---
if(isset($_POST['translate']))
{
$text = '\'' . implode('\',\'', array_map('trim', explode(' ', strtolower($_POST['text'])))) . '\''; // convert hello world to 'hello','world'
$query = "SELECT * FROM `fulldic` WHERE (TRIM(LOWER(`EnglishWord`)) IN ({$text}))";
$result = mysql_query($query);
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
echo '<p>' . $row['FarsiWord'] . '</p>' . PHP_EOL;
}
}
}
else
{
?>
<!doctype html>
<html>
<head>
<title>Translator</title>
<meta charset="utf-8" />
</head>
<body>
<div align="center">
<div class="box">
<form method="post" action="">
متن را وارد کنید:<br/>
<textarea name="text" style="width:600px;height:100px;font-family:Tahoma;font-size:small;"></textarea>
<br/>
<input type="submit" name="translate" value="Translate"/>
</form>
</div>
</div>
</body>
</html>
<?php
}
?>

این جمله رو تست کنید: this is a lavatory of individualism paleontology
سه کلمه از این جمله پیدا میشه. ضمناً کلمات اگه چند کلمه یک معنی دارن، باید جداگانه ثبت کنید چون این کد برحسب Space متن رو میشکنه. اگه بخواین کلمات ترکیبی و... رو کار کنید، باید دونه دونه با LIKE جستجو کنید.

ghiravani
دوشنبه 16 اردیبهشت 1392, 18:43 عصر
این کد رو تست کنید:


<?php
$db = mysql_connect('localhost','root','');
mysql_select_db('dic',$db);
mysql_query('SET NAMES \'utf8\'', $db);
//---
if(isset($_POST['translate']))
{
$text = '\'' . implode('\',\'', array_map('trim', explode(' ', strtolower($_POST['text'])))) . '\''; // convert hello world to 'hello','world'
$query = "SELECT * FROM `fulldic` WHERE (TRIM(LOWER(`EnglishWord`)) IN ({$text}))";
$result = mysql_query($query);
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
echo '<p>' . $row['FarsiWord'] . '</p>' . PHP_EOL;
}
}
}
else
{
?>
<!doctype html>
<html>
<head>
<title>Translator</title>
<meta charset="utf-8" />
</head>
<body>
<div align="center">
<div class="box">
<form method="post" action="">
متن را وارد کنید:<br/>
<textarea name="text" style="width:600px;height:100px;font-family:Tahoma;font-size:small;"></textarea>
<br/>
<input type="submit" name="translate" value="Translate"/>
</form>
</div>
</div>
</body>
</html>
<?php
}
?>

این جمله رو تست کنید: this is a lavatory of individualism paleontology
سه کلمه از این جمله پیدا میشه. ضمناً کلمات اگه چند کلمه یک معنی دارن، باید جداگانه ثبت کنید چون این کد برحسب Space متن رو میشکنه. اگه بخواین کلمات ترکیبی و... رو کار کنید، باید دونه دونه با LIKE جستجو کنید.

بسیار بسیار عالییییی
اصلا باورم نمیشه! 3 کاغذ A4 متن بهش دادم، در 3 ثانیه نتیجه رو برگردوند!!!!!!!!
واقعا ممنونم ازتون.
چند سوال:

1) الگوریتم رو میشه کاری کرد که از این هم سریع تر بشه
2) ترتیب نمایش معانی بر چه اساسی هست؟ چون الان نه به ترتیب قرار گرفتن در متن هست و نه به ترتیب قرار گرفتن در دیتابیس
3) برای جلوگیری از نمایش و محاسبه مقادیر تکراری چکار کنم؟ چون الان در متن یک بار a نوشته شده اما در دیتابیس 3 بار a تعریف شده
4) یکم روی روش کارش توضیح می فرمایید. مثلا mysql_fetch_assoc و PHP_EOL


بازم از کمک شما ممنونم

MMSHFE
سه شنبه 17 اردیبهشت 1392, 08:45 صبح
1- برای سریعتر شدن باید ساختار دیتابیس شما تغییر کنه.
2- ترتیب الآن بر اساس قرارگرفتن کلمات انگلیسی در دیتابیس هست ولی میتونید توی Query با کمک Order By نتایج رو بطور دلخواه مرتب کنید.
3- بعد از SELECT توی Query از کلمه DISTINCT استفاده کنید.
4- روش کار که ساده است: کلمات رو برحسب Space جدا میکنه، فاصله های خالی ابتدا و انتهاشون رو حذف میکنه، بعد با ',' بهم میچسبونه و اول و آخرش هم ' میگذاره. حالا توی دیتابیس دنبال رکوردهایی میگرده که کلمه انگلیسی اون توی یکی از این کلمات باشه. رکوردهای پیدا شده، یکی یکی با mysql_fetch_assoc استخراج میشن و معنی فارسی اونها نوشته میشه. PHP_EOL هم برای درج کارکتر رفتن به سطر بعد (توی سورس کد برای افزایش خوانایی) به کار میره.