Очень странная ошибка Apostrophes MySQL PHP

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

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

Многие базы данных хранятся в БД с такими именами, как "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 ответов

Решение

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

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

Данные, скорее всего, получают двойной выход при входе, наиболее вероятно один раз, когда пользователь вводит их (magic_quotes_gpc, который использует addslashes) и снова mysql_real_escape_string когда ты это называешь

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

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

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

Так что попробуйте это:

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

Вместо:

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

Вы пытались использовать http://es.php.net/mysql_real_escape_string, также проверьте, включена ли magic_quotes, и что вы работаете со строками?

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

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

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

Изменить: неверная ссылка исправлена

Другие вопросы по тегам