Как отключить кавычки PHP-магии во время выполнения?

Я пишу набор PHP-скриптов, которые будут запускаться в разных настройках, некоторые из них используют общий хостинг с магическими кавычками (ужас). Не имея возможности управлять настройкой PHP или Apache, могу ли я сделать что-нибудь в своих сценариях, чтобы отключить цитаты из PHP во время выполнения?

Было бы лучше, если бы код не предполагал, что магические кавычки включены, так что я могу использовать те же сценарии на разных хостах, которые могут иметь или не иметь магические кавычки.

Только magic_quoted_runtime можно отключить во время выполнения. Но magic_quotes_gpc не может быть отключен во время выполнения ( PHP_INI_ALL сменяется до PHP 4.2.3, с тех пор PHP_INI_PERDIR ); вы можете удалить их только:

if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); while (list($key, $val) = each($process)) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } 

Дополнительную информацию см. В разделе « Отключение магических котировок» .

Магические кавычки не могут быть отключены во время выполнения, но вы можете использовать файл .htaccess в каталоге, чтобы отключить его.

 php_flag magic_quotes_gpc off 

Единственное реальное преимущество – вы можете поместить его один раз в каталог, и он работает для всего каталога и подкаталогов. Действительно приятно, если вам это нужно для приложения, которое вы не пишете, и нужно заставить его работать без магических кавычек.

У меня есть небольшой сценарий для этого, похожего на Gumbo's (но, конечно, мне нравится моя лучше :):

 if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) set_magic_quotes_runtime(false); if(get_magic_quotes_gpc()) { array_stripslashes($_POST); array_stripslashes($_GET); array_stripslashes($_COOKIES); } function array_stripslashes(&$array) { if(is_array($array)) while(list($key) = each($array)) if(is_array($array[$key])) array_stripslashes($array[$key]); else $array[$key] = stripslashes($array[$key]); } 

Другое решение для PHP 5.3+:

 if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true); $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true); $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); } 

Обрабатывает ключи, значения и многомерные массивы.

Это невозможно сделать во время выполнения 🙁