cURL, POSTFIELDS et name[].

ViPHP
ViPHP | 4674 Messages

21 juil. 2008, 16:14

Hey :),

Je suis bloqué sur un truc de fou furieux. Soit j'ai rien compris à l'histoire, soit les types qui ont conçu cURL ont oublié une énorme partie …

J'ai une page qui reçoit des données POST directement depuis un formulaire. Je dois effectuer des traitements et les renvoyer sur une autre page en POST. Bon, je fais un truc du genre :
$post = /* traitement de $_POST */;

$c = curl_init('http://localhost/Dir/FormHandler.php');
curl_setopt($c, CURLOPT_HEADER,         false);
curl_setopt($c, CURLOPT_POST,           true);
curl_setopt($c, CURLOPT_POSTFIELDS,     $post);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$o = curl_exec($c);
curl_close($c);

var_dump($o);
Ça c'est ok, mais attention, imaginons un instant que j'utilise name="truc[]" dans mon formulaire. Je vais forcément avoir un tableau de tableau. Comme $post sera converti en chaîne, c'est à dire que Array(a => b, c => d) sera converti vers a=b&c=d, comment on fait pour convertir un tableau de tableau en chaîne ? Et bin on ne peut pas …

Alors là je sèche un peu. J'ai essayé plusieurs choses, j'ai bien du mal.

S'il n'y a pas de solution, je pensais me rabattre sur fsockopen et fputs (à l'ancienne ;-)) et j'écrirais toutes mes en-têtes manuellement, mais utiliser cURL serait tout de même plus simple non ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Alf
Eléphanteau du PHP | 24 Messages

23 juil. 2008, 23:01

comment on fait pour convertir un tableau de tableau en chaîne ?
Si j'ai bien compris ton probléme alors j'ai trouvé ça.
Avec WDDX http://fr2.php.net/manual/fr/book.wddx.php
Tu peut sérialiser des tableaux entre autres et dé sérialiser aussi vite.
<?php

$h_panier = array ( "fruits" => array ( "a" => "orange", "b" => "babanes", "c" => "pommes" ),
                    "cereales" => array ( "a" => "mais", "b" => "ble", "c" => "orge" ) );

$o_wddx = wddx_packet_start("panier");
wddx_add_vars($o_wddx, "h_panier");
$s_panier = wddx_packet_end($o_wddx);

echo $s_panier;

?>
donne une chaine XML sans fioritures
<wddxPacket version='1.0'><header><comment>panier</comment></header><data>...</data></wddxPacket>
et aprés un Tidy

Code : Tout sélectionner

<wddxPacket version='1.0'> <header> <comment>panier</comment> </header> <data> <struct> <var name='h_panier'> <struct> <var name='fruits'> <struct> <var name='a'> <string>orange</string> </var> <var name='b'> <string>babanes</string> </var> <var name='c'> <string>pommes</string> </var> </struct> </var> <var name='cereales'> <struct> <var name='a'> <string>mais</string> </var> <var name='b'> <string>ble</string> </var> <var name='c'> <string>orge</string> </var> </struct> </var> </struct> </var> </struct> </data> </wddxPacket>
Une petite question sur ta fonction curl, elle fait une requette http en envoyant des données post au serveur et sort le le resultat sous formes de chaine, c'est ça ?
Pas pro du dev, mais pas débutant non plus, je suis attentif à la qualité de mon code dans la mesure de mes connaissances.

ViPHP
ViPHP | 5924 Messages

23 juil. 2008, 23:40

Essaye var[machin]=truc&var[machin2]=truc2…

Mammouth du PHP | 19672 Messages

24 juil. 2008, 17:53

:idea: Et pourquoi pas sérialiser ton tableau en JSON (json_encode() ), envoyer la chaine et faire l'opération inverse à l'arrivée (json_decode()) ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 4674 Messages

24 juil. 2008, 23:51

Hey :),

Alors, WDDX n'est pas installé sur toutes les machines, et je dois faire un script exportable, donc solution à écarter.

J'ai pensé à JSON, mais trop tard, j'avais déjà refait tout mon code version manuel (fsockopen, et tout le toutime).

Mais sinon, bravo à Sékil, ça marche. Je n'y avais pas pensé du tout alors que pourtant … c'est tout bête :roll:.
Voici le test : a.php :
<?php

header('Content-type: text/plain');

$c = curl_init();
$d = 'a=b&c=d&var[machin]=truc&var[bidule]=chose';

curl_setopt($c, CURLOPT_URL, 'http://domain.tld/curl/b.php');
curl_setopt($c, CURLOPT_HEADER, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_VERBOSE, true);
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $d);

$out = curl_exec($c);
var_dump($out);

curl_close($c);
Et la page qui reçoit les données b.php :
<?php

header('Content-type: text/plain');

echo 'hello' . "\n";

print_r($_POST);
Ça marche donc. Ne pas oublier d'encoder l'ensemble des clés et valeurs avec url_encode().

Voilà, merci :). Sujet résolu ;-).
J'ai toutefois une dernière question : pensez-vous que CURL est présent sur la majorité des plates-formes ? J'ai réalisé le script via fsockopen pour être vraiment sûr, mais je suis presque persuadé que CURL est disponible partout (sur toutes les plates-formes professionnelles digne de ce nom du moins …).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

25 juil. 2008, 00:25

Mais sinon, bravo à Sékil, ça marche.
Facile :p