50 votes

Affichage de tableaux multidimensionnels avec PHP et CURL

Je vais avoir du mal à enregistrer les données de formulaire via CURL à un récepteur script PHP situé sur un hôte différent.

Je reçois un Array to string conversion d'erreur

C'est - print_r de la matrice, je vais l'afficher:

Array
(
    [name] => Array
    (
        [0] => Jason
        [1] => Mary
        [2] => Lucy
    )
    [id] => 12
    [status] => local
    [file] => @/test.txt
)

C'est la ligne de l'erreur se produit sur:

curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post);

Le troisième argument doit être un tableau parce que j'ai besoin de l' Content-Type - tête pour être mis à l' multipart/form-data que je suis l'envoi d'un fichier par l'intermédiaire de ce même tableau, donc je ne peut pas convertir le tableau à une chaîne de requête ou de l'utilisation http_build_query().

Aussi je n'ai pas accès au code sur la réception d'accueil donc je ne peux pas serialize et unserialize le tableau.

Je suis en supposant que la valeur du nom de la clé d'un tableau est la cause de cette erreur, je suis aussi en supposant qu' CURLOPT_POSTFIELDS ne prend pas en charge les tableaux multidimensionnels. Est-il un autre moyen de contourner ce problème ou suis-je condamné?

Merci à l'avance!

33voto

Khristenko Yura Points 131
function http_build_query_for_curl( $arrays, &$new = array(), $prefix = null ) {

    if ( is_object( $arrays ) ) {
        $arrays = get_object_vars( $arrays );
    }

    foreach ( $arrays AS $key => $value ) {
        $k = isset( $prefix ) ? $prefix . '[' . $key . ']' : $key;
        if ( is_array( $value ) OR is_object( $value )  ) {
            http_build_query_for_curl( $value, $new, $k );
        } else {
            $new[$k] = $value;
        }
    }
}

$arrays = array(
    'name' => array(
        'first' => array(
            'Natali', 'Yura'
        )
    )
);


http_build_query_for_curl( $arrays, $post );

print_r($post);

29voto

Daniel Vandersluis Points 30498

Le concept d'un tableau n'existe pas vraiment quand il s'agit de requêtes HTTP. PHP (et probablement d'autres langages côté serveur) a la logique cuit qui peut prendre les données de la demande qui ressemble à un tableau (à elle), et les met ensemble comme un tableau pendant le remplissage $_GET, $_POST etc.

Par exemple, lorsque vous postez un tableau à partir d'une forme, la forme des éléments souvent ressembler à quelque chose comme ceci:

<form ...>
  <input name="my_array[0]">
  <input name="my_array[1]">
  <input name="my_array[2]">
</form>

ou encore:

<form ...>
  <input name="my_array[]">
  <input name="my_array[]">
  <input name="my_array[]">
</form>

Alors que le PHP ne sait pas quoi faire avec ces données lorsqu'il la reçoit (ie. construire un tableau), HTML et HTTP, vous disposez de trois entrées indépendantes qui se sont semblables (ou le même, bien que ce ne soit pas techniquement valide en HTML) les noms.

Pour faire l'inverse pour votre demande cURL, vous avez besoin de décomposer votre tableau en chaîne de représentations des clés. Donc, avec votre name tableau, vous pourriez faire quelque chose comme:

foreach ($post['name'] as $id => $name)
{
  $post['name[' . $id . ']'] = $name;
}
unset($post['name']);

Ce qui aurait pour résultat de votre $post tableau qui ressemble à:

Array
(
    [name[0]] => Jason
    [name[1]] => Mary
    [name[2]] => Lucy
    [id] => 12
    [status] => local
    [file] => @/test.txt
)

Et puis chaque clé du tableau, vous êtes publication pourrait être un scalaire valeur, qui cURL est l'attente, et le tableau serait représenté comme vous avez besoin de pour HTTP.

27voto

Marc B Points 195501

Vous devez construire la chaîne POST manuellement, plutôt que de passer l'ensemble du tableau po Vous pouvez ensuite remplacer l'en-tête de contenu auto-choisi de curl avec :

Serializing / json-ifying serait plus facile, mais comme vous le dites, vous n'avez aucun contrôle sur l'extrémité de réception, de sorte que vous avez un peu de travail supplémentaire à faire.

0voto

Alex Howansky Points 16820

Je pense que vous aurez besoin de passer les options comme une chaîne:

Vous devriez alors être en mesure de régler l'en-tête manuellement via CURLOPT-HTTPHEADER.

-1voto

Farzad Points 1
$post = "ac=on&p=1&pr[]=0&pr[]=1&a[]=3&a[]=4&pl=on&sp[]=3&ct[]=3&s=1&o=0&pp=3&sortBy=date";
parse_str($post,$fields); 

$url = 'http://example.com/';


//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X