Некоторые проблемы с поиском в базе данных mysql через php - PullRequest
1 голос
/ 12 января 2010

Итак, у меня есть этот веб-сайт с функцией поиска, которая ищет таблицу в моей базе данных mysql. База данных на данный момент насчитывает 1108 строк. Он содержит информацию о музыке, такую ​​как исполнитель и альбом. Поскольку каждый персонаж может быть в имени исполнителя или имени альбома, я кодировал каждую из этих переменных перед добавлением в базу данных. Смотрите ниже:

$artist = urlencode($_POST['artist']);
$album = urlencode($_POST['album']);

Итак, теперь давайте представим, что я добавил новую запись в базу данных, и она содержит символы, которые необходимо кодировать. База данных показывает это нормально.

Теперь я хочу пойти искать.

Иностранные символы работали. Вы можете увидеть здесь: http://albumarrrt.net/details.php?artist=Ai%20Otsuka нажав на ссылку альбома для каждой из работ.

Но теперь возникает несколько проблем.

1 - Если вы ищете '&', при поиске читается% 26 как ничего. Он показывает% 26 в адресной строке, но он читает его как ничего. Вот как это читается:

$search = $_GET['search'];

if($search == '') {
    echo "Please enter a search term :(";
}

Это единственное, что делается с $ search до того, как он начнет считываться базой данных.

2 - Если вы ищете одинарные или двойные кавычки, это делает странный пример:

Поиск "и получить не найдено совпадений для "% 5C% 5C% 26quot% 3B" Найти ' и не найдено совпадений для "% 5C% 5C% 26% 23039% 3B" * * тысяча двадцать два

Я не понимаю, почему это происходит, потому что база данных содержит только код для цитаты и ничего больше.

Это единственные две вещи, которые я нашел неправильно в своих поисках. Может быть, я просто слишком долго смотрел на это и не могу понять, но это сбивает с толку мое, почему он не читает «&» как что-либо.


На мой последний вопрос. Мой текущий метод поиска отделяет каждое слово и добавляет% вокруг него, а затем использует оператор LIKE для поиска совпадений. Пример:

Поиск: куча вещей (слово) запрос mysql будет выглядеть так:

SELECT * FROM TABLE WHERE (album LIKE '%A%' AND album LIKE '%bunch%' AND album LIKE '%of%' AND album LIKE '%Stuff%' AND album LIKE '%%28word%29%') OR (artist LIKE '%A%' AND artist LIKE '%bunch%' AND artist LIKE '%of%' AND artist LIKE '%Stuff%' AND artist LIKE '%%28word%29%')

Очевидно, что это создает большую нагрузку на сервер, и я знаю, что использование операторов LIKE для такого поиска в большой базе данных является плохой идеей, так какой же будет альтернативный способ поиска FULL TEXT или какого-то другого метода?

Извините за огромное количество вопросов, но все они как бы идут рука об руку друг с другом.


редактирование: Хорошо, я исправил свою базу данных, но все еще есть несколько вопросов. Кто-то предложил преобразовать мой текст из utf8 в обычный utf, как мне это сделать?

и у меня все еще есть проблема со знаком &. например: если вы выполняете поиск в & google, это работает, однако на моем сайте мой результат POST для поискового запроса ничего не показывает при поиске &.

Ответы [ 3 ]

3 голосов
/ 12 января 2010
  • Первое: не кодировать данные в базе данных. Данные Urlencode после извлечения, когда вы выводите в HTML.

  • Второе: используйте параметры запроса при использовании пользовательских значений в запросах SQL. Тогда вам не нужно беспокоиться о кавычках в данных формы, вызывающих синтаксические ошибки или риски внедрения SQL.

  • В-третьих: не используйте взлом LIKE '%pattern%'; вместо этого используйте реальное решение для полнотекстового поиска (либо FULLTEXT или Lucene / Solr или Sphinx Search ). Он будет иметь производительность в сотни или тысячи раз лучше, чем использование специального текстового поиска (в зависимости от объема данных).

    См. Презентацию, которую я сделал для университета MySQL: Практический полнотекстовый поиск в MySQL .

1 голос
/ 12 января 2010

Вы уверены, что не хотите, чтобы расшифровывал вещи, исходящие из ваших URL-адресов (и постов) до помещения их в базу данных? Если бы я хранил различные строки, я хотел бы декодировать их в обычный UTF или что-то еще и хранить их таким образом. Тогда я бы перекодировал их для отображения. Это может решить проблему поиска само по себе.

Во-вторых, чтобы ускорить доступ к поиску строк, вы можете создать таблицу строк со всеми вашими строками токенов, и связать их со строками, которые их содержат. Затем вместо «как% $ 1%» вы можете сказать, где $ 1 = stringTable.String и присоединиться к этому идентификатору. Ни в коем случае не считайте это оптимальным решением, так как я сам не выполнил эти настройки производительности, это всего лишь предложение.

1 голос
/ 12 января 2010

Я не понимаю, зачем вам нужен urlencode, я просто использовал бы mysql_real_escape_string.

'&' - это разделитель в URL-адресе, поэтому он не будет передан в ваш скрипт, если вы сначала не закодируете его

Другая проблема с urlencode - большое количество дополнительных символов. mySQL может молча обрезать исполнителя или заголовок, если вы не указали достаточно символов.

DC

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