erreur dans formulaire CURL

Petit nouveau ! | 9 Messages

13 avr. 2010, 15:12

Bonjour,

Je tente de récupérer une page qui s'affiche normalement en validant un formulaire sur un site distant.
J'ai créé un formulaire en local qui fonctionne (quand je le valide, je récupère bien le résultat)
J'essaie de faire que ce formulaire soit envoyé par CURL pour en récupérer la page en retour dans une variable. Malheureusement, je n'arrive pas à le faire fonctionner.

Voici mon code, si qq1 trouve la différence entre les deux et peut m'expliquer mon erreur... ?
<FORM method='POST' action="http://notamweb.aviation-civile.gouv.fr/Script/IHM/Bul_Aerodrome.php">
<INPUT type='hidden' name='bResultat' value='true'>
		<INPUT type='hidden' name='bImpression' value=''>
		<INPUT type='hidden' name='ModeAffichage' value='COMPLET'>
		<INPUT type='text' name='AERO_Date_DATE' id='AERO_Date' value='2010/04/13'>
		<INPUT class='DesciptionCritere' name='AERO_Date_HEURE' value='15:00'>
		<INPUT type='hidden' name='AERO_Langue' value='FR'>
		<INPUT name='AERO_Duree' value='96'>
		<br />
		VFR/IFR<INPUT name='AERO_CM_REGLE' type='radio' value='1' ><br />
		IFR<INPUT name='AERO_CM_REGLE' type='radio' value='2' ><br />
		VFR<INPUT name='AERO_CM_REGLE' type='radio' value='3' checked><br />
		<br />
		<INPUT name='AERO_CM_GPS' type='radio' value='1' ><br />
		<INPUT name='AERO_CM_GPS' type='radio' value='2' checked ><br />
		<br />
		<INPUT name='AERO_CM_INFO_COMP' type='radio' value='1' checked ><br />
		<INPUT name='AERO_CM_INFO_COMP' type='radio' value='2' ><br />
		<br />
		<INPUT type='text' name='AERO_Tab_Aero[0]' size='7' maxlength='4' value='LFQO' ><br />
		<INPUT type='submit' value='Complet'>
		</FORM>
$post_data = array(
	'bResultat' => 'true',
	'bImpression' => '',
    'ModeAffichage' => 'COMPLET',
    'AERO_Date_DATE' => '2010/04/13',
    'AERO_Date_HEURE' => '15:00',
    'AERO_Langue' => 'FR',
    'AERO_Duree' => '96',
    'AERO_CM_REGLE' => '3',
    'AERO_CM_GPS' => '2',
    'AERO_CM_INFO_COMP' => '1',
    'AERO_Tab_Aero' => array(0 => 'LFQO')
);

print_r($post_data);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://notamweb.aviation-civile.gouv.fr/Script/IHM/Bul_Aerodrome.php");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADERS,array('Content-Type: multipart/form-data'));
$page = curl_exec($curl);
curl_close($curl);
echo $page;
Merci pour votre aide !

Epi

Mammouth du PHP | 661 Messages

13 avr. 2010, 15:45

je peux me tromper, mais j'ai pas le souvenir d'avoir utilisé :

curl_setopt($curl, CURLOPT_HTTPHEADERS,array('Content-Type: multipart/form-data'));

pour envoyer des données en POST via cUrl !... testes en virant cette ligne ;)

Petit nouveau ! | 9 Messages

13 avr. 2010, 15:52

Je l'ai enlevé, mais sans plus de résultat...

Pour être précis, je reçois bien la page du serveur distant, mais c'est une page d'erreur.
Je me dis que mon formulaire Curl doit être différent (en-tête, données POST ?) du formulaire html puisque sinon le serveur me renverrait la bonne page...

Eléphant du PHP | 245 Messages

13 avr. 2010, 18:52

curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
ça en tous cas ça ne va pas car ton post_data c'est un tableau alors que cela devrait être une chaine de caractères de la forme:

"var1=a&var2=b&var3=c";

tu peux utiliser la fonction http_build_query($tableau) pour transformer un tableau en requete HTTP, mais fais bien attention, il vaut mieux utiliser un tableau unidimensionnel pour cela (ce qui n'est pas le cas de ton $post_data me semble-t-il)

Du coup, retravailles ton $post_data pour qu'il soit unidimensionnel, puis transforme le en requete HTTP grace à http_build_query();
$post=http_build_query($post_data_unidimensionnel);
C'est cette variable que tu passera en paramètre CUROPT_POSTFIELDS

curl_setopt($curl, CURLOPT_POSTFIELDS, $post);

Petit nouveau ! | 9 Messages

19 avr. 2010, 22:30

Bonjour,

En fait je ne peux pas modifier ce qu'attend le serveur... donc un tableau multi-dimensionnel.

Y'a un truc, mais quoi... ?

ViPHP
ViPHP | 5462 Messages

19 avr. 2010, 22:34

Bonjour,

En fait je ne peux pas modifier ce qu'attend le serveur... donc un tableau multi-dimensionnel.

Y'a un truc, mais quoi... ?
tu modifies rien avec 'http_build_query', le tableau multidimensionnel est dedans quand même

Petit nouveau ! | 9 Messages

19 avr. 2010, 22:37

C'est fait, mais toujours sans le retour attendu du serveur.

ViPHP
ViPHP | 5462 Messages

19 avr. 2010, 22:40

C'est fait, mais toujours sans le retour attendu du serveur.
ta regardé les erreurs CURL ?
essaye de rajouter un CURLOPT_FOLLOWLOCATION

Petit nouveau ! | 9 Messages

19 avr. 2010, 22:42

Il ne faut pas inclure un bouton submit dans les données envoyées para hasard ???

Petit nouveau ! | 9 Messages

19 avr. 2010, 22:48

Voici le résultat :
http://www.eskapad.com/double/post_LFQO%20CURL.php

le script est le suivant :
$post_data = array(
	'bResultat' => 'true',
	'bImpression' => '',
    'ModeAffichage' => 'COMPLET',
    'AERO_Date_DATE' => date("Y/m/d"),
    'AERO_Date_HEURE' => date("H:m"),
    'AERO_Langue' => 'FR',
    'AERO_Duree' => '96',
    'AERO_CM_REGLE' => '3',
    'AERO_CM_GPS' => '2',
    'AERO_CM_INFO_COMP' => '1',
    'AERO_Tab_Aero'	=> array(0 => 'LFQO')
);

$post_data=http_build_query($post_data);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://notamweb.aviation-civile.gouv.fr/Script/IHM/Bul_Aerodrome.php");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,1);
$page = curl_exec($curl);
curl_close($curl);
echo $page;

ViPHP
ViPHP | 5462 Messages

19 avr. 2010, 22:49

la on a une erreur apache pas PHP

EDIT : il attend peu etre un User-Agent...
RE-EDIT : manque un user-agent :wink:
curl_setopt($curl, CURLOPT_USERAGENT, 'PHP');

Petit nouveau ! | 9 Messages

19 avr. 2010, 22:56

Toi, je t'aime !!

Merci, c'était ça !!

ViPHP
ViPHP | 5462 Messages

19 avr. 2010, 23:00

:wink:
apres si tu veux récupérer les données utiliseDomDocument