Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Использование оператора LIKE
 
 автор: Den*s   (20.09.2009 в 19:21)   письмо автору
 
 

Здравствуйте, использую вот такой запрос

 $query="SELECT * FROM $tableName WHERE name_job LIKE '%".$find_text."%'"; 
   $query=mysql_query($query);

в результате выводится всё содержимое :(
Можно ли использовать такой синтаксис?

  Ответить  
 
 автор: cheops   (20.09.2009 в 19:24)   письмо автору
 
   для: Den*s   (20.09.2009 в 19:21)
 

>в результате выводится всё содержимое :(
А что нужно?
>Можно ли использовать такой синтаксис?
Можно, это типичное использование синтаксиса оператора LIKE.

  Ответить  
 
 автор: Den*s   (20.09.2009 в 19:31)   письмо автору
 
   для: cheops   (20.09.2009 в 19:24)
 

>А что нужно?
В базе есть три поля типа varchar(250) и они заполнены на подобие
1) Биография Юлия Цезаря
2) Иванов Пётр Сергеевич
3) История
есть форма поиска, в которой пользователь заполняет данные в 3 поля поиска, заполнить одно поле, а может все три.
И вот по этим данным нужно сделать поиск в таблице, вот код

<?
$tableName 
"posob";
   
   if (
$name1 || $avtor || $predmet)
   {
   
   
$query "SELECT * FROM $tableName WHERE name1 LIKE '%".$name1."%' OR avtor LIKE '%".$avtor."%' OR predmet LIKE '%".$predmet."%' "
   
$query mysql_query($query);
   while (list(
$id_temp$text_page_temp) = @mysql_fetch_row($query))
   { 
    
//$count_find++;
    
$id_array=$id_temp
    
$text_page_array=trim(strip_tags($text_page_temp));
    
$count_sym=strlen($text_page_array);
    if (
$count_sym>49$text_page_array=substr($text_page_array050)."...";
    print 
"$text_page_array<br>";
    
$ok "yes";
   }
   if (
$ok == "") print "<p style='color:red'>По вашему запросу ничего не найдено</p>";
   }
?>

может ошибка в while (list($id_temp, $text_page_temp) = @mysql_fetch_row($query))

  Ответить  
 
 автор: cheops   (20.09.2009 в 19:46)   письмо автору
 
   для: Den*s   (20.09.2009 в 19:31)
 

Если у вас не заполнено хотя бы одно поле - у вас будут выводиться все записи, так как сравнивать вы будете с %% - что эквивалентно совпадению с любой записью. Если поле не заполнено - его условие нужно исключать из конструкции WHERE.

  Ответить  
 
 автор: Den*s   (20.09.2009 в 20:11)   письмо автору
 
   для: cheops   (20.09.2009 в 19:46)
 

Спасибо :)
действительно, если переменные приходят пустыми то отображаются все записи в результате запроса
избавился от этого вот так

<?
$name1 
= @trim (htmlspecialchars (mysql_real_escape_string ($_POST["name1"]), ENT_QUOTES) );
 
$avtor = @trim (htmlspecialchars (mysql_real_escape_string ($_POST["avtor"]), ENT_QUOTES) );
 
$predmet = @trim (htmlspecialchars (mysql_real_escape_string ($_POST["predmet"]), ENT_QUOTES) );
 
 if (!
$name1$name1 "<";
 if (!
$avtor$avtor "<";
 if (!
$predmet$predmet "<";
?>


так как у меня стоит htmlspecialchars на принятии переменной, то такой знак в базу не запишется, получается корректный выбор, только наверно это не эффективно...

  Ответить  
 
 автор: cheops   (20.09.2009 в 20:18)   письмо автору
 
   для: Den*s   (20.09.2009 в 20:11)
 

Хм... условие будет в холостую работать всякий раз, даже если поле не заполнено. Обычно поступают следующим образом
<?php
      
...
   
$where = array();
   if(!empty(
$name1)) $where[] = "name1 LIKE '%".$name1."%'";
   if(!empty(
$avtor)) $where[] = "avtor LIKE '%".$avtor."%'";
   if(!empty(
$predmet)) $where[] = "predmet LIKE '%".$predmet."%'";
   if(!empty(
$where))
   {
      
$query "SELECT * FROM $tableName WHERE ".implode(" OR "$where); 
      ...
   }
   ...
?>

  Ответить  
 
 автор: Den*s   (20.09.2009 в 20:55)   письмо автору
 
   для: cheops   (20.09.2009 в 20:18)
 

Спасибо ещё раз, прям то что доктор прописал :)

  Ответить  
 
 автор: Евгений Петров   (22.09.2009 в 20:24)   письмо автору
 
   для: cheops   (20.09.2009 в 19:24)
 

> Можно, это типичное использование синтаксиса оператора LIKE.
Но не нужно. ) Мускулу прийдется пройтись по всей таблице чтобы сделать выборку. Пока данных мало, работает все быстро, как то и не задумываешься, а когда в таблице 30 000 000 записей можно просто не дождаться )
LIKE следует использовать так:
SELECT * FROM tbl WHERE field LIKE 'blabla%'

При условии что на field есть индекс. В противном случае (если это поиск по содержимому) либо FULLTEXT поиск (осторожно MyISAM!) либо что то посерьезнее.

  Ответить  
 
 автор: cheops   (22.09.2009 в 20:28)   письмо автору
 
   для: Евгений Петров   (22.09.2009 в 20:24)
 

И при условии, что нужно найти текст "blabla" идущий в начале field, если важно найти текст в том числе и в середине поля, придется обрамлять % с обеих сторон.

  Ответить  
 
 автор: Евгений Петров   (22.09.2009 в 21:00)   письмо автору
 
   для: cheops   (22.09.2009 в 20:28)
 

Не все что нужно можно так просто сделать. Конечно если в таблице не 1000 записей, которыми пользуется 10 пользователей. Или если это не частный запрос который выполняется очень редко.
Полнотекстовый поиск тоже кстати неспроста разрешает искать только по началу слова.

  Ответить  
 
 автор: cheops   (22.09.2009 в 21:04)   письмо автору
 
   для: Евгений Петров   (22.09.2009 в 21:00)
 

LIKE - это быстрое и стандартное решение. Разумеется при больших объемах необходимо предпринимать дополнительные условия для организации качественного и скоростного поиска. Чем больше база данных и чем она сложнее - тем больше усилий требуется приложить.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования