Пишу простенький движок поиска по сайту. Получаю поисковой запрос постом в переменной $search_word: Код (Text): $query = trim($_REQUEST["search_word"]); $reg = "/\s(под|много|что|когда|где|или|которые|поэтому|все|будем|как)\s/im"; $query = preg_replace($reg,'',$query); $words = explode(" ",$query); $i = 0; $keywords = ""; foreach ($words as $word) { $word = trim($word); echo "word" . $word; if (strlen($word)<6) { unset($word); } else { if (strlen($word)>8) { $reg = "/(ый|ой|ая|ое|ые|ому|а|о|у|е|ого|ему|и|ство|ых|ох|ия|ий|ь|я|он|ют|ат)$/i"; $word = preg_replace($reg,'',$word); $keywords[$i]=$word; $i++; } else { $keywords[$i]=$word; $i++; } } } if (count($keywords)>0) { $result_search = mysql_query ("SELECT * FROM videos WHERE (`text` LIKE '%".implode($keywords, "%' OR `text` LIKE '%")."%')"); $myrow_search = mysql_fetch_array ($result_search); do { printf ("<p>%s</p>",$myrow_search["title"]); } while ($myrow_search = mysql_fetch_array ($result_search)); } else { echo "Ничего не найдено";} При поиске одного слова или нескольких слов, хотя бы одно из которых реально существует, выводится результат. При поиске длинного слова, которого нет в базе, не выводится вообще ничего, даже и сообщения, что ничего не найдено. При поиске короткого слова (2-3 буквы) вылазит ошибка Код (Text): implode(): Invalid arguments passed и выводятся вообще все статьи из базы, а количество строк в массиве $keywords = 1, хотя строка с коротким значением не должна попасть в массив $keywords. Если я ставлю условие Код (Text): if (count($keywords)>1) , то поиск работает без проблем, но только при поиске фразы хотя бы из 2х слов. Где я накосячил?
Код (Text): $keywords = ""; print count($keywords); Код (Text): 1 лечится заменой $keywords = array();
Еще возник вопросик. Согласно скрипту, из поиска удаляются все слова менее 3 символов (русский язык) и менее 6 символов (английский язык), но мне необходимо чтобы некоторые аббривеатуры не обрабатывались. Сделал вот так Код (Text): if (strlen($word)<6 || $word !==("ооп") || $word !=="php" || $word !=="html")... не канает. А если оставить только одно из них (напр. "php"), то работает. Как правильно организовать условие?
сделайте для теста: Код (PHP): print strlen("ооп"); Результатом будет 6Почему? Да потому что strlen считает байты а не кол-во символов, а русский язык в php имеет 2 байта на символ. воспользуйтесь вот этим http://www.php.ru/manual/function.mb-strlen.html
Насчет этого то я в курсе. Меня интересует в каком виде написать Код (Text): $word !==("ооп") || $word !=="php" || $word !=="html" а то в этом виде не работает. Если я ввожу в этом виде, то например "php" отбрасывается и получаю фигу, а если написать только Код (Text): $word !=="php" , то выводится результат по запросу "php"
не работает... если написать в этом же условии: Код (Text): if (strlen($word)<6 || !in_array($word,$array)) то никаких изменений. Если Код (Text): if (!in_array($word,$array)) {if (strlen($word)<6) {...}} , то страница не грузится