Я создал простую систему новостей с комментариями с использованием 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
is time();
$newstitle
и $newstext
анализируются из $_POST
и оба выполняются через mysql_real_escape_string()
прежде чем запускать запрос (я думаю, это может быть проблемой, но поскольку это часть безопасности, я просто не хочу ее удалять , и поскольку это не вызывало проблем на локальных серверах)
В заключение: на моих локальных серверах apache у меня был latin1_swedish_ci
который не работал на сервере веб-хостов.
РЕДАКТИРОВАТЬ:
Они выглядят так в базе данных:
\'\'\'\"\"\"
В то время как на моих местных, у них не было дополнительной обратной косой черты, так что это должно быть добавление PHP. Есть ли способ решить эту проблему, кроме добавления функции, которая удаляет дополнительные обратные косые черты?
Эти дополнительные обратные косые черты, вероятно, являются магическими котировками . Попытайтесь отключить их или удалить их перед обработкой данных.
Нет, вы не хотите запускать stripslashes (). Скорее, настройте свой сервер должным образом.
Сначала отключите magic_quotes. Это означает, что любые данные, входящие в ваш скрипт, не будут сбежать.
Затем запустите mysql_real_escape_string () для данных, которые будут добавлять косые черты только для запроса и будут хранить данные в базе данных без косой черты.
Когда вы снова загрузите данные, вам будет хорошо идти, и никаких коллажей вокруг котировок не будет.
Изменить : как упоминалось несколько раз ниже, и в комментариях, правильный способ сделать это – отключить магические кавычки. Если бы я полностью прочитал и понял вопрос до ответа, то это, вероятно, было бы лучше;)
mysql_real_escape_string()
будет делать то, что он говорит, и избегая соответствующих символов внутри строки. Сбрасывание кавычек производится путем префикса их escape-символа (обратного слэша в PHP и многих других языков). Когда вы stripslashes()
данные из базы данных , сделайте что-то вроде выполнения stripslashes()
(см. stripslashes()
PHP ) в контенте, чтобы удалить косые черты из таких вещей, как кавычки.
Изменить : Как упоминал Gumbo, это также может быть связано с тем, что Magic Quotes включена на сервере. Вы должны отключить их в соответствии с его ответом .
Взгляните на свои настройки magic_quotes
и сравните их на своих серверах. У ваших домашних серверов, вероятно, есть magic_quotes
disabled (как и должно быть, поскольку Magic Quotes устарела в текущих версиях PHP), и ваш веб-хост, вероятно, включит их (что, к сожалению, является общим). Вы можете использовать:
<?php echo phpinfo(); ?>
для быстрого сравнения.
Если magic_quotes является новым для вас, вы можете захотеть взглянуть на безопасность PHP еще немного, прежде чем развертывать все, что вам нужно.
Вопросы, содержащие "magic_quotes"
Ваш хост может включить Magic Quotes .
Посмотрите на magic_quotes_gpc . Вы можете отключить это через .htaccess и использовать mysql_real_escape_string ().
Реальное решение заключается в использовании подготовленных операторов в ваших запросах на вставку.
Вот сайт с примером вставки справа вверху.
Подготовленные утверждения в PHP
Преимущество в том, что это лучшая практика, и побочным эффектом является то, что вам больше не нужно беспокоиться об очистке ввода от атак SQL-инъекций.