|
|
|
| Cheops, помогите, пожалуйста, с поиском по БД.
Нужно реализовать поиск как общий, так и по разным полям.
Совпадения: полное, с любой частью слова
Логика: AND, OR
Регистр: важен, не важен
Есть поля как текстовые, так и числовые. Если можно, то дайте, пожалуйста, пример поиска по трем полям одной таблицы.
input - искать по всем полям однойт аблицы
input1 - искать по такому-то полю
input2 - искать по такому-то полю
input3 - искать по такому-то полю
условия (совпадения, логика, регистр) - одни для всех input'ов | |
|
|
|
|
|
|
|
для: SS
(30.04.2005 в 23:09)
| | 1) Под общим поиском, что подразумевается?
2) Искать планируется при помощи LIKE(RLIKE) или полнотекстовым поиском? http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1991
3) С регистром скорее всего ничего не получится. Все текстовые столбцы в MySQL регистронезависимые, можно конечно их принудительно сделать регистрозависимыми при помощи BINARY, но тут теряется массу преимуществ и в первую очередь скорость.
По ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=1991 приводится ещё три ссылке, которые наверное стоит почитать - это пожалуй лучшие ссылки по поиску в нашем форуме.
Хм... а структура таблицы какая? | |
|
|
|
|
|
|
|
для: cheops
(30.04.2005 в 23:41)
| | Пытаюсь разобраться.
Если одно из полей не заполнено, - как его игнорировать? (всего идет поиск по 10-15 полям).
$query = "SELECT *
FROM coins
WHERE
nominal RLIKE '".$nominal."' AND ruler RLIKE '".$ruler."'
|
| |
|
|
|
|
|
|
|
для: SS
(01.05.2005 в 04:35)
| | Обработку незаполненых полей обычно производят средствами PHP, так как он более чем SQL для этого подходит. Подробности в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=3723 | |
|
|
|
|
|
|
|
для: cheops
(01.05.2005 в 12:39)
| | Что у меня здесь не так?
if(!empty($ruler))
$tmp1 = "ruler RLIKE '$ruler'"; else "";
if(!empty($nominal))
$tmp2 = "nominal RLIKE '$nominal'"; else "";
// Формируем запрос на выборку изображений
$query = "SELECT *
FROM coins
WHERE $tmp1 AND $tmp2";
|
| |
|
|
|
|
|
|
|
для: SS
(07.05.2005 в 12:53)
| | После else отсутствует переменная и присваиваивание
<?php
if(!empty($ruler)) $tmp1 = "ruler RLIKE '$ruler'";
else $tmp1 = "";
if(!empty($nominal)) $tmp2 = "nominal RLIKE '$nominal'";
else $tmp2 = "";
// Формируем запрос на выборку изображений
$query = "SELECT *
FROM coins
WHERE $tmp1 AND $tmp2";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(07.05.2005 в 12:59)
| | Что-то не хочет искать. Ищет, если только заполнены оба поля. Если одно - ругается: You have an error in your SQL syntax. | |
|
|
|
|
|
|
|
для: SS
(07.05.2005 в 14:17)
| | А ну да, и не должен отображаться, так как мы забыли AND, следует изменить код, примерно следующим образом:
<?php
if(!empty($ruler)) $tmp1 = "ruler RLIKE '$ruler'";
else $tmp1 = "";
if(!empty($nominal)) $tmp2 = "nominal RLIKE '$nominal'";
else $tmp2 = "";
if($tmp1 != "" && $tmp2 != "") $and = " AND";
else $and = "";
// Формируем запрос на выборку изображений
$query = "SELECT *
FROM coins
WHERE $tmp1 $and $tmp2";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(08.05.2005 в 00:48)
| | Да, так все работает, спасибо. Однако не самый простой получился запрос для 10-15 полей...
Теперь логика и совпадения на очереди. Если что - звоню :) | |
|
|
|
|
|
|
|
для: cheops
(08.05.2005 в 00:48)
| | Ага, работает...
Теперь наоборот - ищет, если введено только одно слово. На такой конструкции
WHERE $tmp1 $and $tmp2 $and $tmp3 $and $tmp4 $and $tmp5 $and $tmp6 $and $tmp7 $and $tmp8 $and $tmp9 $and $tmp10 $and $tmp11 $and $tmp12 $and $tmp13 $and $tmp14 $and $tmp15 $and $tmp16 $and $tmp17 $and $tmp18 $and $tmp19 $and $tmp20
|
я чуть не свихнулся, пока по буковке не дошел...
Cheops, помогите, плиз!!!!! и ничего у меня не получается с поиском по части слова или целиком. Плохо, когда не знаешь, да еще не понимаешь....
:) | |
|
|
|
|
|
|
|
для: SS
(08.05.2005 в 05:50)
| | Нет, предыдущая конструкция здесь уже не пойдёт, я просто хотел обратить внимание на AND, тут обычно прибегают к флагу
<?php
// Если хоть одно поле уже установлено в запросе
// флаг принимает значение true
$flag = false;
//
if(!empty($ruler))
{
if($flag) $tmp1 = " AND ruler RLIKE '$ruler'";
else
{
$flag = true;
$tmp1 = " ruler RLIKE '$ruler'";
}
}
else $tmp1 = "";
if(!empty($nominal))
{
if($flag) $tmp2 = " AND nominal RLIKE '$nominal'";
else
{
$flag = true;
$tmp2 = " nominal RLIKE '$nominal'";
}
}
else $tmp2 = "";
// и т. д.
// Формируем запрос на выборку изображений
$query = "SELECT *
FROM coins
WHERE $tmp1 $tmp2";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(08.05.2005 в 18:14)
| | Да, так работает, спасибо.
Дальше:
1. В некоторых полях мне нужно вести поиск только по слову целиком, как это сделать? В таком поле может быть несколько слов, но поиск должен вестить по любому из них только целиком. Если ищем "V 2" не должен выводить "IV 21".
2. Поиск в поле по нескольким словам. | |
|
|
|
|
|
|
|
для: SS
(09.05.2005 в 09:39)
| | 1. Вообще началу слова в регулярных выаржениях соответствует специальных символ ^, а концу $, попробуйте искать "^V 2$", это должно исключить срабатывание на "IV 21".
PS Хотя может пробел помешать... но попробуйте всё равно посмотреть.
2. В HTML-форме будет два режима, поиск по выражению и отдельным словам? Нужно будет разбить строку по пробелу на массив, содержащий в каждом элементе , например при помощи функции explode или preg_splint и в цикле foreach по этому массиву формировать SQL-запрос. | |
|
|
|
|
|
|
|
для: cheops
(09.05.2005 в 13:55)
| | 1. Проверил - не работает.
2. Если можно, то лучше небольшой пример, а то так не очень понятно...
Да, два режима - точное соответствие фразе (это сейчас так ищет) и поиск по отдельным словам, но чтобы оба слова были в поле, а не любое из них. | |
|
|
|
|
|
|
|
для: cheops
(09.05.2005 в 13:55)
| | Все еще надеюсь за выходные сделать поиск... :) | |
|
|
|
|
|
|
|
для: SS
(10.05.2005 в 19:47)
| | Не додумался ещё как 1 задачу решить, постраюсь сегодня вечером отписаться. | |
|
|
|
|
|
|
|
для: SS
(10.05.2005 в 19:47)
| | Наверное можено решить обе проблемы, если действительно следовать по пути жёсткого поиска. Пусть из HTML-формы в обработчик поступает строка $_POST['search'] - в которой поисковые слова разделены пробелами. Разбиваем эту фразу на массив слов
<?php
$words = explode(" ", $_POST['search']);
?>
|
после того, как получен массив $words, следует, если в нём более одного элемента формировать и выполнять запрос
<?php
if(count($words)>0)
{
$flag = false;
foreach($words as $line)
{
if($flag)
{
$query .= " nominal RLIKE '^$nominal\$";
$flag = true;
}
else $query .= " AND nominal RLIKE '^$nominal\$";
}
$query = "SELECT * FROM coins ".$query;
$src = mysql_query($query);
if(!$src) exit(mysql_error());
// Далее вывод результатов
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(11.05.2005 в 23:13)
| | Все, замучался. У меня ничего не получается.... Ни с несколькими условиями, ни с одним, может операторы не там ставлю, может еще чего.
Посмотрите, пожалуйста, вложенный файл. Это предыдущий вариант, который нормально работал, до последних заметок.
Как должно быть на самом деле теперь, после добавления новых условий? Буду признателен. | |
|
|
|
|
|
|
|
для: SS
(13.05.2005 в 00:46)
| | Сейчас убегаю, вечером постараюсь посмотреть. | |
|
|
|
|
|
|
|
для: SS
(13.05.2005 в 00:46)
| | Давайте пока на примере keyword отработаем - будет работать или нет, как только всё будет отлажено, можно будет переходить на другие части SQL-запроса. | |
|
|
|
|
|
|
|
для: cheops
(14.05.2005 в 14:18)
| | Нет, не работает:
"You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND keywords RLIKE '^виктория$) ORDER BY date_" | |
|
|
|
|
 5.8 Кб |
|
|
для: SS
(14.05.2005 в 20:12)
| | Есть такое дело, вот новый вариант. | |
|
|
|
|
|
|
|
для: cheops
(14.05.2005 в 23:30)
| | Не работает. Появляется то же самое сообщение. | |
|
|
|
|
|
|
|
для: SS
(15.05.2005 в 17:02)
| | Исправлено, теперь ошибка из-за неопределённых переменных $begin и $pnumber. | |
|
|
|
|
|
|
|
для: cheops
(15.05.2005 в 17:59)
| | Не ругается, но и ничего не находит. Набираю для проверки, конечно, слова, заведомо присутствующие. Нет результатов как для поиска по одному слову, так и по нескольким словам. | |
|
|
|
|
|
|
|
для: SS
(15.05.2005 в 19:06)
| | Выведите оперетором echo результирующий SQL-запрос, как он выглядит?
| |
|
|
|
|
|
|
|
для: cheops
(16.05.2005 в 01:17)
| | SELECT * FROM coins WHERE ( keywords RLIKE '^виктория$' AND keywords RLIKE '^венок$' ) ORDER BY date_start, RIC, RIC_n, RIC_add LIMIT 0, 10 | |
|
|
|
|
|
|
|
для: SS
(16.05.2005 в 22:02)
| | Скорее всего не нравятся ограничители ^ и $ - попробуйте их пока убрать. | |
|
|
|
|
|
|
|
для: cheops
(18.05.2005 в 00:17)
| | Убрал. Поиск и выборка производятся правильно. Но нужно, чтобы искало слово целиком. | |
|
|
|
|
|
|
|
для: SS
(19.05.2005 в 22:22)
| | Вместо ^ и $ подставьте [[:<:]] и [[:>:]], соответственно. | |
|
|
|
|
|
|
|
для: cheops
(20.05.2005 в 00:45)
| | Да, супер, работает! Буду пробовать дальше с остальными полями. Если не получиттся что - напишу. | |
|
|
|