MySQL / PHP проблема с "и" - PullRequest
2 голосов
/ 14 мая 2009

Я сделал простую систему новостей с комментариями, используя PHP и MySQL, и она отлично работала на моем локальном сервере Apache, как на моей машине с Fedora 10, так и на моей Windows 7. Теперь у меня возникла проблема, я загрузил его на веб-хостинг, и он продолжает возвращать все 'и "как \' и \".

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

Вот пример запроса:

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());

$time - time(); $newstitle и $newstext анализируются с $_POST, и оба запускаются до mysql_real_escape_string(), прежде чем я выполню запрос (думаю, это может быть проблемой, но так как это часть безопасности, я просто не хочу чтобы удалить его, и поскольку он не вызывает проблем на моих локальных серверах)

В заключение: на моих локальных серверах apache у меня был latin1_swedish_ci, который не работал на сервере веб-хостов.

EDIT:

Они выглядят так в базе данных:

\'\'\'\"\"\"

В то время как на моих локальных у них не было дополнительной обратной косой черты, так что это должен быть PHP, добавляющий ее. Есть ли способ решить эту проблему, кроме добавления функции, которая удаляет дополнительные обратные слеши?

Ответы [ 7 ]

7 голосов
/ 14 мая 2009

Эти дополнительные обратные слеши, вероятно, Магические кавычки . Попробуйте отключить их или удалить их перед обработкой данных.

4 голосов
/ 14 мая 2009

Нет, вы не хотите запускать полоски (). Скорее, настройте свой сервер правильно.

Во-первых, отключите magic_quotes. Это означает, что от любых данных, поступающих в ваш скрипт, ничего не ускользнет.

Затем запустите mysql_real_escape_string () для данных, которые добавят косые черты только для запроса и сохранят данные в базе данных без косых черт.

Когда вы снова загрузите данные, все будет хорошо, и кавычек вокруг кавычек не будет.

4 голосов
/ 14 мая 2009

Редактировать : Как уже упоминалось несколько раз ниже и в комментариях, правильный способ сделать это - отключить магические кавычки. Если бы я полностью прочитал и понял вопрос, прежде чем ответить, то, вероятно, было бы лучше;)


mysql_real_escape_string() будет делать то, что говорит, и экранировать соответствующие символы в строке. Экранирование кавычек осуществляется путем добавления к ним префикса с помощью escape-символа (обратная косая черта в PHP и многих других языках). Когда вы извлекаете данные из базы данных , выполните что-то вроде запуска stripslashes() (см. PHP doc ) для содержимого, чтобы удалить косые черты из таких вещей, как кавычки.

Редактировать : Как упоминал Гамбо, это также может быть связано с включением на сервере волшебных кавычек. Вы должны отключить эти согласно его ответу .

3 голосов
/ 14 мая 2009

Посмотрите на настройки magic_quotes и сравните их на своих серверах. Возможно, на ваших домашних серверах magic_quotes отключено (как и должно быть, поскольку Magic Quotes устарела в текущих версиях PHP), и ваш веб-хост, вероятно, имеет их включенными (что, к сожалению, часто). Вы можете использовать:

<?php echo phpinfo(); ?>

для быстрого сравнения.

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

Вопросы, содержащие "magic_quotes"

2 голосов
/ 14 мая 2009

Посмотрите на magic_quotes_gpc . Вы можете отключить это через .htaccess и использовать mysql_real_escape_string ().

2 голосов
/ 14 мая 2009

Ваш хост может иметь Магические кавычки .

0 голосов
/ 15 мая 2009

Реальным решением является использование подготовленных операторов в ваших запросах на вставку.

Вот сайт с примером вставки прямо вверху.

Подготовленные заявления в PHP

Преимущество заключается в том, что это лучшая практика, а побочным эффектом является то, что вам больше не нужно беспокоиться об очистке ввода от атак SQL-инъекций.

...