Я искал ответы здесь, в сообществе, но не смог найти ничего конкретного. У меня есть эта страница, где я могу искать по именам пользователей, ранее зарегистрированных в моей базе данных MySQL. В настоящее время я использую следующие утверждения:
PHP:$value = str_replace(' ', '%', $search);
SQL:"select * from user where name like '%".$value."%' order by name asc;"
Переменная $ поиск берется из формы поиска на этой же странице. (Приведенный выше код позволяет мне делать запросы с более чем одним значением). Например, учитывая пользователя с именем Луис Энрике да Силва, если я ищу Луис, Луис Энрике или даже Луис Сильва, этот код будет работать отлично, перечисляя этого пользователя.
Но моя проблема в том, что если я ищу имя не по порядку, например Сильва Энрике или Сильва Луис, пользователь не будет указан. Как я мог просто включить этот обратный поиск?
Обратите внимание, что с помощью этого кода я могу искать отдельные значения, поэтому мне нужно делать запросы с использованием неупорядоченных значений!
@Sinto. Это именно то, что мне нужно. Если есть пользователь Стив Джобс, я хочу перечислить его, выполнив поиск Джобса Стива.






PHP:
$value = str_replace(" ", "%' and name like '%", $search);
Итак, используя каждое слово отдельно. Но небезопасно: инъекция sql.
Использование preg_replace обслуживает последовательные пробелы:
$value = preg_replace('/\s+/', "%' and name like '%", $search);
Спасибо, что ответил, чувак. Я пробовал ваш код, но он не работал даже при поиске упорядоченных значений. Хорошо, решение, защищенное от SQL-инъекций, тоже подойдет.
Странно, но другой ответ такой же, как у меня. Думаю, они правы.
Я просто попробовал еще раз разместить поле имени перед лайком. Код стал $ value = str_replace («», «%» и назовите его как «%», $ search). Он работает отлично, как и другой правильный ответ.
Хорошо. Как я могу сделать этот код защищенным от SQL-инъекций?
Я бы поставил тест перед проверкой, что ввод содержит только буквы и пробелы. Также замена последовательных пробелов одним (не имеет ничего общего с инъекцией).
В настоящее время я использую функцию обрезки, поэтому до / после строки поиска нет последовательного пробела.
Не достаточно. Проверить замену регулярного выражения?
Я не знал регулярных выражений до этого момента. Руководство по PHP предлагает '$ str = preg_replace (' / \ s \ s + / ',' ', $ str)', чтобы избежать двух последовательных пробелов. Вы об этом говорите?
Полагаю, что да, но комментировать это - рискованное дело. Я попробую еще раз изменить свой ответ, теперь, когда у меня есть подходящая клавиатура.
Теперь я понял, что вы не заменяли отдельные пробелы.
Я думаю, что ваш код заменит каждое пробел на «%» и назовите его как «%». Сначала я убираю двойные пробелы, а затем пробелы между словами заменяю на "% и ...". Стало так: str_replace ("", "% 'и имя как'%", preg_replace ('/ \ s \ s + /', '', trim ($ search));
Вводить неанитизированный ввод пользователя непосредственно в запрос - плохая идея, потому что кто-то может выполнить свои собственные запросы и поставить под угрозу ваши данные / безопасность. Загляните в подготовленные операторы: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php.
Что касается вашего вопроса, вы можете взять предоставленный поиск, например: Luiz Henrique, разбить его на пробелы, чтобы получить «Luiz» и «Henrique», а затем создать оператор, который выглядит примерно так:
WHERE name LIKE '%Luiz%' AND name LIKE '%Henrique%'
Таким образом, вы просто продолжаете добавлять операторы ANDLIKE для каждого отдельного компонента.
Спасибо за ответы. Ваш код работает с условием или же, поэтому в списке будет любой пользователь, содержащий Энрике или Луис. Мне нужна проверка а также, для более точного поиска.
$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;
Думал, вам нужно «И»?
Да, чувак! Это действительно отлично работает. Я только изменил ИЛИ ЖЕ на А ТАКЖЕ, для более точного поиска. Большое спасибо! Один вопрос: этот код защищен от SQL-инъекций? Когда мы говорим о такой профилактике, я новичок.
Я не уверен в этом, потому что, если вы объединяете некоторые значения в запрос, всегда есть вероятность инъекции.
@Sinto, другой ответ предлагал такой код, как '$ value = str_replace ("", "%' и имя, подобное '%", $ search)'. Есть ли отличия от твоего?
and name like Я думаю, это будет неправильно, потому что, если вы используете AND, в вашем ключе поиска должны быть Jobs и Steve, Jobs xxxx или xxxx Steve не будет в вашем списке.
@Sinto. Это именно то, что мне нужно. Я хочу перечислить только пользователей, у которых есть оба значения. Хорошо, я изучу эти функции предотвращения. Спасибо.
Это канал истории? Почему мы извлекаем урок из устаревшего кода?
@Strawberry: Я думаю, это не так ..! Просто добавил несколько объяснений, когда он спросил об этом. Думаю, неплохой. Это вызвало голосование "против"?
Конечно . Не рекомендуется продвигать архаичный, небезопасный и устаревший код. Отсюда уныние.
Теперь это безопасно?
Можете ли вы добавить структуру таблицы с двумя или тремя примерами данных. Таким образом, вам нужно указать Луис Энрике, Луис Сильва при поиске Сильва Энрике или Сильва Луис. Это то, что ты имеешь в виду?