[RESOLU] Connexion à une autre base de donnée

Eléphant du PHP | 418 Messages

23 nov. 2012, 00:37

J'ai modifier la page panier.php qui envoie le formulaire sur le site local.

panier.php site local
	$total = $_POST['total'];
	// print_r ($_POST['itesm_id']);
	if (!empty($total)){
		/*Initialisation de la ressource curl*/
		$c = curl_init();
		curl_setopt($c, CURLOPT_URL, 'http://monsitedistant.org/panier.php');
		/*On indique à curl de nous retourner le contenu de la requête plutôt que de l'afficher*/
		curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
		/*On indique à curl de ne pas retourner les headers http de la réponse dans la chaine de retour*/
		curl_setopt($c, CURLOPT_HEADER, false);
		/*On indique à curl d'envoyer une requête post*/
		curl_setopt($c, CURLOPT_POST,true);
		/*On donne les paramètre de la requête post*/
		curl_setopt($c, CURLOPT_POSTFIELDS,array('users_name'=>USERS_NAME,'quantity'=>array($_POST['quantity']),'itesm_id'=>array($_POST['itesm_id']),'total'=>$_POST['total']));
		/*On exécute la requête*/
		$output = curl_exec($c);
		/*On a une erreur alors on la lève*/
		if($output === false)
		{
			trigger_error('Erreur curl : '.curl_error($c),E_USER_WARNING);
		}
		/*Si tout c'est bien passé on affiche le contenu de la requête*/
		else
		{
                        // on visualise le résultat sous forme structurées, afin de mieux débuger
			var_dump($output);
		}
		/*On ferme la ressource*/
		curl_close($c);
	}else{
		alerte('Sélectionnez des produits avant de valider votre panier!');
	}
Sur la page distante, je récupère bien la valeur du nom et du total, mais quantity et item_id sont des tableau, et ils me retournent array.

panier.php site distant:
$table = $_POST;
foreach ($table as $v => $k){
	if (preg_match('#quantity#i', $v) OR preg_match('#itesm_id#i', $v)){
		foreach ($k as $val => $key){
			echo $val.'<br />';
		}
		print_r ($k);
	}
	echo '<p>'.$v.' -> '.$k.'</p>';
}
Pourriez vous m'aider à comprendre ce qui ne va pas svp?

Edit: voici le résulat affichée avec un print_r de $table:

Code : Tout sélectionner

string(103) "Array ( [users_name] => Fre3z69 [quantity] => Array [itesm_id] => Array [total] => 4 ) "
Merci beaucoup

Cordialement

Avatar du membre
Mammouth du PHP | 1609 Messages

23 nov. 2012, 02:01

Tu n'aurais pas ajouté quelques array() de trop ?
// avant
curl_setopt($c, CURLOPT_POSTFIELDS,array('users_name'=>USERS_NAME,'quantity'=>array($_POST['quantity']),'itesm_id'=>array($_POST['itesm_id']),'total'=>$_POST['total']));
// apres
curl_setopt($c, CURLOPT_POSTFIELDS, array('users_name' => USERS_NAME, 'quantity' => $_POST['quantity'], 'itesm_id' => $_POST['itesm_id'], 'total' => $_POST['total']));
Au pire si c'est pas possible d'envoyer un tableau tu peux utiliser serialize et unserialize.
Développeur web depuis + de 20 ans

Eléphant du PHP | 418 Messages

23 nov. 2012, 02:29

Je sais pas si c'est la bonne méthode, mais j'ai fait un foreach sur le site local, et j'ai mit le script qui envoie les données dans le foreach
$itid = $_POST['itesm_id'];
$qnt = $_POST['quantity'];
$table = array_combine ($itid, $qnt);
foreach ($table as $v => $q){
		/*Initialisation de la ressource curl*/
		$c = curl_init();
		curl_setopt($c, CURLOPT_URL, 'http://fantasycompany.mtxserv.fr/includes/panier.php');
		/*On indique à curl de nous retourner le contenu de la requête plutôt que de l'afficher*/
		curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
		/*On indique à curl de ne pas retourner les headers http de la réponse dans la chaine de retour*/
		curl_setopt($c, CURLOPT_HEADER, false);
		/*On indique à curl d'envoyer une requete post*/
		curl_setopt($c, CURLOPT_POST,true);
		/*On ddonne les paramètre de la requête post*/
		curl_setopt($c, CURLOPT_POSTFIELDS,array('users_name'=>USERS_NAME,'quantity'=>$v,'itesm_id'=>$q));		/*On exécute la requête*/
		$output = curl_exec($c);
		/*On a une erreur alors on la lève*/
		if($output === false)
		{
			trigger_error('Erreur curl : '.curl_error($c),E_USER_WARNING);
		}
		/*Si tout c'est bien passé on affiche le contenu de la requête*/
		else
		{
			//on affiche le résultat de la page distante, peux importe le résultat de l'envoie
			echo $output;
		}
		/*On ferme la ressource*/
		curl_close($c);
}
Sur le site distant, j'ai créer une autre foreach et j'affiche le résultat.
$table = $_POST;
echo $_POST['items_id'];
foreach ($table as $v => $k){
	echo '<p>'.$v.' -> '.$k.'</p>'; 
}
J'ai ce que je veux, sauf que ...

