возникли проблемы с поиском в базе данных MySQL - PullRequest
0 голосов
/ 07 октября 2011

У меня есть два вопроса относительно моего сценария и поиска.У меня есть этот сценарий:

$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 с именем данных "скалолазание здесь"

Если я наберу "скалолазание", эти данные показывают.Это прекрасно, но если я просто наберу "Скалы", это не покажет.Почему это так?

Кроме того, как бы я добавил еще один "столбец2" для ключевого слова для поиска?

Спасибо!

Ответы [ 3 ]

1 голос
/ 07 октября 2011

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

Один из вариантов, который вы можете попробовать, - удалить 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) . "%'";

Это предотвратит любую злобу от нанесения вреда вашим данным.

0 голосов
/ 07 октября 2011

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

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

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

0 голосов
/ 07 октября 2011
  1. Ваши данные столбца1 rock cheer climbing here ваш критерий поиска %Rocks% он совсем не подходит, поскольку rocks нет в данных вашего столбца1

  2. Вы можете добавить column2, как и для column1, а затем сложить все вместе, используя оператор AND (column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...