Как сделать SQL-запрос, используя одинаковые и несколько неупорядоченных значений

Я искал ответы здесь, в сообществе, но не смог найти ничего конкретного. У меня есть эта страница, где я могу искать по именам пользователей, ранее зарегистрированных в моей базе данных MySQL. В настоящее время я использую следующие утверждения:

PHP:$value = str_replace(' ', '%', $search);

SQL:"select * from user where name like '%".$value."%' order by name asc;"

Переменная $ поиск берется из формы поиска на этой же странице. (Приведенный выше код позволяет мне делать запросы с более чем одним значением). Например, учитывая пользователя с именем Луис Энрике да Силва, если я ищу Луис, Луис Энрике или даже Луис Сильва, этот код будет работать отлично, перечисляя этого пользователя.

Но моя проблема в том, что если я ищу имя не по порядку, например Сильва Энрике или Сильва Луис, пользователь не будет указан. Как я мог просто включить этот обратный поиск?

Обратите внимание, что с помощью этого кода я могу искать отдельные значения, поэтому мне нужно делать запросы с использованием неупорядоченных значений!

Можете ли вы добавить структуру таблицы с двумя или тремя примерами данных. Таким образом, вам нужно указать Луис Энрике, Луис Сильва при поиске Сильва Энрике или Сильва Луис. Это то, что ты имеешь в виду?

Sinto 09.06.2018 05:55

@Sinto. Это именно то, что мне нужно. Если есть пользователь Стив Джобс, я хочу перечислить его, выполнив поиск Джобса Стива.

Guilhermy 09.06.2018 06:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
113
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

PHP:

$value = str_replace(" ", "%' and name like '%", $search);

Итак, используя каждое слово отдельно. Но небезопасно: инъекция sql.

Использование preg_replace обслуживает последовательные пробелы:

$value = preg_replace('/\s+/', "%' and name like '%", $search);

Спасибо, что ответил, чувак. Я пробовал ваш код, но он не работал даже при поиске упорядоченных значений. Хорошо, решение, защищенное от SQL-инъекций, тоже подойдет.

Guilhermy 09.06.2018 06:19

Странно, но другой ответ такой же, как у меня. Думаю, они правы.

Gerard H. Pille 09.06.2018 06:23

Я просто попробовал еще раз разместить поле имени перед лайком. Код стал $ value = str_replace («», «%» и назовите его как «%», $ search). Он работает отлично, как и другой правильный ответ.

Guilhermy 09.06.2018 06:37

Хорошо. Как я могу сделать этот код защищенным от SQL-инъекций?

Guilhermy 09.06.2018 06:39

Я бы поставил тест перед проверкой, что ввод содержит только буквы и пробелы. Также замена последовательных пробелов одним (не имеет ничего общего с инъекцией).

Gerard H. Pille 09.06.2018 06:44

В настоящее время я использую функцию обрезки, поэтому до / после строки поиска нет последовательного пробела.

Guilhermy 09.06.2018 06:45

Не достаточно. Проверить замену регулярного выражения?

Gerard H. Pille 09.06.2018 06:47

Я не знал регулярных выражений до этого момента. Руководство по PHP предлагает '$ str = preg_replace (' / \ s \ s + / ',' ', $ str)', чтобы избежать двух последовательных пробелов. Вы об этом говорите?

Guilhermy 09.06.2018 07:12

Полагаю, что да, но комментировать это - рискованное дело. Я попробую еще раз изменить свой ответ, теперь, когда у меня есть подходящая клавиатура.

Gerard H. Pille 09.06.2018 10:28

Теперь я понял, что вы не заменяли отдельные пробелы.

Gerard H. Pille 09.06.2018 10:43

Я думаю, что ваш код заменит каждое пробел на «%» и назовите его как «%». Сначала я убираю двойные пробелы, а затем пробелы между словами заменяю на "% и ...". Стало так: str_replace ("", "% 'и имя как'%", preg_replace ('/ \ s \ s + /', '', trim ($ search));

Guilhermy 10.06.2018 04:53

Вводить неанитизированный ввод пользователя непосредственно в запрос - плохая идея, потому что кто-то может выполнить свои собственные запросы и поставить под угрозу ваши данные / безопасность. Загляните в подготовленные операторы: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php.

Что касается вашего вопроса, вы можете взять предоставленный поиск, например: Luiz Henrique, разбить его на пробелы, чтобы получить «Luiz» и «Henrique», а затем создать оператор, который выглядит примерно так:

WHERE name LIKE '%Luiz%' AND name LIKE '%Henrique%'

Таким образом, вы просто продолжаете добавлять операторы ANDLIKE для каждого отдельного компонента.

Спасибо за ответы. Ваш код работает с условием или же, поэтому в списке будет любой пользователь, содержащий Энрике или Луис. Мне нужна проверка а также, для более точного поиска.

Guilhermy 09.06.2018 06:09
Ответ принят как подходящий
$search = 'Jobs Steve';
$search = mysql_real_escape_string($search);
$where_condition = '';
$search_arr = explode(' ', $search);
foreach($search_arr as $key => $name) {
    if ($where_condition != '') $where_condition .= ' AND ';
  $where_condition .= " name LIKE '%$name%' ";
}

$sql = "SELECT * FROM user WHERE $where_condition ORDER BY name ASC;";

$sql будет похож на SELECT * FROM user WHERE name LIKE '%Jobs%' AND name LIKE '%Steve%' ORDER BY name ASC;

Думал, вам нужно «И»?

Gerard H. Pille 09.06.2018 06:25

Да, чувак! Это действительно отлично работает. Я только изменил ИЛИ ЖЕ на А ТАКЖЕ, для более точного поиска. Большое спасибо! Один вопрос: этот код защищен от SQL-инъекций? Когда мы говорим о такой профилактике, я новичок.

Guilhermy 09.06.2018 06:27

Я не уверен в этом, потому что, если вы объединяете некоторые значения в запрос, всегда есть вероятность инъекции.

Sinto 09.06.2018 06:38

@Sinto, другой ответ предлагал такой код, как '$ value = str_replace ("", "%' и имя, подобное '%", $ search)'. Есть ли отличия от твоего?

Guilhermy 09.06.2018 06:40
and name like Я думаю, это будет неправильно, потому что, если вы используете AND, в вашем ключе поиска должны быть Jobs и Steve, Jobs xxxx или xxxx Steve не будет в вашем списке.
Sinto 09.06.2018 06:46

@Sinto. Это именно то, что мне нужно. Я хочу перечислить только пользователей, у которых есть оба значения. Хорошо, я изучу эти функции предотвращения. Спасибо.

Guilhermy 09.06.2018 07:00

Это канал истории? Почему мы извлекаем урок из устаревшего кода?

Strawberry 09.06.2018 08:44

@Strawberry: Я думаю, это не так ..! Просто добавил несколько объяснений, когда он спросил об этом. Думаю, неплохой. Это вызвало голосование "против"?

Sinto 09.06.2018 09:01

Конечно . Не рекомендуется продвигать архаичный, небезопасный и устаревший код. Отсюда уныние.

Strawberry 09.06.2018 09:06

Теперь это безопасно?

Sinto 09.06.2018 09:07

Другие вопросы по теме