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

Я использую 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
Другие вопросы по тегам