Comment je peux récupérer les infos pour les insérer en BDD?

Merci de votre aide

Avatar du membre
Mammouth du PHP | 1609 Messages

23 nov. 2012, 10:28

Plutot qu'une boucle tu peux sérialiser ton tableau avant de l'envoyer et le désérialiser à la réception sur le deuxième serveur. Peut être même qu'un http_build_query suffirait (sans avoir besoin de désérialiser à la réception).
Sinon pas sur d'avoir compris ta dernière question : "Comment je peux récupérer les infos pour les insérer en BDD?"
Tu viens justement de les transmettre au deuxième serveur, donc tu n'as plus qu'à faire tes requête d'insert, update, etc non ?
Développeur web depuis + de 20 ans

Eléphant du PHP | 418 Messages

24 nov. 2012, 06:12

Salut, bin justement

J'ai un système de panier, avec plusieurs articles et pour chaque articles une quantité différente.

Je sais pas trop, mis à part un foreach, comment faire pour récupérer tous mes articles.

J'ai penser à le faire en traitement (sur le site distant), mais je n'arrivais pas à fournir les tableaux.

Comment pourrais-je faire?

Merci beaucoup

Cordialement

Avatar du membre
Mammouth du PHP | 1609 Messages

24 nov. 2012, 13:45

Coucou, ça fait déjà 2 fois que je te donne une solution (à priori), alors je vais le redire une troisième fois. ^^
Tu sérialises tes tableaux avant envoi et tu désérialises après réception.
Fonctions serialize et unserialize.

PS : c'est en admettant que les tableaux ne passent pas dans les post fields de cURL ce que je n'ai pas vérifié par moi même et dont je ne me souviens pas de tête.
EDIT : et j'oubliais aussi la possibilité d'utiliser la fonction http_build_query aussi qui permettrait à priori de n'avoir aucun traitement particulier à faire à la réception et serait donc la meilleur solution !
Développeur web depuis + de 20 ans

Eléphant du PHP | 418 Messages

24 nov. 2012, 15:35

Voici ce que j'ai fait, j'ai très certainement dû me tromper, mais je ne vois pas où:

Sur le site local, dans panier.php, après appuie sur le bouton "Valider"
	if (!empty($total)){
$itid = serialize($_POST['itesm_id']);
$qnt = serialize($_POST['quantity']);
$msg = false;
		/*Initialisation de la ressource curl*/
		$c = curl_init();
		curl_setopt($c, CURLOPT_URL, 'http://monsitedistant.fr/panier.php');
		/*On indique à curl de nous retourner le contenu de la requête plutôt que de l'afficher*/
		curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
		/*On indique à curl de ne pas retourner les headers http de la réponse dans la chaine de retour*/
		curl_setopt($c, CURLOPT_HEADER, false);
		/*On indique à curl d'envoyer une requete post*/
		curl_setopt($c, CURLOPT_POST,true);
		/*On ddonne les paramètre de la requête post*/
		curl_setopt($c, CURLOPT_POSTFIELDS,array('owner'=>USERS_NAME,'count'=>$qnt,'item'=>$itid));		/*On exécute la requête*/
		$output = curl_exec($c);
		/*On a une erreur alors on la lève*/
		if($output === false)
		{
			trigger_error('Erreur curl : '.curl_error($c),E_USER_WARNING);
			exit;
		}
		/*Si tout c'est bien passé on affiche le contenu de la requête*/
		else
		{
			//on affiche le résultat de la page distante, peux importe le résultat de l'envoie
			echo $output;
			if (!preg_match('#à bien été ajouté#i', $output))
			{
				$msg = true;
			} 
		}
		/*On ferme la ressource*/
		curl_close($c);
}
Script permettant de récupérer les données sur le site distant. (testé aussi bien avec unserialize que http_build_query
	$item = $_POST['item'];
	$count = $_POST['count'];
$item = unserialize($_POST['item']);
$count = unserialize($_POST['count']);
		$table = array_combine ($item, $count);
		foreach ($table as $v => $q){
			echo $v.' '.$q;
		}

Le résultat:

Code : Tout sélectionner

Warning: array_combine() expects parameter 1 to be array, boolean given in /var/www/monsitedistant.fr/panier.php on line 25 Warning: Invalid argument supplied for foreach() in /var/www/monsitedistant.fr/panier.php on line 26
Merci de votre aide

Cordialement

Avatar du membre
Mammouth du PHP | 1609 Messages

24 nov. 2012, 15:41

Affiche nous les contenus de $_POST['itesm_id'] et $_POST['quantity'] avant envoi et après réception et privilégie le http_build_query.
Logiquement cela devrait suffir :
curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($_POST));
Quand tu lis cette erreur , tu te dis quoi ?
Warning: array_combine() expects parameter 1 to be array, boolean given in /var/www/monsitedistant.fr/panier.php on line 25
Tableau attendu en paramètre 1, booléen donnée.
Tu devrais comprendre qu'il y a un problème avec ta variable $item qui est égal à true ou false (un booléen quoi) et donc que tu as un problème avec $_POST['item'] et tu devrais donc la vérifier avant et après réception pour comprendre pourquoi tu n'as pas le tableau que tu espères... think !
Développeur web depuis + de 20 ans

