У меня есть таблица пользователей в 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 spacearray_walk($split_words,"addPercentage");
$query->execute($split_words);
}else{
$query->execute();
}
$result = $query->rowCount();
echo $result;
function addPercentage(&$value,$key)
{
$value = "%".$value."%" ;
}
?>