http_build_query()没有url编码

bgc*_*ode 59 php urlencode

http_build_query()根据某些RFC标准,有没有一种方法可以使用URL编码?

为什么我不想对所有内容进行URL编码:我正在查询Ebay API ..他们诚实地坚持参数名称不是URL编码,就括号中的逗号而言.例如,DomainName(0)是一个参数,如果这些parens被编码,则查询失败.

小智 130

您可以urldecode()在结果字符串上使用函数http_build_query()


ale*_*lex 6

不,它似乎总是想要编码(它应该是,它在构建URL的参数列表时用于URL编码).

你可以做自己的......

$params = array('a' => 'A', 'b' => 'B');

$paramsJoined = array();

foreach($params as $param => $value) {
   $paramsJoined[] = "$param=$value";
}

$query = implode('&', $paramsJoined);
Run Code Online (Sandbox Code Playgroud)

CodePad.

  • 这个不会处理嵌套数组. (3认同)

Bas*_*usa 6

PHP 5.3.1(错误行为) http_build_query DOES逃脱加入参数"&"号字符.示例:user_id=1&setting_id=2.

PHP 5.4+ http_build_query 不会转义连接参数的'&'&符号.例:user_id=1&setting_id=2

例:

$params = array(
    'user_id' => '1', 
    'setting_id' => '2'
);
echo http_build_query($params);

// Output for PHP 5.3.1:
user_id=1&setting_id=2   // NOTICE THAT: '&' character is escaped

// Output for PHP 5.4.0+:
user_id=1&setting_id=2       // NOTICE THAT: '&' character is NOT escaped
Run Code Online (Sandbox Code Playgroud)

定位多个版本时的解决方案

选项#1:编写包装函数:

/** 
 * This will work consistently and will never escape the '&' character
 */
function buildQuery($params) {
    return http_build_query($params, '', '&');
}
Run Code Online (Sandbox Code Playgroud)

选项#2:抛弃http_build_query函数并编写自己的函数.