Есть ли надежные альтернативы parse_str (), которые не подвержены ошибкам? - PullRequest
3 голосов
/ 08 февраля 2012

Есть ли надежная альтернатива функции parse_str() для анализа строки запроса?

Я нахожу это очень запутанным и подверженным ошибкам, особенно когда строка запроса поступает из внешней службы (и вы не можете полностью ее контролировать):

$error = "Error message";
parse_str("param1=hello&error=false"); // Overrides $error

parse_str($externalQuery);
// Which variables are setted and which not?

Ответы [ 5 ]

5 голосов
/ 08 февраля 2012

Передайте необязательный второй аргумент в parse_str(), и он будет помещать значения в ассоциативный массив вместо создания / перезаписи переменных.Из руководства php :

Если присутствует второй параметр arr, переменные сохраняются в этой переменной как элементы массива.

Вы должныинициализировать массив первым.Сделайте это:

$error = "Error message";
$vars = array();
parse_str("param1=hello&error=false", $vars);
echo $error . "\n";
print_r($vars);

который выдаст:

Error message
Array
(
    [param1] => hello
    [error] => false
)
1 голос
/ 08 февраля 2012

Посмотрите еще раз на документы.parse_str поддерживает передачу второго параметра, который будет хранить переменные.

$error = "Error message";
parse_str("param1=hello&error=false", $data);

echo $error; // "Error message"
var_dump($data['error']); //false
1 голос
/ 08 февраля 2012
$error = "Error message";
$output_array = array();
parse_str("param1=hello&error=false", $output_array); 
var_dump($output_array);

Вам действительно нужно перезаписать существующие переменные или создать новые «неизвестные» переменные?

0 голосов
/ 14 ноября 2018

Используйте функцию \ GuzzleHttp \ psr7 \ parse_query , которая доступна с guzzlehttp / psr7 composer package.

Это сработало - parse_str просто не удалось разобратьнекоторые запросы и вернули пустой массив.

У него более современный синтаксис:

$aParsedQuery = parse_query($sQueryString, $bUrlDecode);

Где второй параметр по умолчанию true.

0 голосов
/ 08 февраля 2012

Вы можете передать массив в parse_str, и он поместит в строку запроса пары KV:

$error = "Error message";
$queryString = array();
parse_str("param1=hello&error=false", $queryString);

echo $error; //"Error message"
echo $queryString["error"]; //"false" (actually will echo "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...