php - Array 2 string conversion while using CURLOPT_POSTFIELDS

Solution:
Are some values of$postfields
arrays themselves? This is most likely what's causing the notice.curl_setops
expects its third parameter to be an array whose keys and values are strings, as is stated in PHP's manual page for the function, though it might not be very clear:
This parameter can either be passed as a urlencoded string like 'para1=val1¶2=val2&...' or as an array with the field name as key and field data as value.
In this quote, the key point is that para1/2 and val1/2 are strings, and if you want, you can provide them as an array where keys are para1 and para2, and values are val1 and val2.
There are two ways to eliminate the notices.
The first is to usehttp_build_query()
and replace your uses of@filepath
by CURLFile objects. This is only possible if you're using PHP 5.5 or above, unfortunately. The manual's page has a pretty clear and simple example of use.
If using CURLFiles is not an option for you, then the second way is tojson_encode()
the values of your$postfields
array which are arrays themselves. This isn't elegant, and it requires you to decode the JSON on the other side.
Answer
Solution:
j11e's answer won't work if you want to send multidimensional arrays
Try this recursive function.
https://gist.github.com/yisraeldov/ec29d520062575c204be7ab71d3ecd2f
<?php
function build_post_fields( $data,$existingKeys='',&$returnArray=[]){
if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
And you can use it like this.
curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));
Answer
Solution:
Using Laravel one thing that worked for me was to use the tag 'Content-Type: application/json' in the request header, and sending my data json encoded like this:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
In the function that receives the parameters in the request I had no need to use the json decode function, I access to the parameters just like
$request->something
Answer
Solution:
After research for an hour, here the way i fixed my code:
$strVar = '';
if ($data) {
$ea = build_post_fields($data);
foreach($ea as $key=>$val) {
$strVar.= "$key=$val&";
}
}
/* eCurl */
$curl = curl_init($url);
/* Set Array data to POST */
curl_setopt( $curl, CURLOPT_POSTFIELDS, ($strVar) );
And here is the function I take from @Yisrael Dov below:
function build_post_fields( $data, $existingKeys='', $returnArray=[]){
if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
That work perfectly! You can post a deep array like:
$post_var = array(
'people' => array('Lam', 'Hien', 'Nhi'),
'age' => array(12, 22, 25)
);
Good day!
Share solution ↓
Additional Information:
Link To Answer People are also looking for solutions of the problem: trying to access array offset on value of type bool
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.