Magic Quotes - дроби вместо кавычек на сайте
Магические кавычки (Magic Quotes) в PHP
В данной статье PageRanker.Ru расскажет начинающим, а также тем, кто уже имеет опыт программирования на PHP, о так называемых «магических кавычках».
Эта статья посвящена версиям PHP 4 и 5. В 6-ой версии PHP magic_quotes были убраны и считаются устаревшими (deprecated).
Если у Вас на страницах сайта неверно отображаются введенные данные - кавычки заменяются многократными дробями или использование ссылок не представляется возможным, проблема вероятнее всего в использовании функции magic quotes
Что такое Magic Quotes?
Если мы посмотрим у себя в php.ini, то найдем там три директивы:
magic_quotes_qpc
magic_quotes_runtime
magic_quotes_sybase
Каждая из них может быть включена (On), либо выключена (Off).
Данные директивы отвечают за экранирование спецсимволов в различных данных поступающих в php-скрипт и выводимых из php-скрипта.
magic_quotes_qpc
Если директива magic_quotes_qpc включена, то экранируются спецсимволы из следующих источников: $_GET, $_POST, $_REQUEST, $_COOKIE, $_ENV (в PHP4). Кстати, на конце имени этой директивы аббревиатура GPC именно от GET/POST/COOKIE.
Например, если в одном из этих источников окажется такой элемент, как одинарная кавычка (’), двойная кавычка (”), обратный слэш (\) или NULL-символ, то этот элемент будет автоматически экранирован обратным слэшем:
index.php?test=’123′
$test = $_REQUEST['test'];
echo $test; // выведет: \’123\’
Таким образом, если мы хотим записать данные из $_REQUEST в базу MySQL например, то нам не нужно экранировать кавычки функцией addslashes, т.к. они уже будут заэкранированы. Но если magic_quotes_gpc отключена, то экранировать нужно принудительно:
index.php?test=’123′
$test = $_REQUEST['test'];
if (!get_magic_quotes_gpc()) {
$test = addslashes($test);
}
mysql_query($res, “INSERT INTO test_table (test) VALUES ($test)”);
Как видите здесь я использовал функцию get_magic_quotes_gpc для проверки состояния директивы magic_quotes_gpc. Если директива в выключенном состоянии, то я экранирую переменную $test. В противном случае экранировать нельзя, т.к. получится двойное экранирование. Т.е. если magic_quotes_gpc включена, то:
index.php?test=’123′
$test = addslashes($_REQUEST['test']);
echo $test; // выведет: \\\’123\\\’
Т.е. мы заэкранируем заэкранированное
Директива magic_quotes_gpc экранирует только одинарные кавычки, если включена также директива magic_quotes_sybase. Причем экранирует она одинарную кавычку одинарной кавычкой:
index.php?test=’123′
$test = $_REQUEST['test'];
echo $test; // выведет: ”123”
magic_quotes_runtime
Если включена эта директива, то большинство функций, которые возвращают данные из базы например или текстовых файлов, будут возвращать заэкранированные текстовые данные. А если в добавок включена директива magic_quotes_sybase, то экранируются только одинарные кавычки, причем не обратным слэшем, а такой же одинарной кавычкой.
magic_quotes_sybase
Эта директива в довесок к двум предыдущим, как было уже сказано, просто меняет правило экранирования одинарной кавычки и отключает экранирование остальных символов (двойной кавычки, обратного слэша и NULL-символа).
Лично я не понимаю, для чего нужно экранировать кавычку еще одной кавычкой. Но видимо это когда-то было нужно.
Как их все учитывать?
Начну с того, что директивы magic_quotes_runtime и magic_quotes_sybase можно включать/отключать прямо в PHP-скрипте:
ini_set(’magic_quotes_runtime’, 0);
ini_set(’magic_quotes_sybase’, 0);
И это я рекомендую делать всем.
Решением проблемы с отображением дробей на сайте может быть именно отключение функции magic quotes через системный файл .htaccess
А вот значение директивы magic_quotes_qpc можно установить только в php.ini, .htaccess или httpd.conf. Но зачастую хостинг-провайдер дает нам редактировать только .htaccess, да и то не всегда. Поэтому тут вывод один: нужно просто учитывать значение magic_quotes_qpc при работе скриптов, чтобы не было лишних экранирований, или наоборот, недоэкранирований Если эта директива выключена, то использовать addslashes над вводимыми извне данными (из указанных ранее источников).
При условии конечно, что остальные две директивы в состоянии Off.
Бывает и такое, что хостинг-провайдер блокирует функцию ini_set. В этом случае нужно проверять значения директив с помощью ini_get. И если значения нас не устраивают, то лучше обратиться в техподдержку хостинга с просьбой отключить эти директивы.
Как отключить magic quotes?
Чтобы отключить магические кавычки
- создай в директории файл .htaccess (обязательно начинается с точки)
- вставь в ного следующую строку: php_flag magic_quotes_gpc off
- залей на сервак
Если хостинг-провайдер разрешил использование файла .htaccess, то все должно получиться.
Чтобы проверить сработало или нет
- создаешь PHP-файл со строкой
- заливаешь на сервак, запускаешь его
- ищешь параметр magic_quotes_gpc, в столбце Local Value должно быть OFF
Как отключить magic quotes через .htaccess?
Если сервер Вашего веб-ресурса находится на Apache, самым простым решением проблемы с магическими кавычками будет добавление данного кода в системный файл .htaccess:
php_value magic_quotes_gpc off
Magic Quotes – это конечно устаревшие вещи, но не учитывать их опасно в нынешней ситуации, пока мир не перейдет на PHP6.
Ваш Пэйджранкер.ру