2

Zend_Http_Client を使用して、一連のデータを PHP を実行しているサーバーに POST しています。ただし、サーバーはフォームのデータを期待していますmyField[]。つまり、一連のチェックボックスがあり、ユーザーは複数のチェックボックスをオンにできます。私の現在のコードは次のとおりです。

   foreach ($myValues as $value) {
    $this->client->setParameterPost('myField[]', $value);
   }

ただし、Zend_Http_Client は、ループを通過するたびに新しい値で単純に上書きしているようです。 Zend_Http_Client を使用して同じ名前myField[]の複数の POST フィールドを追加するにはどうすればよいですか?


アップデート

Zend_Http_Client コード自体をハッキングすることで、実際にこれを行う方法を見つけました。ただし、これは理想的ではありません。これが私がそれをした方法です:

まず、次のように POST フィールドに値を追加するだけです。

$myValues = array(0,1,2);
$this->client->setParameterPost('myField', $myValues);

function_prepareBody()では、Zend_Http_Client が次のコードを使用して POST データを作成します。

  $body = http_build_query($this->paramsPost, '', '&');

ビルドする POST データを見ると、次のようになります。

myField[0]=0&myField[1]=1&myField[2]=2

もちろん、url エンコードされているので、次のようになります。

myField%5B0%5D=0&myField%5B1%5D=1&myField%5B2%D=2

preg_replaceそのため、[0] -> []、[1] -> [] などを作成するためにa を追加しました。

$body = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '%5B%5D=', $body);

ライブラリ コードを変更せずに Zend_Http_Client を使用したいのですが、今のところこれで問題ありません。ライブラリをハッキングせずにそれを行う方法についての提案に非常に感謝しています。

4

1 に答える 1

3

最も簡単な方法は、生の投稿本文を自分で設定することです。

$values = array(
    0,
    1,
    2,
);

$key = 'myField';
$rawData = '';
foreach ($values as $value) {
    if ($rawData !== '') {
        $rawData .= '&';
    }
    $rawData .= $key . '%5B%5D=' . $value;
}

$client = new Zend_Http_Client();
$client->setRawData($rawData);
$client->setUri('http://www.davidcaunt.co.uk/');
$client->request(Zend_Http_Client::POST);

$request = $client->getLastRequest();

//Zend_Debug::dump($request);
Zend_Debug::dump(urldecode($request));

投稿データ

myField[]=0&myField[]=1&myField[]=2

postdata で送信する他の変数がある場合は、Zend_Http_Client をサブクラス化し、次のように実装をオーバーライドする必要があります_prepareBody()

この変更は、将来の更新との互換性を維持することを目的としているため、POST パラメータが設定されていない限り親メソッドを呼び出し、フォームはマルチパート (ファイルのアップロード) ではありません。

class My_Http_Client extends Zend_Http_Client
{

    function _prepareBody() 
    {
        if (count($this->paramsPost) > 0 && $this->enctype == self::ENC_URLENCODED) {
            $this->setHeaders(self::CONTENT_TYPE, self::ENC_URLENCODED);

            $body = '';
            foreach ($this->paramsPost as $key => $value) {

                if (is_array($value)) {
                    foreach ($value as $v) {
                        $body .= $key . '%5B%5D=' . $v . '&';
                    }
                } else {
                    $body .= $key . '=' . $value . '&';
                }               
            }

            return rtrim($body, '&');
        }

        return parent::_prepareBody();
    }
}

使用法

$client = new My_Http_Client();
$client->setParameterPost('name', 'John');
$client->setParameterPost('myField', array(0,1,2));
$client->setUri('http://www.davidcaunt.co.uk/');
$client->request(Zend_Http_Client::POST);

$request = $client->getLastRequest();

Zend_Debug::dump(urldecode($request));
于 2011-09-13T19:39:46.103 に答える