PDA

View Full Version : سوال: الگوریتم جستجوی پیشرفته با php و mysql



keyhan.taktaz
یک شنبه 12 آبان 1392, 21:34 عصر
سلام
بنده تو سیستمم یک جستوجوی پیشرفته لازم دارم که
6 تا فیلد به صورت دلخواه از کاربر میگیره
حالا میخواستم ببینم چطور باید عمل کنم؟
منظورم اینه که ممکنه یه بار کاربر همشو پر کنه یا یبار یکیشو پر کنه
یعنی باید به تک تک ورودی ها کوئری بنویسم؟
ببینید ، اگه ورودی ها خالی باشه کوئری با مشکل برخورد میشه،اگه بخوام واسه تک تک شرایط یه شرط بنویسم جمعاً میشه 2 به توان 6 تا شرط
مثلا :
اگه a پر باشه و b خالی فلان کوئری
اگه b پر باشه و a خالی فلان کوئری
نمیشه که.
لطفا کمکم کنید

ابوذر محمودی
دوشنبه 13 آبان 1392, 11:31 صبح
کل شرط ها تو یک کوئری قرار میگیره؟
شما بیا ورودی ها رو تک تک بررسی کن اگه مقدار داشت اونو به کوئری اضافه کن بعد هم اونو اجرا کن.



if ( $id != '' )
$command=" id=$id "
if($name != '')
{
if($command!='')
$command= $command . ' OR ';
$command = $command . " name=$name " ;
}
if ($family != '')
{
if($command!='')
$command= $command . ' AND ';
$command = $command . " family=$family " ;
}
$Query="select * from table where $command limit 1 order by asc"

engmmrj
دوشنبه 13 آبان 1392, 21:29 عصر
کل شرط ها تو یک کوئری قرار میگیره؟
شما بیا ورودی ها رو تک تک بررسی کن اگه مقدار داشت اونو به کوئری اضافه کن بعد هم اونو اجرا کن.



if ( $id != '' )
$command=" id=$id "
if($name != '')
{
if($command!='')
$command= $command . ' OR ';
$command = $command . " name=$name " ;
}
if ($family != '')
{
if($command!='')
$command= $command . ' AND ';
$command = $command . " family=$family " ;
}
$Query="select * from table where $command limit 1 order by asc"

اصلا روش خوبی نیست ! شما فکر کنم به جای 3 فیلد 50 فیلد داشتیم اون موقعه تکلیف چیه ؟!
میشه یک تابع نوشت که خیلی راحت این کارو انجام بده !

ابوذر محمودی
سه شنبه 14 آبان 1392, 08:17 صبح
راه های رسیدن به حل مساله زیاده ، ایشون با دیدن این قطعه کد بسیار ساده مسلما دیدشون نسبت به این مساله باز میشه چون هنوز در حلش مهارت چندانی ندارند ، بنا به فرمایشتون بنده هم میدونم این کد راه حل مناسبی(بهینه) نیست .
حالا ایشون میتونند ورودی ها رو با یک خط آرایه ای بفرستن تابع ، اونجا هم با یک حلقه و شرط کوئری رو بسازن.

MMSHFE
سه شنبه 14 آبان 1392, 08:32 صبح
اصلا روش خوبی نیست ! شما فکر کنم به جای 3 فیلد 50 فیلد داشتیم اون موقعه تکلیف چیه ؟!
میشه یک تابع نوشت که خیلی راحت این کارو انجام بده !
وقتی اینقدر با قاطعیت (اصلاً) روش پیشنهادی یکنفر رو محکوم میکنید، لطفاً راه حل بهتر خودتون رو هم ارائه بدین.
-----
این راه حل رو چک کنید:


function Search($table, $criteria) {
$table = mysql_real_escape_string($table);
$query = "SELECT * FROM `{$table}` WHERE ('1'='1'";
foreach($criteria as $fieldName => $value) {
$fieldName = mysql_real_escape_string($fieldName);
$value = mysql_real_escape_string($value);
$query .= " AND `{$fieldName}`='{$value}'";
}
$query .= ');'
return mysql_query($query);
}
// Usage:
$criteria = array();
foreach($_POST as $key => $value) {
if($value != '') {
$criteria[$key] = $value;
}
}
$result = Search('users', $criteria);

البته متد Search رو میشه بهینه کرد. مثلاً هر خونه از آرایه $criteria خودش یک آرایه باشه و Operator هم داخلش بیاد (مثلاً LIKE و NOT و BETWEEN و => و...) تا بشه حالتهای مختلف شرط رو مورد استفاده قرار داد. ضمناً الآن این روش وقتی کار میکنه که عناصر فرمتون، همنام با فیلد متناظر با اونها در دیتابیس باشن.

ابوذر محمودی
سه شنبه 14 آبان 1392, 09:23 صبح
البته یک نکته شاید مشکل ساز باشه و اینکه اگه کسی اطلاعات POST اضافی ارسال کنه که در فرم نباشه این هم به کوئری اضافه میشه و موقع اجرای کوئری چون فیلد در جدول نیست با خطا مواجه میشه ، چون ما مستقیماً اطلاعات ارسالی POST رو داریم پردازش میکنیم .

MMSHFE
سه شنبه 14 آبان 1392, 09:25 صبح
اینهم راه حل داره: آرایه POST_$ رو در یک آرایه دیگه کپی کنیم و مقادیری که نمیخوایم رو unset کنیم و آرایه جدید رو بعنوان پارامتر بفرستیم.

engmmrj
سه شنبه 14 آبان 1392, 13:11 عصر
وقتی اینقدر با قاطعیت (اصلاً) روش پیشنهادی یکنفر رو محکوم میکنید، لطفاً راه حل بهتر خودتون رو هم ارائه بدین.بنده بیشتر سعی میکنم سرنخ بدم تا جواب چون وقتی سرنخ بدی به طرف میره دنبال سرنخ ، کنار یافتن جواب 3 یا 4 مورد دیگر هم یاد میگیره !

ابوذر محمودی
سه شنبه 14 آبان 1392, 13:52 عصر
درسته اما:
این که میشه یک تابعی نوشت، برای ایشون دردی دوا نمیکنه ، مثلا من بیام بگم میشه یک کلاس طراحی کرد ، علاوه بر اون 3 یا 4 مورد دیگه ای هم که شما میگید یاد میگیره ، طراحی کلاس و شی گرایی هم یاد میگیره.

بهتره برای دادن سرنخ لااقل توضیحاتی به فارسی بدین تا ایشون بدونن تو این تابع چه کدهایی قرار بدن.

MMSHFE
سه شنبه 14 آبان 1392, 13:59 عصر
بنده بیشتر سعی میکنم سرنخ بدم تا جواب چون وقتی سرنخ بدی به طرف میره دنبال سرنخ ، کنار یافتن جواب 3 یا 4 مورد دیگر هم یاد میگیره !
راهکار مناسبی برای یاددادن ماهیگیری بجای دادن ماهی محسوب میشه ولی:

...میشه یک تابع نوشت که خیلی راحت این کارو انجام بده !
در اینجا حقیقتش من سرنخی ندیدم. اینکه گفتین میشه یک تابع برای این کار نوشت که چیز مسلم و واضحیه و راهنمایی محسوب نمیشه. بهتر بود میگفتین توی اون تابع، چه منطقی رو پیاده سازی کنن (حتی به فارسی).