За последние 24 часа нас посетили 17525 программистов и 1727 роботов. Сейчас ищут 916 программистов ...

Как правильно сделать поиск ?

Тема в разделе "Вопросы от блондинок", создана пользователем Валерия, 16 ноя 2007.

  1. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    PHP:
    1. <?
    2.  $text=$_POST['text'];#тут кое что пропустим
    3. if ($text==""){$res = 1;}
    4.  else
    5.      #предполагаем что к базе мы уже раньше законнектилсь
    6.     $query = "SELECT * FROM `table1` WHERE `text` LIKE '%".$text."%' OR `descript` LIKE '%".$text."%' ORDER BY `id`;";
    7.      $find = mysql_query($query) or die("Query failed : " . mysql_error());
    8.      if ($find==""){#этот [b]if [/b]у меня вызывает смутные сомнения...
    9.          $res = 2;}
    10.      else {$res=3;}
    11.  --------------------------------------------
    12.  switch ($res){
    13.      case 1:{echo "Введите текст для поиска !!!";break;}
    14.      case 2:{echo "Ничего не найдено.";break;}
    15.      case 3:{Тут вывод результатов поиска}
    16.  }
    17.  ?>
    Как сформировать более сложный запрос правильно ?
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    что такое $result и что находится в $find ?
     
  3. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Переменную в предыдущей строке переименовала, а в следущей нет ) Уже исправила
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    правильно вызывает
    Надо хоть какую-то мурзилку прочесть про использование БД.
    так что такое $find ?
    читать книги, писать, в том числе в соответствующем разделе. ))
    Учиццо на своем и чужом опыте.

    И в первую очередь написать этот "более сложный запрос" на русском.
     
  5. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Почитала мурзилку, не совсем поняла.
    PHP:
    1. <? $find=mysql_query($query);?>
    Ну через (!$find) мы проверим, был ли запрос успешным или нет. Если $find - FALSE то запрос не удался.
    А как проверить, содержит запрос что-то или не нашлось ничего, соответствующего условиям поиска ?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    чтобы понять есть ли данные удовлетворяющие поиску нужно узнать сколько строк вернул результат
    это можно делать через mysql_num_rows( $find )
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    $find - ссылка на объект, который пришел из мускула.
    из него можно вынимать данные с помощью mysql_fetch_assoc($find) построчно.
    если $find==false то ничего хорошего нам не вернули ))
    mysql_query
    mysql_fetch_assoc($find) возвращает массив из строчки и перемещает указатель в $find на 1.
    если в $find ничего нет или указатель дошел до конца, то mysql_fetch_assoc вернет false - ссылку я давал.

    поэтому цикл
    while ($row=mysql_fetch_assoc($find)) {
    }
    переберет все строчки в $find - если их нет то ни одной.
    но удобнее для проверки использовать специальную функцию mysql_num_rows

    надеюсь навык чтения мануала сегодня продвинулся.
     
  8. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Как правильно обработать строку для поиска ? Думаю, вариант
    PHP:
    1.  
    2. <?php
    3. $search = $_GET['search'];
    4. ....
    5. $query = "SELECT * FROM `table1` WHERE `text` LIKE '%".$search."%';";
    6. ?>
    7.  
    , в котором $search не подвергается никакой дополнительной обработке, является небезопасным.
     
  9. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  10. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Вот что получилось. Жду ваших комментариев.
    PHP:
    1.  
    2. <?php
    3. $printform="<form action=\"?p=search\" method=get><br>
    4. <input type=submit value=\"Найти\"><br>
    5. <input type=text name=s><br>
    6. <input type=hidden name=p value=search><br>
    7. </form><br>";
    8. $mpt=trim($_GET['s']);//сделала так, потому что если просто писать, как было в примере empty(trim($_GET['s'])) то вызывало ошибку.
    9. if( !isset( $_GET['s'] ) || empty($mpt)){
    10.     $res = 1;
    11. }
    12. else {
    13.     $text=$_GET['s'];
    14.     $link = mysql_connect($host, $login, $pass) or die("Could not connect : " . mysql_error());
    15.     mysql_select_db($dbname) or die("Could not select database");
    16.     $text=mysql_real_escape_string($text);
    17.  
    18.     $query = "SELECT * FROM $table WHERE `text` LIKE '%".$text."%' ORDER BY `id`;";
    19.     $find = mysql_query($query) or die("Query failed : " . mysql_error());
    20.  
    21.     if ($find==FALSE){
    22.         $res = 4;
    23.     }
    24.     else {
    25.         if (mysql_num_rows( $find )==0){
    26.             $res = 2;
    27.         }
    28.         else {
    29.             $res = 3;
    30.         }
    31.     }
    32. }
    33. #--------------------------------------------
    34. switch ($res){
    35.     case 1:{
    36.         echo "Введите текст для поиска !!!<br>",$printform;
    37.         break;
    38.     }
    39.     case 2:{
    40.         echo "Ничего не найдено.";
    41.         break;
    42.     }
    43.     case 3:{
    44.         echo "Тут вывод результатов поиска";
    45.         break;
    46.     }
    47.     default:{
    48.         echo "Ororo !!!";
    49.     }
    50. }
    51.  
    52. ?>
    53.  
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    отлично получилось
    только зачем ?p=search и <input type=hidden name=p value=search> ? ))
    да и тут $query = "SELECT * FROM $table WHERE `text` LIKE '%".$text."%' ORDER BY `id`;"; можно лишних кавычек-точек не ставить:
    $query = "SELECT * FROM $table WHERE `text` LIKE '%$text%' ORDER BY `id`;";
    а так все хорошо
    только в строке $mpt=trim($_GET['s']); выдается ошибочка но ее можно законно задавить собачкой @$mpt=trim($_GET['s']) или переделать немного ))) но мне и так понравилось, хорошая работа
     
  12. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    Ну сначала было ?p=search, но почему-то так не работает, забыла убрать )
    Ну это на тот случай, когда приходится вставлять элемент массива, тогда без кавычек не обойтись: "...`text`='".arr['text']."';". Просто привычка )
    Ошибка была, когда строка выглядела так:
    if( !isset( $_GET['search'] ) || empty(trim($_GET['search']))
    Поэтому, заменила на переменную, ошибка пропала. Хотя не поняла, почему ) Просто такой метод иногда помогает :)
    ОК, спасибо всем :) Сча начну новую тему, участвуйте :)
     
  13. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Потому что есть методы POST и GET и соответствующие им массивы $_POST и $_GET
    empty Позволяет в этом случае обойтись и без isset но не терпит функций внутри (в данном случае trim)


    Правильная ))
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    у меня тоже выпала ошибка и ваше решение мне очень понравилось
    но
    при первом вызове страницы у некоторых (в зависимости от настроек php) вывалится предупреждение что индекы S пустой в выражении $mpt=trim($_GET['s']);
    я вот про какую ошибочку ))
     
  15. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    ок, исправлю
     
  16. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
    При вводе в строку поиска символа % поиск находит все значения из базы. Как этого избежать ?
     
  17. Anonymous

    Anonymous Guest

    Экранировать спецсимволы.
     
  18. Clone

    Clone Guest

    Предвосхищаяя вопрос "как экранировать спецсимволы", отвечу, что функцией mysql_escape_string :)
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    :) str_replace
     
  20. antonn

    antonn Активный пользователь

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    и preg_quote() для регулярок :))
     
  21. Валерия

    Валерия Активный пользователь

    С нами с:
    14 ноя 2007
    Сообщения:
    50
    Симпатии:
    0
  22. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    можно и так.