PHP(CI)cURL传递的多维数组的行为与一个数组不同(可以';t循环它)
当从POST cURL请求接收参数时,我遇到了一个extrange问题。无论我在发布之前如何编码(json、url、rawurl、utf8、base64…),我都无法通过循环通过数组元素执行任何解码操作。我会告诉你细节的 从消费控制器,在其他一些php(Yii)应用程序中,我构建了如下请求:PHP(CI)cURL传递的多维数组的行为与一个数组不同(可以';t循环它),php,post,curl,encoding,multidimensional-array,Php,Post,Curl,Encoding,Multidimensional Array,当从POST cURL请求接收参数时,我遇到了一个extrange问题。无论我在发布之前如何编码(json、url、rawurl、utf8、base64…),我都无法通过循环通过数组元素执行任何解码操作。我会告诉你细节的 从消费控制器,在其他一些php(Yii)应用程序中,我构建了如下请求: private function callTheApi($options) { $url = "http://api.call.com/url/api"; $params = array(
private function callTheApi($options)
{
$url = "http://api.call.com/url/api";
$params = array( 'api_key' => $this->api_key,
'domain' => $this->domain,
'date' => $options['date'],
'keys' => $options['keys'] // This is an array
);
// Following some good advice from Daniel Vandersluis here:
// http://stackoverflow.com/questions/3772096/posting-multidimensional-array-with-php-and-curl
if (is_array($params['keys'])
{
foreach ($params['keys'] as $id => $name)
{
$params['keys[' . $id . ']'] = $name;
}
unset($params['keys']);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: multipart/form-data; charset=utf-8'));
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_USERAGENT,
"Mozilla/5.0 (Windows; U; Windows NT 5.0; en; rv:1.9.0.4) "
. "Gecko/2009011913 Firefox/3.0.6");
$output = curl_exec($ch);
$error = curl_errno($ch);
$error_text = curl_error($ch);
curl_close($ch);
if (!$output || $error != 0)
die("<br><hr>Problems...<br>"
. "Line:" . __LINE__ . " dataExtractor.php<br>"
. "Error: " . $error . " - " . $error_text . "<hr>"
. $url . "<hr>");
sleep(1);
return json_decode($output, true);
}
好的,现在来看问题:
如果我把所有的事情都像之前说的那样留下,它就会起作用。我在api中有$keys数组,我可以随心所欲地使用它。“echo json_encode($keys)”语句返回的数组几乎与它应该返回的一样。但问题是数组的某些值在cURL操作中被损坏。西班牙语字符á、é、í、ó、ú或ü等值根本不存在于数组_值中
如果$keys数组中的某个键是原始数组中的西班牙语单词“alimentación”,那么一旦它被卷曲到api中,它就会变成“alimentacin”。在那里,太阳不再存在了
所以,我的机会是将数组中的每个值编码为一个安全传输的值,以便稍后对其进行解码。但是你知道什么,我不能
我尝试过urlencoding、rawurlencoding、json_编码、base64_编码。。。数组的每个值。如果我从api返回接收到的数组,它包含编码的值。但是
如果我在api中循环数组进行解码,然后尝试返回它,无论我对其值应用什么解码函数,输出总是“NULL”
我不知道我做错了什么。甚至不接近。
因此,任何帮助都将不胜感激。社区,请提前感谢。当您创建cUrl参数数组时,您应该知道键不能是utf8 当您在foreach循环中添加一些参数时
$params['keys[' . $id . ']'] = $name;
$id可以是utf8字符
为了避免这种情况,我建议您使用json_编码
$params = array(
'api_key' => $this->api_key,
'domain' => $this->domain,
'date' => $options['date'],
'keys' => json_encode($options['keys']) // This is an array
);
在您的api中,在这种情况下,您不应更改任何内容。感谢您花时间回答。我不能
json\u编码($options['keys']
因为,正如我所说,数组包含一些非utf8字符。所以我首先循环数组,utf8\u编码
每个值,然后在发布之前使用您的解决方案和json\u编码
。然后,在接收端,我有同样的问题。循环数组进行utf8\u解码返回NULL
。顺便说一下,同样的事情如果我使用urlencode/decode而不是utf8,则会发生以下情况:(
$params = array(
'api_key' => $this->api_key,
'domain' => $this->domain,
'date' => $options['date'],
'keys' => json_encode($options['keys']) // This is an array
);