За последние 24 часа нас посетили 61989 программистов и 1677 роботов. Сейчас ищут 898 программистов ...

Проблема со скриптом поиска по сайту

Тема в разделе "PHP для новичков", создана пользователем zevilz, 10 мар 2012.

  1. zevilz

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

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Пишу простенький движок поиска по сайту. Получаю поисковой запрос постом в переменной $search_word:
    Код (Text):
    1.     $query = trim($_REQUEST["search_word"]);
    2.  
    3.     $reg = "/\s(под|много|что|когда|где|или|которые|поэтому|все|будем|как)\s/im";
    4.     $query = preg_replace($reg,'',$query);
    5.  
    6.     $words = explode(" ",$query);
    7.     $i = 0;
    8.     $keywords = "";
    9.     foreach ($words as $word) {
    10.         $word = trim($word);   
    11.     echo "word" . $word;
    12.         if (strlen($word)<6) {
    13.             unset($word);
    14.         }
    15.         else {
    16.             if (strlen($word)>8) {
    17.     $reg = "/(ый|ой|ая|ое|ые|ому|а|о|у|е|ого|ему|и|ство|ых|ох|ия|ий|ь|я|он|ют|ат)$/i";
    18.     $word = preg_replace($reg,'',$word);
    19.                     $keywords[$i]=$word;
    20.                 $i++;                  
    21.             }
    22.             else {
    23.                 $keywords[$i]=$word;           
    24.                 $i++;
    25.             }
    26.         }
    27.     }
    28.  
    29. if (count($keywords)>0)
    30. {
    31. $result_search = mysql_query ("SELECT * FROM videos WHERE (`text` LIKE '%".implode($keywords, "%' OR `text` LIKE '%")."%')");
    32. $myrow_search = mysql_fetch_array ($result_search);
    33.  
    34.  
    35. do {
    36. printf ("<p>%s</p>",$myrow_search["title"]);
    37. }
    38. while ($myrow_search = mysql_fetch_array ($result_search));
    39.  
    40. }
    41. else { echo "Ничего не найдено";}
    При поиске одного слова или нескольких слов, хотя бы одно из которых реально существует, выводится результат. При поиске длинного слова, которого нет в базе, не выводится вообще ничего, даже и сообщения, что ничего не найдено. При поиске короткого слова (2-3 буквы) вылазит ошибка
    Код (Text):
    1. implode(): Invalid arguments passed
    и выводятся вообще все статьи из базы, а количество строк в массиве $keywords = 1, хотя строка с коротким значением не должна попасть в массив $keywords. Если я ставлю условие
    Код (Text):
    1. if (count($keywords)>1)
    , то поиск работает без проблем, но только при поиске фразы хотя бы из 2х слов. Где я накосячил?
     
  2. Крыс

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

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Код (Text):
    1. $keywords = "";
    2. print count($keywords);
    Код (Text):
    1. 1
    лечится заменой
    $keywords = array();
     
  3. zevilz

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

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Спасибо, заработало)))
     
  4. zevilz

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

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Еще возник вопросик. Согласно скрипту, из поиска удаляются все слова менее 3 символов (русский язык) и менее 6 символов (английский язык), но мне необходимо чтобы некоторые аббривеатуры не обрабатывались. Сделал вот так
    Код (Text):
    1. if (strlen($word)<6 || $word !==("ооп") || $word !=="php" || $word !=="html")...
    не канает. А если оставить только одно из них (напр. "php"), то работает. Как правильно организовать условие?
     
  5. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    сделайте для теста:
    Код (PHP):
    1. print strlen("ооп"); 
    Результатом будет 6Почему?
    Да потому что strlen считает байты а не кол-во символов, а русский язык в php имеет 2 байта на символ.
    воспользуйтесь вот этим http://www.php.ru/manual/function.mb-strlen.html
     
  6. zevilz

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

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Насчет этого то я в курсе. Меня интересует в каком виде написать
    Код (Text):
    1. $word !==("ооп") || $word !=="php" || $word !=="html"
    а то в этом виде не работает. Если я ввожу в этом виде, то например "php" отбрасывается и получаю фигу, а если написать только
    Код (Text):
    1. $word !=="php"
    , то выводится результат по запросу "php"
     
  7. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (PHP):
    1. $array = array('ооп','php','html');
    2. if(!in_array($word,$array)) {
    3. }
    4.  
     
  8. zevilz

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

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    Получаю ошибку
    Код (Text):
    1. in_array() expects parameter 2 to be array, string given
     
  9. AndreJM

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

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
     
  10. zevilz

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

    С нами с:
    14 июн 2010
    Сообщения:
    182
    Симпатии:
    0
    не работает...
    если написать в этом же условии:
    Код (Text):
    1. if (strlen($word)<6 || !in_array($word,$array))
    то никаких изменений. Если
    Код (Text):
    1. if (!in_array($word,$array)) {if (strlen($word)<6) {...}}
    , то страница не грузится