Mysql несколько, КАК не работает

#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%'";
  

Это должно сработать.