Récupération du contenu $_GET

Eléphanteau du PHP | 20 Messages

08 nov. 2007, 12:38

Bonjour, j'ai créé un panier virtuel et j'ai un soucis avec un formulaire qui affiche, à l'aide d'une boucle while, différents articles de ma DB.
<form name="commande" action="commande.php" method="get" enctype="multipart/form-data">
  <table width="500" border="0" cellspacing="0" cellpadding="0">
	<tr><td>
	  <table width="350" border="0" cellspacing="0" cellpadding="0">
		<tr>
		  <td width="130">&nbsp;</td>
		  <td width="80" align="center">Prix</td>
		  <td width="70" align="center">Quantité</td>
		</tr>
	<?php while ($row = mysql_fetch_array($result)) { ?>
		<tr>
		<?php echo ('<input type="hidden" name="id_article" value="'.$row['id'].'">'); ?>
		<?php echo ('<input type="hidden" name="nom" value="'.$row['nom'].'">'); ?>
		<?php echo ('<input type="hidden" name="prix" value="'.$row['prix'].'">'); ?>
		  <td width="130" height="30"><span class="choix"><?php echo $row['nom'] ?></span></td>
		  <td align="right"><?php echo $row['prix']; ?> €</td>
		  <td align="center"><input type="text" name="quantite" value="" size="2" maxlength="2" align=""></td>
		</tr>
	<?php } ?>
	  </table>
	</td>
	<td>
	  <table width="150" border="0" cellspacing="0" cellpadding="0">
		<tr><td><INPUT type="submit" value="Ajouter à la commande" name="ajout"></td></tr>
	  </table>
	</td></tr>
  </table>
</form>
Cette page compte 3 colonnes (+1 cachée) nom, prix, quantite (id_article).
La liste de mes produits s'affiche bien mais mon problème est l'ajout au panier.
L'utilisateur entre la quantité voulue de plusieurs produits et valide le formulaire.
Mais... il ne tient compte que du dernier produit. Comment puis-je récupérer un produit à la fois dans ce GET. Une autre boucle?

Code : Tout sélectionner

commande.php?id_article=1&nom=coca&prix=1.00&quantite=2&id_article=2&nom=coca+light&prix=1.00&quantite=2&id_article=3&nom=coca+zero&prix=1.00&quantite=3&ajout=Ajouter+%E0+la+commande
Il ajoute que "coca zeo 1.00€ 3" mais pas les autres,
$select['id'] = $_GET['id_article']; 
$select['nom'] = $_GET['nom']; 
$select['quantite'] = $_GET['quantite']; 
$select['prix'] = $_GET['prix']; 
if(!verif_panier($select['id'])) { 
  array_push($_SESSION['panier']['id'],$select['id']); 
  array_push($_SESSION['panier']['nom'],$select['pain']); 
  array_push($_SESSION['panier']['quantite'],$select['quantite']); 
  array_push($_SESSION['panier']['prix'],$select['prix']); 
}
D'avance MERCI.
Pak

d0m
Mammouth du PHP | 1141 Messages

08 nov. 2007, 13:03

Déjà je te conseille d'utiliser la méthode POST pour éviter certains soucis comme par exemple si tu as beaucoup d'articles (l'url étant limitée en taille).

Ensuite ton problème vient du fait que tu as plusieurs champs de même nom :
<?php echo ('<input type="hidden" name="id_article" value="'.$row['id'].'">'); ?>
<?php echo ('<input type="hidden" name="nom" value="'.$row['nom'].'">'); ?>
<?php echo ('<input type="hidden" name="prix" value="'.$row['prix'].
si tu as 5 articles, tu auras 5 champs hidden avec pour nom "id_article", 5 champs hidden avec pour nom "nom", 5 champs hidden avec pour nom "prix" et forcement les valeurs du dernier article écraseront les autres.
Il faut donc les differencier pour chaque article.
Tu peux par exemple utiliser des tableaux en utilisant la méthode POST :
<?php echo ('<input type="hidden" name="id_article[\''.$row['id'].'\']" value="'.$row['id'].'">'); ?>
<?php echo ('<input type="hidden" name="nom[\''.$row['id'].'\']" value="'.$row['nom'].'">'); ?>
<?php echo ('<input type="hidden" name="prix[\''.$row['id'].'\']" value="'.$row['prix'].
Cela te permet d'y accéder ensuite de cette manière :
$_POST['id_article'][$id];
Si tu as compris le fonctionnement, tu peux ensuite utiliser les tableaux par POST avec une autre structure plus efficace :
stocker dans la variable $_POST chaque article sous la forme d'un tableau avec son id, son nom et sa quantité.

Eléphanteau du PHP | 20 Messages

08 nov. 2007, 15:21

Merci de bien vouloir m'aider et pour le \' que j'oublie trop souvent. J'ai bien étudié et travaillé avec ton idée, mais je rame toujours. Je débute avec le système de ARRAY. J'ai donc modifié comme tu as suggéré avec
<?php while ($row = mysql_fetch_array($result)) { ?>
	<tr>
	<?php echo ('<input type="hidden" name="id_article[\''.$row['id'].'\']" value="'.$row['id'].'">'); ?>
	<?php echo ('<input type="hidden" name="nom[\''.$row['id'].'\']" value="'.$row['nom'].'">'); ?>
	<?php echo ('<input type="hidden" name="prix[\''.$row['id'].'\']" value="'.$row['prix'].'">'); ?>
	  <td width="130" height="30"><span class="choix"><?php echo $row['nom'] ?></span></td>
	  <td align="right"><?php echo $row['prix']; ?> €</td>
	  <td align="center"><?php echo '<input type="text" name="quantite[\''.$row['id'].'\']"" value="" size="2" maxlength="2" align=""></td>' ?>
	</tr>
<?php } ?>
et créé une nouvelle fonction pour l'ajout au panier (afin de ne pas modifier tous mes formulaire GET en POST, pour le moment) en (*je sais que pour le moment j'en ai que 18*)
  for ($i=1; $i<=18; $i++) {
	$select['id'] = $_POST['id_article'][$id]; 
	$select['nom'] = $_POST['nom'][$id]; 
	$select['quantite'] = $_POST['quantite'][$id]; 
	$select['prix'] = $_POST['prix'][$id]; 
	$select['total'] = ($_POST['prix'][$id] * $_POST['quantite'][$id]); 
	if(!isset($_SESSION['panier']['verrouille']) || $_SESSION['panier']['verrouille'] == false) { 
		if(!verif_panier($select['id'])) { 
			array_push($_SESSION['panier']['id'],$select['id']); 
			array_push($_SESSION['panier']['sand'],$select['nom']); 
			array_push($_SESSION['panier']['quantite'],$select['quantite']); 
			array_push($_SESSION['panier']['prix'],$select['prix']); 
			array_push($_SESSION['panier']['total'],$select['total']); 
		   $ajout = true; 
		} 
  }
Mon problème reste toujours à récupérer les données du POST, je suis un peu trop newbie.
Il me donne bien 18 lignes mais vide et c'est moi qui lui dit texto.

Je lui indiquerai bien quand ça marchera de ne pas ajouter si $quantité=0..

Merci de votre aide, si précieuse..

(J'ai bien réussi en métant un bouton ajouter à chaque ligne.. mais trop chargé et débutant à mon goût loll)
Pak