Когда мой Сценарий PHP получает данные из Ajax запрос POST, $_POST
переменных оставляют. Действительно странная вещь состоит в том, что это только происходит на моем рабочем сервере (выполняющий PHP 5.2.12 на Linux) а не на моем локальном сервере (выполняющий PHP 5.3.1 в Windows).
Вот код Ajax:
var pageRequest = false;
if(window.XMLHttpRequest) pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");
pageRequest.onreadystatechange = function() { }
var q_str = 'data=' + " ' ";
pageRequest.open('POST','unnamed_page.php',true);
pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");
pageRequest.send(q_str);
Есть ли какая-либо причина, это происходит? И как я должен зафиксировать это так, чтобы это работало над обоими серверами?
Править: У меня есть следующие настройки для magic_quotes:
Local Master
magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off
У вас, вероятно, включены магические кавычки на сервере Linux: magic_quotes
Когда magic_quotes включены, все символы '(одинарная кавычка), "(двойная кавычка), \ (обратная косая черта) и NUL автоматически экранируются обратной косой чертой.
Их хорошо отключить, так как они в любом случае будут удалены из PHP 6. Вы также должны иметь возможность отключить их в своем скрипте: set-magic-quotes-runtime Вы не можете деактивировать часть magic_quotes, отвечающую за экранирование данных POST во время выполнения. Если можете, отключите ее в php.ini. Если вы не можете этого сделать, проверьте, включены ли magic_quotes, и выполните полосы косые черты () на любой контент, который вы получаете из POST:
if (get_magic_quotes_gpc())
$my_post_var = stripslashes($_POST["my_post_var"]);
Возможно, в php.ini вашего Linux-сервера включены волшебные кавычки.
http://php.net/manual/en/security.magicquotes.php
Это, конечно, плохо, поскольку эта функциональность устарела и будет удалена в следующем выпуске PHP 6.
Вы можете отключить это в php.ini примерно так
magic_quotes_gpc = Off
Вы можете протестировать и отключить его во время выполнения, если вы не можете получить доступ к своему php.ini
<?php
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);
}
?>
Это «функция» PHP, известная как Magic Quotes , которая теперь устарела в PHP 5.3 и удалена из PHP 5.4.
Вероятно, в вашей производственной среде включены магические кавычки. Проверьте вывод phpinfo ()
.
Чтобы удалить кавычки, вы можете пропустить все свои входные данные через что-то вроде этого:
/* strip slashes from the string if magic quotes are on */
static function strip_magic_slashes($str)
{
return get_magic_quotes_gpc() ? stripslashes($str) : $str;
}
Я не думаю, что это применимо к вашему случаю, но у меня была похожая проблема. Я загружал установку Wordpress вместе с сайтом, чтобы показывать последние сообщения на всех страницах. Оказывается, Wordpress экранирует все переменные $ _POST, независимо от того, какие значения magic_quotes установлены.
Я упомянул об этом, потому что было сложно понять, и поиск ответа в Google привел меня сюда.
Вот как я исправил это в моем случае:
$temp_POST = $_POST;
require '../www/wp_dir/wp-load.php'; // loading wordpress
$_POST = $temp_POST;