PHP-код не работает так, как я хочу для функции поиска - PullRequest
0 голосов
/ 15 ноября 2011

Поиск по одному слову работает отлично. Мне бы тоже хотелось, чтобы сработали два или более слов.

До сих пор я дошел до этого, и результаты были таковы, если я ищу несколько слов:

SELECT id, title, tag, type 
FROM table WHERE **AND** p.id LIKE '%flower%' OR title LIKE '%flower%' OR tag LIKE '%flower%' OR type LIKE '%flower%' 
AND p.id LIKE '%floral%' OR title LIKE '%floral%' OR tag LIKE '%floral%' OR type LIKE '%floral%' 
ORDER BY title

Как правильно использовать AND , чтобы при поиске более одного слова я не получал лишнего AND в своем коде.

Есть ли более эффективный способ?

if (count($error) < 1) {
  $searchSQL = "SELECT id, title, tag, type     
                FROM table
                WHERE ";

 $searcheach = explode(" ", $searchTerms);

foreach($searcheach as $searchword) {

//if more than one word do this else do that
 if(strpos(trim($searchTerms), ' ') !== false) {
     $searchSQL .= "AND p.id LIKE '%{$searchword}%' 
                OR title LIKE '%{$searchword}%'
                OR tag LIKE '%{$searchword}%'
                OR type LIKE '%{$searchword}%' ";
     } 
     else {
         $searchSQL .= "p.id LIKE '%{$searchword}%' 
                OR title LIKE '%{$searchword}%'
                OR tag LIKE '%{$searchword}%'
                OR type LIKE '%{$searchword}%' ";
         }  

}
$searchSQL .= "ORDER BY title";

Ответы [ 4 ]

4 голосов
/ 15 ноября 2011
$words = explode(' ', $searchTerms);

$clauses = array()
foreach($words as $word) {
    $safeword = mysql_real_escape_string($word);
    $clauses[] = "(p.id LIKE '%{$safeword}%' OR title LIKE '%{$safeword} OR etc... )";
}
$clause = implode(' AND ', $clauses);

$sql = "SELECT ... WHERE $clause ORDER BY title";
0 голосов
/ 15 ноября 2011

Я склонен собирать все свои термины в виде массива, а затем использовать implode:

foreach($searcheach as $searchword) {
    $sqlSearchTerms[] = "p.id LIKE '%{$searchword}%' 
     OR title LIKE '%{$searchword}%'
     OR tag LIKE '%{$searchword}%'
     OR type LIKE '%{$searchword}%' ";
}

$searchSQL .= implode(' AND ', $sqlSearchTerms);
0 голосов
/ 15 ноября 2011

Я обычно использую фильтр 1 = 1, так что при поиске нескольких слов sql будет:

SELECT id, title, tag, type 
  FROM table 
  WHERE 1=1 
    AND p.id LIKE '%flower%' 
    OR title LIKE '%flower%' 
    OR tag LIKE '%flower%' 
    OR type LIKE '%flower%' 
    AND p.id LIKE '%floral%' 
    OR title LIKE '%floral%' 
    OR tag LIKE '%floral%' 
    OR type LIKE '%floral%' 
  ORDER BY title

И код для этого будет:

if (count($error) < 1) {
  $searchSQL = "SELECT id, title, tag, type     
                FROM table
                WHERE 1=1";

 $searcheach = explode(" ", $searchTerms);

foreach($searcheach as $searchword) {

//if more than one word do this else do that
 if(strpos(trim($searchTerms), ' ') !== false) {
     $searchSQL .= " AND p.id LIKE '%{$searchword}%' 
                OR title LIKE '%{$searchword}%'
                OR tag LIKE '%{$searchword}%'
                OR type LIKE '%{$searchword}%' ";
     } 
     else {
         $searchSQL .= "p.id LIKE '%{$searchword}%' 
                OR title LIKE '%{$searchword}%'
                OR tag LIKE '%{$searchword}%'
                OR type LIKE '%{$searchword}%' ";
         }  

}
$searchSQL .= "ORDER BY title";
0 голосов
/ 15 ноября 2011

Я бы предпочел сделать

$searchSQL = "SELECT id, title, tag, type     
            FROM table
            WHERE (1=1)";

Теперь вы всегда можете добавить AND перед каждым условием

Кроме того, похоже, что вы пропустили круглые скобки, я считаю, что это должно быть

$searchSQL .= "AND (p.id LIKE '%{$searchword}%' 
            OR title LIKE '%{$searchword}%'
            OR tag LIKE '%{$searchword}%'
            OR type LIKE '%{$searchword}%') "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...