4

I'm having problems posting an array using PHP cURL. I have successfully posted other values to the same page using POST-variables. But this one is hard to figure out. The only problem is how I should present the data to the server.

I checked the original form using a form analyzer. And the form analyzer shows that the POST variables are sent like this:

array fundDistribution' => 
     array
        204891 => '20' (length=2)
        354290 => '20' (length=2)
        776401 => '20' (length=2)
        834788 => '40' (length=2)

The values are just for showing an example. But they will be the same length.

My problem is that the responding server does not recognise the values when I send them like this:

Array(
[104786] => 20
[354290] => 20
[865063] => 20
[204891] => 20
[834788] => 20)

My question is: How do I send the data so the server understands it?

Thank you!

4
  • You are not showing where the data comes from and how it takes the weird shape you show in your second example, so it's impossible to make any suggestions on how to change it Commented Oct 6, 2010 at 16:29
  • Sorry, I have edited the original post. Commented Oct 6, 2010 at 16:40
  • still need more code! Show us where this array is defined, and the cURL PHP functions where you send the data. Commented Oct 6, 2010 at 16:46
  • Similar post worked for me. I haven't tried Wrikken answer here. Commented Nov 7, 2014 at 9:37

4 Answers 4

3
function flatten_GP_array(array $var,$prefix = false){
        $return = array();
        foreach($var as $idx => $value){
                if(is_scalar($value)){
                        if($prefix){
                                $return[$prefix.'['.$idx.']'] = $value;
                        } else {
                                $return[$idx] = $value;
                        }
                } else {
                        $return = array_merge($return,flatten_GP_array($value,$prefix ? $prefix.'['.$idx.']' : $idx));
                }
        }
        return $return;
}
//...
curl_setopt($ch, CURLOPT_POSTFIELDS,flatten_GP_array($array));
Sign up to request clarification or add additional context in comments.

7 Comments

Thank you, what should I use as prefix? A "&" or "fundDistribution" ?
Nope, at the start, don't give a prefix, just leave the second parameter out of it. it's only meant to be set on recursion. I do however expect you to send an array('fundDistribution'=>array(...rest..)); as input.
Yes, and I get something like this: Array ( [fundDistribution[104786]] => 20 ... )
Hmm, that wording might be off. "I do expect you to" => "I expect that you" ;)
@Christopher: yup, and that is something cURL understands (it does not get multidimensional array, only flat ones, which this function makes).
|
3

As the Sepehr Lajevardi says, You should use:

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($your_array));

Comments

0

You need to set post to true. Then you can pass the associative array in the POSTFIELDS option. as shown below.

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $your_array);

2 Comments

Thank you for your answer! I have set a lot of options. Among those, the options that you refer to are set as well.
Passing an array to CURLOPT_POSTFIELDS changes the behavior of cURL a little. It will send the data as multiform/post-data and any parameters with a value that begins with '@' will be treated as filenames.
0

Try this:

function postVars($vars,$sep='&') {
    $str = '';
    foreach( $vars as $k => $v) {
        if(is_array($v)) {
            foreach($v as $vk=>$vi) {
                $str .= urlencode($k).'['.$vk.']'.'='.urlencode($vi).$sep;
            }
        } else {
            $str .= urlencode($k).'='.urlencode($v).$sep;
        }
    }
    return substr($str, 0, -1);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.