Добро пожаловать!
Здесь вы можете найти ответ на интересующий вас вопрос в отрасли сайтостроения, познакомится ближе с web технологиями и web стандартами.

Как отменить магическое действие magic quotes?

При включенной директиве конфигурации magic_quotes_gpc PHP автоматически добавляет слеши к строковым значениям в массиве $GLOBALS (это относится не только к данным в $_POST, $_GET, $_COOKIE, $_REQUEST, но и к данным в $_SERVER, $_FILES, $_ENV, $_SESSION). Вдобавок, при включенной директиве magic_quotes_runtime, слеши добавляются к данным полученым во время работы скрипта (например, из файла, базы данных). И как показывает практика, зачастую, эта магия оказывается "медвежьей" услугой.

Проще всего, конечно, отключить директивы в php.ini:

; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

или через .htaccess, прописав php_flag magic_quotes_gpc Off и php_flag magic_quotes_runtime Off, однако если нужно создать приложение, которое не зависит от настроек PHP, тогда нужно выполнить ряд антимагических действий вручную. С magic_quotes_runtime все просто, для его отключения в начале скрипта прописываем set_magic_quotes_runtime(0); и все, а для magic_quotes_gpc нужны заклинания более суровые: нужно проверить состояние директивы magic_quotes_gpc и если она включена, пробежаться по глобальным массивам и сделать stripslashes(), например так как показано ниже.

<?php
if ( get_magic_quotes_gpc() ) 
{
    
$_GET     stripslashes_deep($_GET);
    
$_POST    stripslashes_deep($_POST);
    
$_COOKIE  stripslashes_deep($_COOKIE);
    
$_REQUEST stripslashes_deep($_REQUEST);
    
$_SESSION stripslashes_deep($_SESSION);
    
$_SERVER  stripslashes_deep($_SERVER);
    
$_FILES   stripslashes_deep($_FILES);
    
$_ENV     stripslashes_deep($_ENV);
}

function 
stripslashes_deep($value
{
    if( 
is_array($value) )
    {
      
$value array_map('stripslashes_deep'$value)
    }
    elseif ( !empty(
$value) && is_string($value) )
    {
      
$value stripslashes($value);
    }
    return 
$value;
}
?>

В 6 версии PHP от магических закавычиваний отказались и оставленные в целях обратной совметимости get_magic_quotes_gpc и get_magic_quotes_runtime будут всегда возвращать false.