#mysql #sql #sql-like #autosuggest
#mysql #sql #sql-подобный #автоматическое предложение
Вопрос:
У меня есть таблица магазинов. Некоторые поля — это имя, веб-сайт, описание и т.д.
У меня есть панель поиска с автоматическим предложением. Я хочу сопоставить входные данные и отобразить некоторые связанные хранилища. Прямо сейчас он работает идеально, сопоставляя пользовательский ввод с оператором LIKE для name.
$input = $_GET["q"];
$data = array();
// query your DataBase here looking for a match to $input
include_once "scripts/connect_to_mysql.php";
$query = mysql_query("SELECT name,linklabel,permalink FROM tblMerchants WHERE name LIKE '%$input%'");
while ($row = mysql_fetch_assoc($query)) {
$json = array();
$json['name'] = ucwords($row['linklabel']);
$json['value'] = $row['permalink'];
$data[] = $json;
}
echo json_encode($data);
Тем не менее, я пытаюсь сопоставить вводимые пользователем данные с несколькими полями в таблице. Я пытаюсь выполнить следующее, и это не работает:
SELECT linklabel,permalink
FROM tblMerchants
WHERE name LIKE '%$input%'
OR website LIKE '%$input%'
OR description LIKE '%$input%'
Пытаюсь разобраться в этом. Приветствуется любой ввод!
Извините, должен был упомянуть об этом. Не работает, я имею в виду, что при использовании оператора multiple LIKE он по-прежнему возвращает только результаты, похожие на ‘name’
Комментарии:
1. Не работает, вы имеете в виду, что получаете ошибку или просто нет результатов?
2. совет: я не знаю, является ли это вашим рабочим кодом или просто примером, но не забудьте очистить свой ввод, прежде чем использовать его в запросе. Ваш код уязвим для sql-инъекций. Вы могли бы использовать mysql_real_escape_string()
3. Извините, должен был упомянуть об этом. Не работает, я имею в виду, что при использовании оператора multiple LIKE он по-прежнему возвращает только результаты, похожие на ‘name’
4. Действительно ли запрос возвращает что-либо для случаев, когда вы используете другое поле, отличное
name
от? Я имею в виду, просто используя один подобныйwebsite
, например. Попробуйте уточнить, что вы имеете в видуit isn't working
.5. Похоже, что когда я сопоставляю однословный запрос с однословным полем, он работает. Но как только я пытаюсь сопоставить однословный запрос с полем из нескольких слов, таким как description, он не работает. Кроме того, когда я пытаюсь сопоставить запрос из двух слов с полем из двух слов, которое, как я знаю, существует, оно также не показывает никаких результатов. Может ли это быть проблемой с типами баз данных для этих полей? Или, возможно, сопоставление. Это varchar и text. Сопоставление — latin1_swedish_ci . Кроме того, когда я пытаюсь использовать mysql_real_escape_string() в строке запроса, я не получаю результатов поиска?? Может быть, я должен попробовать FULLTEXT
Ответ №1:
like
s и and
s, как известно, плохо сочетаются друг с другом.
Используйте круглые скобки для уточнения, например
SELECT linklabel,permalink
FROM tblMerchants WHERE
(name LIKE '%$input%') OR
(website LIKE '%$input%') OR
(description LIKE '%$input%')
В противном случае он может пытаться угадать и делать такие вещи, как
SELECT linklabel,permalink
FROM tblMerchants WHERE
name LIKE ('%$input%' OR
website LIKE '%$input%') OR
(description LIKE '%$input%')
Я не знаю, является ли приведенное выше фактическим запросом, который он попробовал бы, но в основном способ их объединения / объединения может быть «неопределенным» и подлежит интерпретации.
Ответ №2:
Код в порядке (ну, за исключением опасности SQL-инъекций и того факта, что он будет быстро замедляться). Пожалуйста, покажите примеры данных, содержащих строки, которые, по вашему мнению, должны быть возвращены, но не возвращаются при выполнении этого запроса.
Ответ №3:
Попробуйте это:
"SELECT linklabel, permalink FROM tblMerchants WHERE
name like '%$input%'
UNION SELECT linklabel, permalink FROM tblMerchants WHERE
description like '%$input%'
UNION SELECT linklabel, permalink FROM tblMerchants WHERE
website like '%$input%'";
Это должно сработать.