У меня есть таблица пользователей в MySQL и вам нужен поиск по имени. Сейчас у меня есть следующий код:
<?php $search = @$_GET['q']; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $query = $con->prepare('SELECT * FROM `users` WHERE name LIKE ?'); $query->execute(array('%'.$search.'%')); $result = $query->rowCount(); echo $result; ?>
Проблема в том, что я хочу иметь несколько ключевых слов. Скажем, кто-то типа «Здесь должно быть красивое имя человека», тогда он будет искать «здесь», «должен», «быть» и т. Д. И отображать результаты для каждой строки, где слова находятся в столбце «имя». Я искал в Интернете и читал, что можно сделать «ИЛИ имя НРАВИТСЯ?» столько раз, сколько ключевых слов, но я не мог заставить его работать, и я не уверен, что он достаточно оптимизирован с ~ 20 словами (если они ищут с таким количеством слов). Если он будет использоваться, вы можете помочь мне изменить свой код, чтобы он искал каждое слово самостоятельно?
Спасибо!
РЕДАКТИРОВАТЬ:
Я смог решить эту проблему одним парнем, который опубликовал эту тему. Для меня работает следующее решение:
<?php $search = isset($_POST['q']) ? $_POST['q'] : ''; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $split_words = explode(" ", $search); if(count($split_words) > 0) { $sql = "SELECT * FROM `users` WHERE "; for($i=0 ; $i < count($split_words); $i++){ $sql .= " name LIKE ? OR"; } $sql = substr($sql , 0, -3); //Remove last 3 characters OR with space array_walk($split_words, "addPercentage"); $query = $con->prepare($sql); $query->execute($split_words); } function addPercentage(&$value, $key) { $value = '%'.$value.'%'; } ?>
Вы не должны использовать @ для молчания ошибок, это плохая практика, проверьте, установлено ли значение. Приведенный ниже пример должен работать, но результаты могут быть не совсем релевантными.
$search = isset($_GET['q']) ? $_GET['q'] : ''; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $words = explode(' ', $search); $words_condition = array(); $arguments = array(); foreach ($words as $word) { $words_condition[] = 'name LIKE ?'; $arguments[] = '%'.$word.'%'; } $query = $con->prepare('SELECT * FROM `users` WHERE '.implode(' OR ', $words_condition)); $query->execute($arguments); $result = $query->rowCount(); echo $result;
$words = explode(" ", $search); $i = 0; while($words[i] != null) { //Query where name LIKE words[i] }
Пожалуйста, проверьте приведенный ниже код.
<?php $search = isset($_GET['q']) ? $_GET['q'] : ''; $search = strtoupper($search); $search = strip_tags($search); $search = trim($search); $split_words = explode(" ", $search); $query = "SELECT * FROM `users`"; if(count($split_words) > 0){ $query .= " WHERE " for($i=0 ; $i < $split_words; $i++){ $query .= " name LIKE ? OR "; } $query = substr($query , 0, -3); //Remove last 3 characters OR with space array_walk($split_words,"addPercentage"); $query->execute($split_words); }else{ $query->execute(); } $result = $query->rowCount(); echo $result; function addPercentage(&$value,$key) { $value = "%".$value."%" ; } ?>