Очень странная ошибка 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 должны быть удвоены
Изменить: неверная ссылка исправлена