возникли проблемы с поиском в базе данных mysql

#php #mysql #arrays #search

#php #mysql #массивы #Поиск

Вопрос:

У меня есть два вопроса, касающиеся моего скрипта и поиска. У меня есть этот скрипт:

 $searchTerms = explode(' ', $varSearch);
$searchTermBits = array();
foreach($searchTerms as $term){
    $term = trim($term);
    if(!empty($term)){
        $searchTermBits[] = "column1 LIKE '%".$term."%'";
    }
}

$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits)."");
  

У меня есть столбец 1 с именем данных «скалолазание здесь»

Если я введу «скалолазание», эти данные отобразятся. Это идеально, но если я просто наберу «Rocks», это не отобразится. Почему это?

Кроме того, как бы мне добавить еще один «column2» для ключевого слова для поиска?

Спасибо!

Ответ №1:

Поиск в этой строке «rocks» не работает, потому что строка «rocks» не существует в данных. Глядя на это, это имеет смысл для вас, потому что вы знаете, что множественное число «rock» — это «rocks», но база данных этого не знает.

Один из вариантов, который вы могли бы попробовать, это удалить S из поисковых запросов, но при этом вы столкнетесь с другими проблемами — например, множественное число «berry» — это «ягоды», и если вы удалите S, вы будете искать «berrie», что не приведет вас дальше.

Вы можете добавить больше условий поиска, добавив больше строк, таких как

 $searchTermBits[] = "column1 LIKE '%".$term."%'";
  

и замена ".$term." на то, что вы хотите найти. Например,

 $searchTermBits[] = "column1 LIKE '%climb%'";
  

Следует отметить еще одну вещь … как написано, ваш код подвержен SQL-инъекции. Возьмем это для примера… Что делать, если посетитель сайта вводит поисковый запрос '; DROP TABLE tablename; У вас только что были удалены ваши данные.

Что вам следует сделать, так это изменить searchTermBits[] строку, чтобы она выглядела как:

 $searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'";
  

Это предотвратит повреждение ваших данных любой гадостью.

Комментарии:

1. '; drop table' Бит не соответствует истине для mysql_query, потому что эта функция позволит выполнить 1 и только 1 запрос. Однако у вас могут возникнуть проблемы с ' or (1=1) UNION select password, username, email from users -- запросами, в которых конфиденциальные данные передаются на экран.

2. Я рассмотрел sql-инъекцию. Я не показываю это здесь из-за простоты. Но все равно спасибо, что упомянули об этом. Кроме того, мне не нравится просто использовать «climb», потому что это будет динамическая страница, на которой я буду использовать несколько слов и иметь несколько слов в моей базе данных. Но я пытаюсь получить его, чтобы он показывал rock при поиске rocks, как бы я мог создать такой скрипт?

3. Строка «climb» была предназначена в качестве примера. У вас может быть столько строк $searchTermBits[] = «…», сколько вам нравится — вы создаете массив условий. Таким образом, вы могли бы добавить $ term1, $ term2, $ term3 и т.д.

Ответ №2:

Предполагая, что предоставленные вами данные точны, они не должны совпадать, потому что вы используете «Rocks», а слово в строке — «rock». По умолчанию mysql не выполняет сопоставление с учетом регистра, так что, вероятно, это не так.

Кроме того, чтобы избежать внедрения SQL, вам обязательно следует использовать mysql_real_escape_string для экранирования вашего содержимого.

Добавление второго столбца также было бы довольно простым. Просто добавьте две записи в свой массив для каждого поискового запроса, одну для столбца 1 и одну для столбца 2.

Ответ №3:

  1. Данные вашего столбца 1 rock cheer climbing here вашим критериям поиска %Rocks% совсем не соответствуют, так как rocks их нет в ваших данных столбца 1

  2. вы можете добавить столбец 2, как вы делаете для столбца 1, а затем объединить все это с помощью оператора AND (column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")

СОВЕТЫ: Если ваша таблица / схема использует сопоставление xx_xx_ci (тогда это означает, что регистр не чувствителен, mysql не учитывает регистр), но если другое, то вам нужно убедиться, что поисковый запрос должен учитывать регистр (mysql учитывает регистр).