@sacred1

Как лучше организовать поиск по базе данных?

Здравствуйте!

Есть input c типом "text"(то бишь поле поиска данных).В самой базе данных 1 таблица с 3 столбцами (Фамилия,Имя,Отчество).

Как лучше организовать sql запрос к этой бд так,чтобы те данные которые ввел пользователь(прим.- Пупкин Вася Алексеевич),можно было разделить на фамилию..имя..и отчество,чтобы можно было в дальнейшим по отдельности сравнить данные. То есть поиск например по Пупкину в таблице Фамилия,такой пользователь есть значит идет следующие условие..уже имя Вася находим в таблице эта имя,если находим такого Васю Пупкина,то выводим его.Вопрос стоит,в том что возможно ли это сделать?ведь все ФИО идет одной переменной,если да,то как это сделать?...больше всего конечно интересует синтаксис..

Сейчас собственно запрос к бд такой :
$sql = "SELECT name,patronymic,surname FROM peoples WHERE name LIKE '$text_search%' OR surname LIKE '$text_search%'";

Но как вы сами понимаете эта никуда не годится,т.к как работает только если вводить данные по отдельности в поле поиска.

Заранее большое спасибо!
  • Вопрос задан
  • 4440 просмотров
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg
Любые ответы на любые вопросы
Начнем с того, что этот запрос - потенциальная дыра для SQ -инъекций.
Далее, попробуйте искать внутри конкатенации:
select ... from peoples where name||' '||partonymic||' '||surname like '%$text_search%';

Предварительно нужно убрать из $text_search все знаки, кроме букв алфавита, а все пробелы заменить на ровно один пробел.
А чтобы защититься от SQL-инъекции, вы не должны никогда никакой запрос строить путем конкатенации.
Ответ написан
Terminaft
@Terminaft
Попробуйте вот так:
$text_search = 'Vasily Pupkin Alexeevich';
$arr_split = preg_split('/\W+/', $text_search);
$search = implode(', ', $arr_split);

$sql = "SELECT .. FROM .. WHERE name IN($search) OR surname IN($search) OR patronymic IN($search)";

Регулярку можно просто на пробел поставить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