Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Поиск


Автор: essan 17.4.2006, 10:27
Подскажите плиз... в данном случае ищет буквально по одной букве, а как сделать правильно чтобы по полному совпадению слова, но не выражения!

бла-бла-бла
<input type="text" name="searchfor" value="<?php echo $searchfor ?>"> <input type="submit" value="Поиск"><br>
бла-бла-бла
$sql_query = "SELECT * FROM movie WHERE (title LIKE '%$searchfor%' and catalog LIKE '%$ser%')";
бла-бла-бла

Если в таблице текст: отпетые мошенники
Например чтоб результат выдавался по запросу только либо если в строке поиска было указанно отпетые или мошенники
а вааще я так думаю, что окончания могут быть разные, то правильней бы сделать по совпадению в слове например пяти букв  

Автор: Darhazer 17.4.2006, 10:33
... 

Автор: madFobos 17.4.2006, 11:02
Ну можно регулярные выражения использовать еще. Хотя тут надо просто перед поиском подготовить твою фразу, напрмер (я не буду описывать всякие проверки на ' и пр. попытки взлома юных хакеров, потому что обычно для этих целей PEAR:smileB использую):
Код


$searchfor = preg_replace("/\s/", "','", trim($searchfor));
$searchfor = preg_repalce("/^|$/", "'", $searchfor);
//Должно получиться что-то вроде "'Отпетые', 'Мошенники'"
//И теперь после бла-бла-бла :)

$sql_query = "SELECT * FROM movie WHERE title LIKE (".$searchfor.") and catalog LIKE '%$ser%'";


Не тестил, но идея такая. Если же тебе по окончаниям надо, то напиши какую нибудь функцию, которая бы эти окончания анализировала и убирала из слов, тогда ты можешь сначала разбить с помощью preg_split("/\s/", ...) строку на составляющие слова, затем применить к каждому элементу функцию обрезания окончаний (с помощью, например array_map) и далее все слить опять в строку. 

Автор: essan 17.4.2006, 11:53
Спасибо желание помочь!
$searchfor стала равна 'Отпетые','Мошенники' 

теперь ищет слово полностью :-) но только если оно одно в таблице
если в таблице два слова, то по запросе одного слова из них, выдается нулевой результат.
А если в строке поиска задать два слова например Отпетые мошенники, то тогда выдает ошибку... mysql_numrows(): supplied argument is not a valid MySQL 

у меня дальше вот такой код:
$result = mysql_query($sql_query);
$results = mysql_numrows($result);
echo "По запросу <em>$searchfor</em> найдено видеосюжетов: $results";
if($results!='0') {
echo "
$lang[body]
<LINK rel=stylesheet type=text/css href=phorum/styles.css><table width=\"100%\" border=\"0\" class=\"ramka\" cellspacing=\"1\" cellpadding=\"0\">";
while ($rows = mysql_fetch_array($result))
{
echo "<tr class=back><td><img src=phorum/avat/$rows[id].jpg alt=\"$rows[title]\"></td><td>$rows[title]</td><td>$rows[description]</td><td>$rows[actor]</td><td>$rows[language]</td><td>$rows[format]</td><td>$rows[amount]</td><td>$rows[money]</td></tr>";
}
echo "</table>";
}
} 

Автор: madFobos 19.4.2006, 07:37
Точно, я ошибся слегка, должно быть так:
Код

$searchfor = preg_replace("/\s/", "|", trim($searchfor));
//Должно получиться что-то вроде "'Отпетые', 'Мошенники'"
//И теперь после бла-бла-бла :)
$sql_query = "SELECT * FROM movie WHERE title REGEXP '$searchfor' and catalog LIKE '%$ser%'";


Не факт, что это тоже будет работать, но идея такая, т.е. у тебя будет получаться "Отпетые|Мошенники", символ | означает или в регулярных выражениях. 

Автор: essan 20.4.2006, 06:26
Замучался я совсем. Подскажите, а лучше поправьте. Мне необходимо чтобы поиск находил полное соответствие(буква в букву) слова. Именно слова а не всего содержимого ячейки. Например в поле есть ячека где записано: Улица разбитых фонарей. Надо так чтоб поиск нашел в случае если в строке поиска было набрано хотя бы одно слово, полностью совпадавшее. Например если набрать: Улица фонариков либо Улицы фонарей, то результат должен быть, так как есть полное соответствие в словах Улица и фонарей, а если слово обрезанное или неправильное окончание, то результата не должно быть, как например Улиц или фон. 

$searchfor = preg_replace("/\s/", "|", trim($searchfor));
$searchfor = preg_replace("/^|$/", "'", $searchfor);

if($searchfor!=''){
if ($ser!=actor) {$sql_query = "SELECT * FROM movie WHERE title REGEXP (".$searchfor.") and catalog LIKE '%$ser%'";}
else {$sql_query = "SELECT * FROM movie WHERE actor LIKE (".$searchfor.")";}

$result = mysql_query($sql_query);
$results = mysql_numrows($result);


while ($rows = mysql_fetch_array($result))
{
//выводит найденное поле
} 

Автор: Medwoodu 20.4.2006, 15:52
прошу прощения, но по этим темам куча статей, например _http://phpclub.ru/detail/article/mysql_search посмотрите на дату статьи smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)