php http_build_query 不转码,http_build_query()没有url编码

你可以对从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&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

针对多个版本的解决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 = '&'; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值