У меня странная проблема. Недавно я перенес свое приложение с моей локальной установки xampp на SUSE Enterprise Server 11, и все работает, но эта одна вещь сводит меня с ума, и я не могу найти решение.
При передаче массивов через GET или POST с использованием этого синтаксиса:
search_dggs.php?latmin[]=52.447529&latmin[]=22&lonmin=17.56&lonmax=22.16
Я получаю только первый элемент latmin. Имейте в виду, что это всего лишь простой пример, который я пробовал после того, как произошла ошибка в других местах, где необходима передача массивов.
print_r($_SERVER["QUERY_STRING"]);
выходы
latmin[]=52.447529&latmin[]=22&lonmin=17.56&lonmax=22.16
но
print_r($_GET);
дает
Array ( [latmin] => Array ( [0] => 52.447529 ) [lonmin] => 17.56 [lonmax] => 22.16 )
Точно так же происходит со всеми запросами POST.
Я использую PHP версии 5.3.8. Я думаю, проблема в некоторой конфигурации сервера, но я ничего не мог найти об этой проблеме.
Ответ на комментарии:
То же самое происходит, если я подаю любое количество переменных.
parse_str($_SERVER["QUERY_STRING"]); print_r($latmin);
дает
Array ( [0] => 52.447529 )
php.ini можно найти здесь
Вы должны увидеть поведение в действии здесь
Исходный файл этого php-файла
<?php $test="latmin[]=52.447529&latmin[]=22&lonmin=23&lonmax=22.16"; parse_str($test); print_r($latmin); phpinfo(); ?>
Ну, мой системный администратор сделал системное обновление и перезагрузился, и проблема теперь исправлена. Никакие файлы конфигурации не были изменены.
Протестировано на моем сервере, и это отлично работает для меня:
_GET["latmin"] Array ( [0] => 52.447529 [1] => 22 )
Посмотрите в своем php.ini в разделе «Обработка данных» и посмотрите, что это за значения. Сбросьте все по умолчанию, перезапустите веб-сервер и повторите попытку. Обработка данных по умолчанию для PHP.ini
Пример на ссылке печатает Array ( [0] => 52.447529 )
каждый раз, даже если никакие переменные не были переданы. Итак, кажется, что у вас есть проблема в коде, который не связан с этим кодом: `
$test="latmin[]=52.447529&latmin[]=22&lonmin=23&lonmax=22.16"; parse_str($test); print_r($latmin); phpinfo();
`
Хм .. может быть, это как-то связано с этой критической уязвимостью ? У вашей XAMPP есть такая же версия PHP, как и производство? Я знаю, что могут возникнуть подобные проблемы, если вы публикуете слишком много данных (как с точки зрения размера файла / сообщения, так и количества пара). Как насчет обновления до 5.3.10?
Попробуйте $_REQUEST
вместо $_GET
и / или $_POST
Наиболее вероятной причиной этой ошибки является то, что кто-то установил «max_input_vars» в 0 или 1 в php.ini. «max_input_vars» по умолчанию имеет значение 1000 и может быть переопределено в php.ini.
В последнее время я столкнулся с тем же поведением с другой причиной – исправление безопасности, которое кто-то обратил к установке PHP 5.2, частично реализованной «max_input_vars», но пропустил некоторые важные биты. Разная причина, тот же результат.
Соответствующий исходный код php можно найти в main / php_variables.c. В php 5.3.8 каучук попадал в дорогу в функции php_register_variable_ex.
Существует крючок SAPI «treat_data», который использует php при синтаксическом анализе строк, таких как «foo = bar & asdf [] = 1 & asdf [] = 2». У другого SAPI может быть собственная реализация этого.