何らかのRFC標準に従ってURLエンコードせずにhttp_build_query()
を使用する方法はありますか?
すべてをURLエンコードしたくないのはなぜですか。EbayAPIを照会しています。彼らは、括弧内のコンマまで、パラメーター名がURLエンコードされないことを正直に主張しています。例えば。 DomainName(0)はパラメーターであり、これらの括弧がエンコードされている場合、クエリは失敗します。
urldecode()
から取得する結果文字列に対して http_build_query()
functionを使用できます
いいえ、常にエンコードしたいようです(URLのパラメーターのリストを作成するときにURLエンコードする必要があります)。
あなたは自分で作ることができます...
$params = array('a' => 'A', 'b' => 'B');
$paramsJoined = array();
foreach($params as $param => $value) {
$paramsJoined[] = "$param=$value";
}
$query = implode('&', $paramsJoined);
CodePad 。
PHP 5.3.1(バギー動作) http_build_query [〜#〜] does [〜#〜]パラメーターを結合する「&」アンパサンド文字をエスケープします。例:user_id=1&setting_id=2
。
PHP 5.4 + http_build_query DOES NOTパラメータを結合する「&」アンパサンド文字をエスケープします。例: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
オプション#1:ラッパー関数を作成します。
/**
* This will work consistently and will never escape the '&' character
*/
function buildQuery($params) {
return http_build_query($params, '', '&');
}
オプション#2: http_build_query関数を捨てて、独自に記述します。
代わりにJSON APIを試してみてください。動作するサンプルを取得しようとしましたが、アプリ名がないため、結果を確認できません。コードは次のとおりです。
<?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なしでは無効です。たぶんあなたはそれを誤って二重にエンコードしていますか?たとえば、この配列のhttpクエリを作成してみてください。
$params = array('a' => 'a&b=b');
エンコードしないと、
a=a&b=b
適切にエンコードされると、
a=a%26b%3Db
どちらが正しい。エンコードをスキップする場合は、URLインジェクション攻撃を避けてください。
rldecode() を使用できます。または、$ 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:配列インデックスが数字の場合、この文字列は各インデックスのプレフィックスとして追加されます。この場合、「test_0 = bar」。
arg_separator:引数を区切るために使用されます。 nonにphpが指定されている場合は、php.iniで定義されたarg_separator.outputを使用します
php http_build_query を参照してください
これも動作する可能性があります
$fields = array(
'a' => 'A',
'b' => 'B'
);
$separator = '';
foreach($fields as $key=>$value) {
$fields_string .= $separator . $key . '=' . $value;
$separator = '&';
}
最近これを試しました https://Gist.github.com/marcocesarato/4293986fe93139f04d8269aa3fbd47e9 違いは、この関数が再帰的配列であり、PHP4と互換性があることです。ここでurlencodeを管理できます
<?php
/**
* Build URL query params
* as http_build_query build a query url the difference is
* that this function is array recursive and compatible with PHP4
*
* @author Marco Cesarato <[email protected]>
* @param $query
* @param string $parent
* @return string
*
* @example
* $p = array('abbreviations' => array('google' => 'ggle', 'facebook' => array('abb_key' => 'fbook', 'fcbk')), 'key' => 'value');
* echo url_build_query($p);
*/
function url_build_query($query, $parent = null){
$query_array = array();
foreach($query as $key => $value){
$_key = empty($parent) ? urlencode($key) : $parent . '[' . urlencode($key) . ']';
if(is_array($value)) {
$query_array[] = url_build_query($value, $_key);
} else {
$query_array[] = $_key . '=' . urlencode($value);
}
}
return implode('&', $query_array);
}
私はこのようなURLの末尾にそれを添付するGET文字列を作成しようとしていました-
$get_params = array(
'include' => array(
'enrollments',
'current_grading_period_scores'
),
'enrollment_type' => array(
'student',
),
);
$get_params = http_build_query($get_params);
$get_params = urldecode($get_params);
$url = $domain.$slug;
$url = $url.'?'.$get_params;
echo $url;
印刷する
include[0]=enrollments&include[1]=current_grading_period_scores&enrollment_type[0]=student
しかし、私のapiは角括弧内の数字が気に入らなかったので、数字を削除する正規表現を見つけました-
preg_replace('/[[0-9]+]/', '[]', $get_params);
最終的なコードと結果-
$get_params = array(
'include' => array(
'enrollments',
'current_grading_period_scores'
),
'enrollment_type' => array(
'student',
),
);
$get_params = http_build_query($get_params);
$get_params = urldecode($get_params);
$get_params = preg_replace('/[[0-9]+]/', '[]', $get_params);
$url = $domain.$slug;
$url = $url.'?'.$get_params;
echo $url;
プリントアウト-
include[]=enrollments&include[]=current_grading_period_scores&enrollment_type[]=student
誰かがより良い正規表現を知っていれば私に知らせてくれれば、私はそれを知っている。
私のアレックスの答えを受け入れますが、より速いです
$params = array('a' => 'A', 'b' => 'B');
$query = '';
foreach ($params as $param => $value) {
$query .= $param.'='.$value .'&';
}
echo substr($query, 0, -1);