|
|
|
| Здравствуйте уважаемые программисты, нужен ваш совет...
допустим есть бд
contacts CREATE TABLE `contacts` (
`id_contact` int(11) NOT NULL auto_increment,
`name` varchar(30) NOT NULL,
`client` tinytext NOT NULL,
`street` tinytext NOT NULL,
`email` tinytext NOT NULL,
`Phone` tinytext NOT NULL,
`pos` smallint(3) NOT NULL default '0',
`hide` enum('show','hide') NOT NULL default 'show',
`id_catalog` int(8) NOT NULL default '0',
PRIMARY KEY (`id_contact`)
) ENGINE=MyISAM AUTO_INCREMENT=83 DEFAULT CHARSET=cp1251
|
как бы корректно организовать поиск в такой бд?
чтобы допустим вводишь имя клиента или улицу или другое значение или несколько значений и чтобы строилась таблица удовлетворяющая этим условиям... | |
|
|
|
|
|
|
|
для: lightning.say
(19.11.2010 в 18:56)
| | Можно так сделать.
Пользователь ввел в форму несколько слов.
1. Разбить строку по пробелу и дальше работать с каждым словом.
2. Проверяем через регулярные выражения, есть ли в слове @, есть - перед нами email, значит, запрос будет типа SELECT * FROM contacts WHERE email LIKE '%asd@com.ua%'
3. Дальше проверяем, состоит ли слово только из цифр, (),- - проверяем на те символы, которые могут встречаться в телефоне, поиск проводится в поле, где хранятся телефоны.
4. Если у нас буквы, цифры, другие символы - значит пользователь ввел name,client или street, ищем по этим полям. Если на полях поставить полнотекстовый поиск, запрос будет: WHERE MATCH ... AGAINST.
Честно скажу, чего-то мне кажется, что мой вариант не очень... Лучше бы вы под полем формы сделали типа подсказку-шаблон для пользователя:
"Если вы хотите найти пользователя в нашей базе, впишите данные в таком порядке:
Иванов Иван Петрович 123-123-123 asd@asd.ua"
Но все равно найдутся такие, которые заполнят, как им нравится :) | |
|
|
|
|
|
|
|
для: Лена
(20.11.2010 в 01:00)
| | а если несколько полей ввода сделать одно для имени, одно для телефона и т.д.?? | |
|
|
|
|
|
|
|
для: lightning.say
(20.11.2010 в 03:33)
| | Если несколько, тогда после отправки формы на сервер нужно проверять, какие поля заполнены.
Если поле заполнено, мы "долепливаем" к основному запросу кусочек, который отвечает за поиск значения в определенном поле.
Смотрите.
Запрос будет выглядеть так(при условии,если хотя бы одно поле формы заполнено):
SELECT * FROM contacts WHERE $searh;
$searh - условие, которое учитывает все заполненные поля и будет производить по ним поиск.
<?php
//если заполнено имя
if(!empty($_POST['name']))
$where[] = "name LIKE '%" . mysql_real_escape_string($_POST['name']) . "%'";
//если заполнен телефон
if(!empty($_POST['phone']))
$where[] = "phone LIKE '%" . mysql_real_escape_string($_POST['phone']) . "%'";
//склеиваем условие запроса
$search = implode(" AND ",$where);
SELECT * FROM contacts WHERE $searh;
?>
|
| |
|
|
|