PDA

View Full Version : ساخت فرم جستجو برای عبارتهای فارسی در PHP + MYSQL



ali abedian
یک شنبه 17 شهریور 1392, 09:14 صبح
سلام
برای جستجوی فارسی در PHP باید چه کار کرد؟
منظورم فرم جستجویی که میسازیم برای سایت، اطلاعات فارسی رو از بانک اطلاعات فراخوانی نمیکنه

افشین66
یک شنبه 17 شهریور 1392, 10:14 صبح
کوئری خودت بگذار شاید کوئریت ایراد داره. چک کن ببین اطلاعات داخل جدولت با فرمت utf8 ذخیره شدن ؟؟؟؟؟

AliRezaPro
یک شنبه 17 شهریور 1392, 13:37 عصر
کد های سلکت و اینسرت خودتونو اینجا بزارید

ali abedian
دوشنبه 25 شهریور 1392, 22:16 عصر
سلام
بفرمایید
این کد php

<!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>
<?php

if(!isset($_POST["q"])) die("عبارت مورد جستجو موجود نیست، با عبارتی دیگر امتحان کنید");
$key = $_POST["q"];
if($key == "")
die("عبارتی برای جستجو 1 وارد نکردید");

if(!isset($_POST["q1"])) die("عبارت مورد جستجو موجود نیست، با عبارتی دیگر امتحان کنید");
$key1 = $_POST["q1"];
if($key1 == "") die("عبارتی برای جستجو 2 وارد نکردید");


$DbConn = mysql_connect("localhost", "root", "" ) or die(mysql_error());
mysql_select_db("text",$DbConn) or die("Can Not Select DataBase Because: ". mysql_error());


$sql = "SELECT * FROM text WHERE true";
$sql .= " AND title LIKE '%$key%' ";
$sql .= " AND body LIKE '%$key1%' ";
$SearchResult = mysql_query($sql) or die(mysql_error(). "<br />SQL: ". $sql);



$TotalResults = mysql_num_rows($SearchResult);
if($TotalResults <= 0) die("Not found any record for your key word!");

for($i = 0; $i != $TotalResults; $i++ )
{
//<!-- Start of Print Results...

$TextTitle = mysql_result($SearchResult, $i, 1);
$TextBody = mysql_result($SearchResult, $i, 2);
print($TextTitle ." ==> ". $TextBody ."<br /><br />");

//End of Print Results. -->
}
?>

</body>
</html>

واین هم کد فرم


<!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>search</title>
</head>

<body>
<form method="POST" action="search.php">
<p>
<input type="text" name="q" size="20">
<input type="text" name="q1" size="20">
<input type="submit" value="Search" name="searchBtn">
</p>
</form>

</body>
</html>


دو تا رکورد قرار دادم
یکی با عبارات انگلیسی
و دیگری با عبارات فارسی
عبارتهای انگلیسی رو پیدا میکنه
ولی فارسی رو نه

افشین66
دوشنبه 25 شهریور 1392, 22:34 عصر
ببین مشکلش احتمالا به این خاطره که بصورت utf8 ذخیره نشده . قبل از وارد کردن رکورد به دیتابیس این کد استفاده کن تا اطلاعاتت utf8 ذخیره بشه!!!!! این کوئری احتمالا جواب بده



mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

ali abedian
دوشنبه 25 شهریور 1392, 23:11 عصر
مطمئنا به خاطر همین باید باشه .. چون وقتی من کنار عبارت فارسی عبارت انگلیسی هم گذاشتم و توی سرچ از عبارت انگلیسی استفاده کردم متوجه شدم که نتیجه جستجو عبارت فارسی رو به صورت علامت سوال نشون میداد .. این یعنی این که اصلا چیزی نیست که بخواد پیدا کنه با عبارت فارسی و فقط علامت سوال هست

البته یادم رفت اینو بگم:
اینکه من اطلاعات رو با Phpmyadmin وارد وای اسکیو ال میکنم نه از طریق صفحه ای که خودم طراحی کرده باشم
ممکنه این مهم باشه؟
الان این کوئری که دادی به درد من نمیخوره با این حساب.. چون صفحه ای برای وارد کردن اطلاعات ندارم..
آیا میشه از این در phpmyadmin استفاه کرد؟
میدونم سوال بیخودی پرسیدم .. ولی اطلاعات من از ارتباطات php با بانک mysql بسیار ضعیف هست و در حد صفر .. البته در حال حاضر اینطوریه و خیلی جدی باید به این مسئله بپردازم طی روزهای نزدیک آینده.. ولی در حال حاضر به خاطر پروژه ای کارم گیر کرده و نیاز به این دارم

MMSHFE
سه شنبه 26 شهریور 1392, 09:07 صبح
بله به احتمال زیاد از همین مسئله است. اگه میخواین با phpMyAdmin کار کنید، توی صفحه اصلی اون، کدگذاری utf8 رو انتخاب کنید. درغیر اینصورت عمل درج رو هم با خود اسکریپت انجام بدین. موفق باشید.

ali abedian
چهارشنبه 27 شهریور 1392, 10:43 صبح
سلام به دوستان
مشکلم حل شد


mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

با این تکه کد که دوستان زحمتشو کشیدن، این مشکل برطرف شده

