http_build_query()没有url编码

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

为什么我不想要URL编码的一切:我查询Ebay API ..他们诚实地坚持参数名称不是URL编码,就像括号中的逗号。 例如DomainName(0)是一个参数,如果这些parens被编码,则查询失败。

你可以对从http_build_query()得到的结果string使用urldecode()函数,

不,它似乎总是要编码(它应该,这意味着当build立一个URL的参数列表时,URL编码)。

你可以做你自己的…

 $params = array('a' => 'A', 'b' => 'B'); $paramsJoined = array(); foreach($params as $param => $value) { $paramsJoined[] = "$param=$value"; } $query = implode('&', $paramsJoined); 

CodePad 。

你可能想尝试他们的JSON API。 我试图得到一个工作示例,但我没有应用程序名称,所以我无法validation结果。 代码如下:

 <?php $appName = "Your App Name Here"; $post_data = array( 'jsonns.xsi' => 'http://www.w3.org/2001/XMLSchema-instance', 'jsonns.xs' => 'http://www.w3.org/2001/XMLSchema', 'jsonns.tns' => 'http://www.ebay.com/marketplace/search/v1/services', 'tns.findItemsByKeywordsRequest' => array( 'keywords' => 'harry potter pheonix' ) ); $headers = array( "X-EBAY-SOA-REQUEST-DATA-FORMAT: JSON", "X-EBAY-SOA-RESPONSE-DATA-FORMAT: JSON", "X-EBAY-SOA-OPERATION-NAME: findItemsByKeywords", "X-EBAY-SOA-SECURITY-APPNAME: $appName" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://svcs.ebay.com/services/search/FindingService/v1'); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($ch); if($result) { $response = json_decode($result); } curl_close($ch); ?> 

你需要填写任何应用程序名称的$appName 。 另外, X-EBAY-SOA-OPERATION-NAME将需要设置为实际的呼叫,如果呼叫不同,JSON将被修改。

http_build_query()在没有urlencoding的情况下是无效的。 也许你不小心对它进行了双重编码? 例如,尝试为这个数组构buildhttp查询:

 $params = array('a' => 'a&b=b'); 

没有编码,你会得到

 a=a&b=b 

当正确的编码,你会得到

 a=a%26b%3Db 

哪个是对的。 如果你跳过编码,一定要避免URL注入攻击。

PHP 5.3.1(Buggy Behavior) http_build_query是否转义连接参数的“&”符号字符。 例如: user_id=1&amp;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&amp;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 

针对多个版本的解决scheme

选项#1:写封装函数:

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

选项#2:消除http_build_query函数并编写自己的。

你可以使用urldecode() 。 或者用$ arg_separator参数使用http_build_query。

  $query_data= $data = array('bar', 'baz'=>'boom'); $numeric_prefix= 'test_'; $arg_separator = '&'; $http_query = http_build_query ( $query_data, $numeric_prefix, $arg_separator ); var_dump( $http_query ); 

上面的输出是

  string 'test_0=bar&baz=boom' (length=19) 

numeric_prefix :如果数组索引是数字,则将该string作为每个索引中的前缀添加。 在这种情况下,' test_0 = bar'

arg_separator :用于分隔参数。 如果非给定php使用在php.ini中定义的arg_separator.output

请参阅php http_build_query

我接受亚历克斯的答案,但速度更快

 $params = array('a' => 'A', 'b' => 'B'); $query = ''; foreach ($params as $param => $value) { $query .= $param.'='.$value .'&'; } echo substr($query, 0, -1); 

这也可以工作

 $fields = array( 'a' => 'A', 'b' => 'B' ); $separator = ''; foreach($fields as $key=>$value) { $fields_string .= $separator . $key . '=' . $value; $separator = '&'; }