Очень странная ошибка Apostrophes MySQL PHP - PullRequest
1 голос
/ 21 июня 2010

еще один тизер мозга.

Это не обычное "но апострофы разбивают мои запросы", так как я знаю все о побегах и дезинфекции, так что я тоже правильно понял.

В БД хранится много вещей с такими именами, как "Assassin's" и "Babe's", которые заканчиваются на "Assassin's 's" и "Babe \' s", восстановление идет хорошо, но поиск по тексту ... болезненный .

LIKE "% Babe \ 's%" не дал результатов, "% Babe \\' s" не дал результатов, "% Babe \ 's" не дал результатов.

НО, если я пойду на сервер напрямую, все они будут давать результаты.

Другими словами, тот же самый запрос SAME, полностью неотредактированный, будет работать непосредственно в движке MySQL, но при отправке через php mysql api он не даст результатов.

Есть идеи, что может вызвать это? (Я проверил 100 раз количество слешей и т. Д., Есть ли проблема с набором символов? "

Много, много, много, большое спасибо заранее.

редактирование:

Думаю, мне лучше разобраться:

"SELECT title FROM games WHERE title LIKE "%assassin\\\'s%"; (Поскольку SQL должен экранировать апостроф, и один из слэшей превратится в сохраненный слеш, поскольку в этом примере мы ищем «Assassin's Creed»)

edit2: Соу мы выяснили, что это вызвано тем, что удалось избежать побегов в реальном дБ, вызванном плохой дезинфекцией. В настоящее время я пытаюсь очистить базу данных и метод ввода.

edit3: Кажется, магические кавычки были как-то включены ... Клянусь, это было отключено! Однако это было не просто так. Оболочка БД, которая находится на этом сайте, имеет событие очистки, а также предварительную очистку, которая вызвала проблему. Это было исправлено сейчас, и теперь я запускаю скрипт (надеюсь) очистить БД ...

Ответы [ 5 ]

5 голосов
/ 21 июня 2010

Я бы серьезно подумал над исправлением данных в вашей базе данных.

Теперь, сказав, что MySQL распознает как \', так и '' как экранированный апостроф. То есть, если режим сервера не настроен на использование строгого SQL, в этом случае распознается только ''.

Скорее всего, данные становятся дважды экранированными при входе, скорее всего, один раз, когда пользователь вводит их (magic_quotes_gpc, который использует addslashes), и снова mysql_real_escape_string когда вы звоните.

Это превратит Assassin's Creed в Assassin\\\'s Creed, что в конечном итоге будет сохранено как Assassin\'s Creed.

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

1 голос
/ 21 июня 2010

Когда вы избегаете апострофа, чтобы сохранить его в MySQL, обратная косая черта не сохраняется.

Поэтому попробуйте это:

SELECT title FROM games WHERE title LIKE "%assassin\'s%";

Вместо:

SELECT title FROM games WHERE title LIKE "%assassin\\\'s%";
1 голос
/ 21 июня 2010

Вы пытались использовать mysql_real_escape_string , также проверьте, включена ли magic_quotes и нет ли в ваших строках

0 голосов
/ 22 июня 2010

Как указано в документации , косые черты в предложениях LIKE и REGEXP должны быть удвоены

Редактировать: исправлена ​​неправильная ссылка

0 голосов
/ 21 июня 2010

ВЫБРАТЬ название из игр, ГДЕ название REGEXP "assassin \ 's";

Думайте о REGEXP как о более мощном, менее требовательном "НРАВИТСЯ" в MySql .... Не все, конец -все, но еще один крутой инструмент в магазине.

...