Eléphant du PHP | 418 Messages

24 nov. 2012, 16:04

Alors
print_r($_POST['itesm_id']);   donne : Array ( [0] => 330 [1] => 324 ) 
print_r($_POST['quantity']);   donne : Array ( [0] => 1 [1] => 1 ) 
Après réception des données envoyées via http_build_query() comme tu me l'a indiqué
Array ( [quantity] => Array ( [0] => 1 [1] => 1 ) [itesm_id] => Array ( [0] => 330 [1] => 324 ) [total] => 4 [valider] => Valider )
Je dois récupérer le pseudo, tu me conseil de le mettre en <imput type="hidden"> avant de valider le formulaire, ou tu connais une autre solution?

En tout cas merci, je récupère mes données comme si j'étais sur le même site, ce qui m'avance énormément ^^.

Merci beaucoup

Cordialement

Avatar du membre
Mammouth du PHP | 1609 Messages

24 nov. 2012, 16:08

L'input hidden c'est simple, mais c'est facile de modifier sa valeur avant de cliquer sur le bouton valider.
Donc si c'est juste à titre indicatif oui mais si c'est pour trouver le bon user sur la base distante non.
Récupère le dans le code avant de le transmettre à cURL. Pour ça injecte le dans $_POST avant le http_build_query (je suppose que l'information doit être dans tes variables de session).
Développeur web depuis + de 20 ans

Eléphant du PHP | 418 Messages

24 nov. 2012, 16:13

oui c'est en session, mais pour l'injecter, puis je faire par exemple, $_POST['name']=USERS_ID?

Merci beaucoup

Cordialement

Avatar du membre
Mammouth du PHP | 1609 Messages

24 nov. 2012, 16:21

As tu pris la peine d'essayer ?
$_POST['name'] = USERS_ID;
print_r($_POST);
Développeur web depuis + de 20 ans

Eléphant du PHP | 418 Messages

24 nov. 2012, 16:47

J'ai posté et testé ^^ désolé, trop hâtif, mais s'était dans le cas où.

Bon tout fonctionne, merci beaucoup pour ton aide, me reste à supprimer le panier et à déduire la somme, ce qui devrais pas trop poser de problème.

Merci beaucoup

Cordialement

Eléphant du PHP | 418 Messages

24 nov. 2012, 16:52

Une question bête, puis je créer une session depuis mon site distant, et l'affichée sur le site local?

Ou y a t'il moyen de traiter les infos comme le panier et autre, sur le site local en fonction du retour du site distant?

Merci

Avatar du membre
Mammouth du PHP | 1609 Messages

24 nov. 2012, 17:03

A priori je dirai que tu peux, à la fin du traitement sur le serveur distant, afficher des données que tu vas traiter ensuite à partir du return du curl_exec.
Tout est imaginable à partir de la. Tu peux tenter par exemple quelque chose dans le style : echo un http_build_query($_SESSION) et de l'autre côté faire un $_SESSION = parse_str($return_curl_exec).
Le code n'est peut être pas fonctionnel mais manquerait pas grand chose pour qu'il le soit dans ce cas. Par contre écraser la session comme ça c'est plutôt sauvage.
Développeur web depuis + de 20 ans