PHP5.4 & quot; parse_str & quot; вести себя неожиданно

Я использую Zend Framework 2’s AbstractRestfulController внедрить CRUD API в нашем проекте. Использование метода PUT HTTP вызывает логику для обновления существующего объекта.

При получении запроса PUT AbstractRestfulController преобразует тело запроса в массив, используя PHP parse_str функция, но эта функция не делает то, что она должна делать.

Поскольку это дало мне странные результаты, я попытался parse_str с примерами данных, предоставленными в документах PHP:

// sample data from the PHP docs
$content = "first=value&arr[]=foo+bar&arr[]=baz";

// put the parsed variables into $parsedParams
parse_str($content, $parsedParams);

var_dumpИНГ $parsedParams дает мне следующее

array(5) {
["first"]=> string(1) "v"["lue"]=> string(0) ""["rr"]=> array(2) {
[0]=> string(5) "foo b"[1]=> string(1) "b"}
["r"]=> string(0) ""["z"]=> string(0) ""}

Видимо символ «а» смущает parse_str, но я абсолютно не знаю, что вызывает это странное поведение. Кодировка файла PHP — UTF-8, сервер работает под управлением Ubuntu 14.04 с PHP 5.4 в качестве модуля Apache 2.4 в среде Vagrant.

Что может быть причиной этого? Я читал о проблемах с сущностью HTML & вместо простого &Да, но это, кажется, не применимо здесь.

ОБНОВИТЬ

Я просто запустил тот же код в командной строке в интерактивном режиме через SSHв бродячей машине. В интерактивном режиме parse_str работает без проблем! Затем я запустил свой тестовый скрипт из командной строки через $ php /var/www/test.php который также работал правильно.
Это проблема с модулем или конфигурацией Apache PHP?

1

Решение

Обратите внимание, как ваши строки разделены на оба & а также a?

Я думаю, что настройки конфигурации arg_separator.input неправильно установлено на "&" вместо по умолчанию "&",

Эта настройка может быть установлена ​​в php.ini, .htaccess, httpd.conf или же .user.ini, Увидеть: Где может быть установлен параметр конфигурации.

Тестовая программа:

<?php

echo "arg_separator.input = '", ini_get ('arg_separator.input'), "'\n";

$content = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($content, $parsedParams);

var_dump ($parsedParams);

Вывод (несколько сжатый) с разными настройками в php.ini:

arg_separator.input = '&'
array(2) {
["first"] => string(5) "value"["arr"] => array(2) {
[0] => string(7) "foo bar"[1] => string(3) "baz"}
}
arg_separator.input = '&amp;'
array(5) {
["first"] => string(1) "v"["lue"] => string(0) ""["rr"] => array(2) {
[0] => string(5) "foo b"[1] => string(1) "b"}
["r"] => string(0) ""["z"] => string(0) ""}

Настройка конфигурации arg_separator.output также по умолчанию "&", Установка этого в "&amp;" может быть будь в порядке, если ты только производить вывод HTML. Но у вас возникнут проблемы, если вы хотите использовать http_build_query() создать HTTP Location: заголовок или в других ситуациях, когда ссылка на сущность HTML не подходит.

Тестовая программа:

<?php

echo "arg_separator.output = '", ini_get ('arg_separator.output'), "'\n";

$q = http_build_query (array ('a' => 0, 'b' => 1, 'c' => 2));
echo $q, "\n";

Вывод с разными настройками в php.ini:

arg_separator.output = '&'
a=0&b=1&c=2
arg_separator.output = '&amp;'
a=0&amp;b=1&amp;c=2
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]