web-dev-qa-db-ja.com

curl_setoptを使用して配列を投稿する

添付のコードは「注意:配列から文字列への変換...」を返しています。単に私の配列は「配列」単語を含む文字列としてリモートサーバーに処理されています。残りの変数は問題ありません。

配列を渡すにはどうすればよいですか$anarrayこの問題なし?

<?php

$data = array(
    'anarray' => $anarray,
    'var1' => $var1,
    'var2' => $var2
 );

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "MY_URL");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);

?>
18
Essam

http_build_query() を使用します

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
// The values of variables will be shown but since we don't have them this is what we get

その後、$_POSTスーパーグローバルを使用して通常どおりアクセスできます

30
John Conde

あなたが求めていることを達成するための最良の方法は、 http_build_query() を使用することです。

15
Eric Butera

から http://www.php.net/manual/en/function.curl-setopt.php CURLOPT_POSTFIELDSの説明

HTTP「POST」操作で投稿する完全なデータ。ファイルを投稿するには、ファイル名の前に@を付け、フルパスを使用します。ファイル名の後に「; type = mimetype」の形式のタイプを付けることにより、ファイルタイプを明示的に指定できます。このパラメーターは、「para1 = val1&para2 = val2&...」のようなurlencoded文字列として、またはフィールド名をキーとして、フィールドデータを値として持つ配列として渡すことができます。値が配列の場合、Content-Typeヘッダーはmultipart/form-dataに設定されます。 PHP 5.2.0以降、ファイルが@プレフィックス付きでこのオプションに渡される場合、値は配列である必要があります。

1
Tim Dearborn

HTTPプロトコルの性質、およびcurl_setopt関数の動作方法により、$ anarrayを配列として直接渡すことはできません。

次のステートメント:

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

POSTパラメータの配列を取り、それらのそれぞれに文字列名と[〜#〜] string [〜#〜]値が必要です。あなたは代わりに配列値を渡すので、PHPプロセッサは、前述の通知( "配列から文字列への変換]の発行を伴う、いくつかの不完全な組み込みアルゴリズムを使用して文字列に変換することを強制されますに...")。

したがって、その配列($ anarray)を反対側に適切に渡すには、(文字列への)エンコードを自分で処理する必要があり、反対側は(文字列からの)デコードを処理する必要があります。 )。

そのような状況での私のアプローチはJSONです。ほとんどの場合、十分に適しています。あなたがしなければならないのは、次のテクニックを適用することです:

$data=array(
    'anarray'=>json_encode($anarray),
    'var1'=>$var1,
    'var2'=>$var2
    );

次に、接続の反対側で、次の方法で元の配列を取得します。

$anarray=json_decode($_POST['anarray'],true); // true indicates for associative array rather than an object
1
James Cache

$ anarrayが配列である場合、私が思うに、そうではないはずです。連結または適切な方法で、文字列に変換します。

編集:エリックブテーラの答えを参照してください。

0
GZipp