2012-08-30 3 views
0

Я пытаюсь получить результаты из базы данных MySQL, выполнив поиск нескольких терминов в нескольких полях. Скрипт ниже работает, но не совсем так, как мне это нужно, и мне трудно найти способ сделать это.Найти несколько строк в нескольких полях

В настоящее время, если я ищу «яблоки персиков» он будет возвращать каждый результат, который имеет «яблоки» ИЛИ «персики» на любом поле. То есть если в записи есть «Яблоки», но не «Персики» это даст результат.

С предполагаемым поведением я должен получить результат, только если в данной записи он найдет все условия поиска в любом поле. То есть «Яблоки» можно найти на поле f1 и «персики» на поле f2. Если найдено только «яблоки», то это не результат.

<?php 
if (!isset($_REQUEST['term'])) exit; 
$dblink = mysql_connect('localhost', 'root', 'pass') or die(mysql_error()); 
mysql_select_db('mytable'); 
mysql_set_charset('utf8', $dblink); 
// query the database table for strings that match 'term' 
$lcSearchVal = mysql_real_escape_string($_REQUEST['term']); 
$lcSearchVal = explode(' ', $lcSearchVal); 
$sql = 'SELECT id, f1, f2, f3, f4 FROM mytable 
     WHERE ('; 
$parts = array(); 
foreach($lcSearchVal as $lcSearchWord) { 
    if ($lcSearchWord <> "") { 
     $parts[] = '`id` LIKE "%' . $lcSearchWord . '%"'; 
    } 
    if ($lcSearchWord <> "") { 
     $parts[] = '`f1` LIKE "%' . $lcSearchWord . '%"'; 
    } 
    if ($lcSearchWord <> "") { 
     $parts[] = '`f2` LIKE "%' . $lcSearchWord . '%"'; 
    } 
    if ($lcSearchWord <> "") { 
     $parts[] = '`f3` LIKE "%' . $lcSearchWord . '%"'; 
    } 
    if ($lcSearchWord <> "") { 
     $parts[] = '`f4` LIKE "%' . $lcSearchWord . '%"'; 
    } 
} 
$sql.= implode(' OR ', $parts) . ') order BY id desc limit 0,10'; 
$rs = mysql_query($sql, $dblink); 
// loop through each string returned and format the response for jQuery 
$data = array(); 
$data[] = array('value' => "", 'label' => " >> Last 10 results:", 'desc' => ""); 
if ($rs && mysql_num_rows($rs)) { 
    while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) { 
     if (strlen($row['f3']) > 250) { 
      $row['f3'] = substr($row['f3'], 0, 250) . " [...]"; 
     } 
     $data[] = array('value' => $row['id'], 'label' => $row['id'] . '/' . $row['f1'] . ' (' . $row['f2'] . ') ' . $row['f4'], 'desc' => $row['f3']); 
    } 
} 
// jQuery wants JSON data 
echo json_encode($data); 
flush(); 
?> 

Спасибо за ваш вклад

+0

[Пожалуйста, прекратите использование функций 'mysql_'] (http://www.deprecatedphp.com/mysql) – Kermit

ответ

0

Рассмотрим следующий пример:

$lcSearchVal = 'one two three'; 
$lcSearchVal = explode(' ', $str); 
foreach ($lcSearchVal as &$lcSearchWord) { 
    $lcSearchWord = '`id` LIKE "%' . $lcSearchWord . '%" AND '; 
} 
$conditions = rtrim(implode('', $val), ' AND '); 

echo $conditions; //returns `id` LIKE "%one%" AND `id` LIKE "%two%" AND `id` LIKE "%three%" 

$ условия могут быть вставлены в запрос как WHERE условия.

Смежные вопросы