gpt4 book ai didi

php - 如何使用 Zend_Http_Client 模拟 POSTing 多个复选框表单字段 myField[]?

转载 作者:可可西里 更新时间:2023-11-01 16:31:06 26 4
gpt4 key购买 nike

我正在使用 Zend_Http_Client 将一组数据发布到我运行 PHP 的服务器。但是,服务器需要 myField[] 形式的数据,即我有一组复选框,用户可以选中多个。我当前的代码是:

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

然而,Zend_Http_Client 似乎只是在每次循环时用新值覆盖 myField[]。如何使用 Zend_Http_Client 添加多个 同名 的 POST 字段?


更新

我实际上已经想出了一个方法来做到这一点,通过破解 Zend_Http_Client 代码本身。然而,这并不理想。这是我的做法:

首先,我只是像这样将值添加到 POST 字段:

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

在函数 _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] -> [] 等:

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

我宁愿只使用 Zend_Http_Client 而不更改库代码,但这目前有效。如果有任何关于如何在不破坏库的情况下做到这一点的建议,我将不胜感激。

最佳答案

最简单的方法可能就是自己设置原始帖子正文:

$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() 的实现,如下所示。

此修改旨在与 future 的更新保持兼容,因此,调用父方法,除非设置了 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));

关于php - 如何使用 Zend_Http_Client 模拟 POSTing 多个复选框表单字段 myField[]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7399084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com