در ضمن کدینگ رو به این تنظیم کردم utf8_general_ci
و خدا رو شکر به اون چیزی که میخواستم رسیدم .. میتونید مشاهده کنید در این آدرس (http://jobs.ghaemshahri.ir) خواهشا نگید این تبلیغاتی هست چون اصلا این سایت من نیاز به تبلیغ در اینجا نداره آخه برای یه شهر هست و باید بین مردم شهرش تبلیغ بشه .. لینک رو اینجا گذاشتم تا دوستان ببینن و راهنمایی بدن تا یه سری نکات امنیتی رو درستش کنم
..
الان شما در بخش جستجو مثلا وارد کنی چاپ کاتالوگ یا بیمه شرکتهایی که اینکارو انجام میدن لیست میشن
..
فقط سوالم اینه
من از هر شرکت دارم ۲۵ تا کلمه کلیدی میگیرم تا بر اساس اون کلمات این شرکتها برای بازدید کننده (در نتایج جستجو) لیست بشن..
سوالی اینجا برام مطرح میشه:
اینکه مثلا برای یه نمایندگی بیمه ، این کلمات رو دارم :
بیمه آتش سوزی
بیمه حمل و نقل
بیمه سلامت
خب؟
اگر یکی بیاد به طور کامل بنویسه (بیمه آتش سوزی) مطمئناً در نتایج جستجو فقط همین نمایندگی بیمه لیست میشه و سایر نمایندگیها..
ولی اگر یکی بیاد بنویسه آتش سوزی ، علاوه بر این بیمه ای ها، مراکزی که مرتبط با آتش سوزی هستن هم لیست میشن..
شاید این اصولی باشه که هر چیزی که با آتش سوزی مرتبط باشه باید در نتایج جستجو بیاد ، ولی من میخوام یه طوری کنم که هر کس وقتی نوشت بیمه آتش سوزی، اونوقت بیمه ها ظاهر بشن در نتایج جستجو.. نه اینکه با نوشتن عبارت آتش سوزی هم بیمه ها ظاهر بشن در نتایج جستجو..
این سوالمو پاسخ بدین ممنون میشم..
تا انشاء الله سوالهای بعدی رو هم بپرسم ازتون در مورد هک نشدن از طریق این فرم جستجو

ali abedian
جمعه 29 شهریور 1392, 17:24 عصر
جواب نداره این سوال؟ خیلی منتظرما

MMSHFE
شنبه 30 شهریور 1392, 08:47 صبح
اگه بخواین دقیقاً همون مطالب بیاد، بجای LIKE در کوئری باید از = استفاده کنید.

ali abedian
شنبه 30 شهریور 1392, 23:58 عصر
حالا اگه بخوام مثلا کلمات مشابه تر نمایش داده بشه چطور؟
منظور این که:
مثلا یکی دنبال عبارت کارت میگرده ولی به اشتباه می نویسه کاتر
در این صورت من میخوام که در واقع عبارت کارت جستجو بشه

MMSHFE
یک شنبه 31 شهریور 1392, 10:52 صبح
برای این کار هم راه منطقی اینه که کلمات با املای مشابه (و البته اشتباه) رو توی یک فیلد دیگه ذخیره کنید و موقع جستجو، علاوه بر مساوی بودن کلمه موردنظر، املای اشتباه رو هم در اون فیلد جستجو کنید.

AliRezaPro
یک شنبه 31 شهریور 1392, 13:48 عصر
حالا اگه بخوام مثلا کلمات مشابه تر نمایش داده بشه چطور؟
منظور این که:
مثلا یکی دنبال عبارت کارت میگرده ولی به اشتباه می نویسه کاتر
در این صورت من میخوام که در واقع عبارت کارت جستجو بشه
راه های خیلی زیادی است , بهتره کاری کنید که کمترین فشار به سرور وارد شود

برای این کار هم راه منطقی اینه که کلمات با املای مشابه (و البته اشتباه) رو توی یک فیلد دیگه ذخیره کنید و موقع جستجو، علاوه بر مساوی بودن کلمه موردنظر، املای اشتباه رو هم در اون فیلد جستجو کنید.
به نظرتون این راه منطقی است ؟ اگر 300000 تا کلمه وجود داشته باشد , فکر کنید برای تک تک هم اگر تعداد حروف زیاد باشد چند جور کلمه اشتباه میشود درست کرد ؟ و اینکه چه باری خواهد داشت رو سرور ؟
شاید یکی از حالت های بهینه این باشد که ابتدا بر اساس اول کلمات سپس بر اساس وسط کلمات و انتها بر اساس آخر کلمات جستجو کند

MMSHFE
یک شنبه 31 شهریور 1392, 13:53 عصر
به نظرتون این راه منطقی است ؟ اگر 300000 تا کلمه وجود داشته باشد , فکر کنید برای تک تک هم اگر تعداد حروف زیاد باشد چند جور کلمه اشتباه میشود درست کرد ؟ و اینکه چه باری خواهد داشت رو سرور ؟
شاید یکی از حالت های بهینه این باشد که ابتدا بر اساس اول کلمات سپس بر اساس وسط کلمات و انتها بر اساس آخر کلمات جستجو کند
اینکه گفتم راه منطقیه بخاطر اینه که الگوریتم مشخصی برای املای اشتباه کلمات وجود نداره و اینکه برنامه بخواد حدس بزنه هم همه حالتها رو پوشش نمیده و معمولاً از بین چند املای اشتباه هر کلمه، یک یا چند مورد رایج تر از بقیه هستن و این موارد رو بهتره بطور دستی ثبت کرد. بهرحال اینهم یک روشه و در عمل، کاهش راندمان کمتری نسبت به پیچیده کردن الگوریتم برنامه و درنتیجه کند شدن جستجو و... (بخصوص در زمانی که بقول شما 300 هزار کلمه وجود داشته باشه)، خواهد داشت.

ali abedian
دوشنبه 01 مهر 1392, 11:32 صبح
منظورتون اینه که یکی مثل گوگل که حدس میزنه از همین روشهایی که شما میفرمایید ممکنه استفاده کرده باشه؟
من وارد این مقوله نمیشم.. باید پیچیده باشه و وقت گیر .. لااقل الان واردش نمیشم..
ممنون از همه شما دوستان