2013-06-01 3 views
0

У меня есть пользовательский запрос и база данных. Моя база данных содержит таблицы. Мне интересно узнать, является ли мой метод запросов к базе данных. То, что я имею в виду это:PHP Искать несколько слов в запросе по таблице базы данных

  • Отдельный запрос в массив разделяется пробелом
  • Loop через каждое слово и сделать LIKE «% {$ слово}%» ИЛИ
  • Выше этого просто перед каждой итерацией делать «И»

Проблема в том, что она работает неправильно. Его не накладывать на точные электронные письма, которые соответствуют моим запросам. Вот мой код:

$i=0; 
$userQuery = $_POST['q']; // q = "Jonathan gmail" 
$sql = "SELECT * FROM addresses WHERE "; 
$parts = explode(' ',$userQuery); 
$cnt=count($parts); 
foreach($parts as $part){ 
    $part = mysql_real_escape_string($part); 
    if($i!==$cnt-1){ 
     $sql.="(
       addresses.name LIKE '%".$part."%' OR 
       addresses.localpart LIKE '%".$part."%' OR 
       addresses.domain LIKE '%".$part."%' 
      ) AND 
     "; 
    } else { 
     $sql.="(
       addresses.name LIKE '%".$part."%' OR 
       addresses.localpart LIKE '%".$part."%' OR 
       addresses.domain LIKE '%".$part."%' 
      ) 
     "; 
    } 
    $i++;    
} 

} 

Мой вопрос в том, что случилось с этой логикой? Это кажется точным.

+0

А где вопрос? Чего вы пытаетесь достичь? – Mifeet

+0

И не могли бы вы предоставить '$ userQuery', который не работает с вашим кодом? –

+0

Готово. Добавлено вопрос и запрос – jkushner

ответ

0

Прежде всего: это сломается на одном слове. Второе: это все остальное, но безопасно от атаки SQL.

Теперь - как бы я это сделать

$parts = preg_split('/[\s,]+/',$userQuery); 
$sql=array(); 
foreach($parts as $part) { 
    $part=mysql_real_escape_string($part); //Or whatever works with your DB access framework 
    $sql[]="(addresses.name LIKE '%$part%' OR addresses.localpart LIKE '%$part%' OR addresses.domain LIKE '%$part%')"; 
} 
$sql=implode(' AND ', $sql); 
$sql="SELECT * FROM addresses WHERE $sql"; 
+0

Я не понимаю, как я подвержен атаке SQL? Я использую mysl_real_escape_string? – jkushner

0

эй что-то вроде этого:

foreach($parts as $key => $part){ 
    $part=mysql_real_escape_string($part); 
    $sql .= sprintf("(
       addresses.name LIKE %s OR 
       addresses.localpart LIKE %s OR 
       addresses.domain LIKE %s 
      )", $part); 

    if ($key!=($cnt-1)) { 
    $sql .= " AND "; 
    } 
} 
0

Литтл уведомление, вы используете $ я переменную перед ее инициализации. Возможно, это будет лучший способ использовать REGEXP. Что-то вроде:

// $search_terms = '%Jonathan%|%gmail%' 
$sql = "addresses.name REGEXP $search_terms OR addresses.localpart REGEXP $search_terms OR addresses.domain REGEXP $search_terms"; 

Более подробной информации о REGEXP

+0

Теперь мой вопрос: следует ли использовать OR вместо AND. Im пытается позволить сказать захватить Джонатан от address.name И gmail FROM addresses.domain и показать результаты, которые имеют оба. Однако это может привести к ошибке в том, что я хочу также отображать операторы OR. Например, мне не нужен набор результатов 0 из-за И против адресов. Домен, когда поисковый запрос - это Джонатан, так как он должен выводить все результаты из адреса. Имя, которое имеет Джонатан – jkushner

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