Я использую 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?
Обратите внимание, как ваши строки разделены на оба &
а также 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 = '&'
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
также по умолчанию "&"
, Установка этого в "&"
может быть будь в порядке, если ты только производить вывод 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 = '&'
a=0&b=1&c=2
Других решений пока нет …