2014-11-15 6 views
1

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

При получении запроса 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 & вместо простого &, но это, похоже, не применимо здесь.

UPDATE

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

+2

Просто попробовал с PHP v5.4 и работает без каких-либо проблем , Возможно, ваша строка содержит невидимые символы, которые заставляют PHP задушить? Не могли бы вы попробовать 'echo strlen ($ content)' и посмотреть, что получилось? – silkfire

+0

скопировал тот, который вы опубликовали. http://codepad.viper-7.com/FYbCCx кажется прекрасным – Ghost

+0

strlen ($ content) дает мне длину 35, что является правильным, может быть, это проблема моей версии PHP или что-то в этом роде? – Subsurf

ответ

2

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

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

Эта установка может быть установлена ​​в php.ini, .htaccess, httpd.conf или .user.ini. См .: Where a configuration setting may be set.

Программа испытаний:

<?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 
+0

Большое спасибо, это вызвало проблему! Мне понадобилось бы много лет, чтобы понять это самостоятельно. При настройке среды Vagrant я скопировал php.ini с нашего производственного сервера (совместно используемой среды) на машину Vagrant, полагаю, что я должен искать эту проблему и на производственном сервере. Могу ли я спокойно оставить arg_seperator.output как «&»? – Subsurf