2009-03-06 1 views
2

Я не думаю, что это был самый ясный вопрос, но пример должен сделать его немного яснее.Как вы кодируете апостроф так, чтобы он был доступен для поиска в mysql?

У меня есть таблица с именами фильмов, некоторые из которых содержат апострофы. У меня есть окно поиска, которое используется для поиска фильмов.

Если я выполнять поиск с помощью

mov_title = '$search_keywords' 

все это работает, но этот метод не даст никаких результатов для частичного поиска, поэтому я должен использовать этот

mov_title LIKE '%$search_keywords%' 

Этот метод отлично работает названия A-Za-z0-9, но если заголовок имеет апостроф, он не может найти фильм, даже если я делаю точное совпадение.

Перед названия хранятся в БД, я их через это:

$search_keywords = htmlspecialchars(mysql_escape_string($_GET["search_keywords"])); 

Так в БД, есть прямой слэш перед каждым одного апострофа.

Единственный способ сопоставить название фильма с апострофом - физически поставить переднюю косу перед апострофом в окне поиска.

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

ответ

4

Используйте mysql_real_escape_string() и не используйте htmlspecialchars(). Последнее не для экранирования базы данных, это для производства HTML.

+0

Удаление htmlspecialchars() ничего не изменило. Ведет себя точно так же. – 2009-03-06 23:05:30

+0

Поскольку значения в вашей базе данных уже использовались htmlspecialchars(). Вам нужно отменить все эти значения. Например, используйте html_entity_decode() и stripslashes(). –

+0

Я исправил некоторые тестовые значения, и Im все еще не смог их найти. – 2009-03-06 23:11:14

1

Это происходит только потому, что вы выбрали данные для вывода html перед выполнением вывода! Вы только должны сделать это право, прежде чем делать вывод, т.е .:

<li><?php echo htmlspecialchars($some_var); ?></li>

значения экранирования в вашей базе данных и изменить приложение, чтобы избежать только на выходе. В настоящее время у вас нет другого способа, кроме того, что вы делаете htmlspecialchars(mysql_real_escape_string()) на $ search_string.

Даже если имеет смысл сбежать для HTML уже при вставке в базу данных, mysql_real_escape_string() будет внешней функцией, а не внутренней функцией.

0

Если вы предпочитаете хранить свою базу данных без изменений, вы можете просто запустить функцию htmlspecialchars() для любых поисковых слов, которые вы ищете, прежде чем строить запрос. Хотя я рекомендую помещать данные в базу данных точно так же, как есть (но используйте mysql_real_escape_string(), чтобы избежать ее, чтобы препятствовать попыткам SQL-инъекций). Затем используйте htmlspecialchars(), когда вы печатаете данные в браузере.

Смежные вопросы