Récupération de variable dans foreach

cosmopolitan51 Messages postés 10 Statut Membre -  
cosmopolitan51 Messages postés 10 Statut Membre -
Bonjour. J'écris un site de vente en ligne en liaison avec une base de données.
Je génère un formulaire à partir de la table « prod », ce qui permettrait de changer tout le site en changeant les valeurs de la table. J'y ajoute un champ « qtte_cmde » où le client peut entrer la quantité souhaitée. Puis, dans la boucle, pour chaque ligne, je remplis la table « tabl_prov » que je compte utiliser pour les traitements ultérieurs de la commande. Tout fonctionne correctement, la « table_prov » est remplie comme je le souhaitais, sauf que la « qtte_cmde » est toujours celle de la dernière ligne du formulaire ! La qtte_cmde devrait pourtant ne correspondre qu'à la ligne en cours où id_prod est unique (si je demande d'afficher « id_prod », j'obtiens bien, par ligne, 0, 1, 2...26).
Je ne comprends pas et je suis coincé pour la suite. Quelqu'un peut-il m 'expliquer ce qui se passe et me débloquer ?
Merci à l'avance.

Voici mon code :

<?php

session_start();

	$_SESSION[cvlt_client] = "$_POST[cvlt_client]";

	$_SESSION[nom_client] = "$_POST[nom_client]";

	$_SESSION[prenom_client] = "$_POST[prenom_client]";

	$_SESSION[adresse_client] = "$_POST[adresse_client]";

	$_SESSION[ville] = "$_POST[ville]";

	$_SESSION[cde_post] = "$_POST[cde_post]";

	$_SESSION[tel_client] = "$_POST[tel_client]";

	$_SESSION[fax_client] = "$_POST[fax_client]";

	$_SESSION[mail_client] = "$_POST[mail_client]";

include ("connexion.inc.php");

include ("MesFonctions.php");	

?>



<html>

<head>

<title>Commande-form2.php : Formulaire de commande de produits</title>

	<meta name="keywords" lang="fr" content=""/>

     	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

     	<meta http-equiv="Content-Language" content="fr"/>

	<meta name="description" content="Ferme du Mayne."/>

	<meta name="author" content="Ecriture et mise en page : Denis Reb"/>

	<meta name="author" content="Contribution photographique : Francis Vergnes"/>

	<meta http-equiv="Content-Script-Type" content="text/javascript"/>

	<link rel="stylesheet" type="text/css" href="../Mayne-fichiers/Maynestyle_cmde.css"/>



<!--[if lte IE 7]>

	<link rel="stylesheet" type="text/css" href="../Mayne-fichiers/Maynestyle-ie.css" media="screen"/>

<![endif]-->



</head>

<body id="backgr">

<div id="pag_cmnde">

	<div id="EnTeteMayne">

		<div id="EnTeteMayneLeft">

<h3>Ferme du Mayne</h3>

<h5>Christine et Francis Vergnes</h5>

<h5>Le Mayne</h5>

<h5>46700 Puy-L&#39;Evêque</h5>

<h5>RC : </h5>

<h5>Tel : 05 65 21 31 38</h5>

		</div>

		<div id="EnTeteMayneRight">

<img src="../Mayne-fichiers/DSC03372IL_vieilimg-sm.png" alt="Image-sepia"/>

		</div>

	</div>

  

<form action="Commande-form2.php" method="POST" name="ref_clients-form">



	<fieldset id="refclient">

	<h3>Vos références</h3>

		<fieldset id="srefclient">

			Monsieur <input name="cvlt_client" value="Monsieur" id="sex" type="radio">

			Madame <input name="cvlt_client" value="Madame" id="sex" type="radio">

		</fieldset>

		<fieldset id="srefclient">

			Nom : <input name="nom_client" id="nom_client" type="text" value="">

			Prénom : <input name="prenom_client" id="prenom_client" type="text" value="">

		</fieldset>



		<fieldset id="srefclient">

			Adresse : <input name="adresse_client" id="adresse_client" type="text" value="">

			Ville : <input name="ville" id="ville" type="text" value="">

			Code postal : <input name="cde_post" id="cde_post" value="">

		</fieldset>

		<fieldset id="srefclient">

			Tél : <input name="tel_client" id="tel_client" type="text" value="">

			Fax : <input name="fax_client" id="fax_client" type="text" value=""> 

			Adresse email : <input name="mail_client" id="mail_client" size="40" type="text" value="">

		</fieldset>

	</fieldset>



	<div id="etat_prod">



	<fieldset id="entet_cdmde_client">

<h4><input id='id_prod' type='HIDDEN' name='entet_id_prod' value=''/>

<input READONLY id='libelle_prod' type='text' size='33' name='entet_libelle_prod' value='Désignation du produit' class='class_form_cmde'/>

<input READONLY id='cdmnt_pds_prod' type='text' size='20' name='entet_cdmnt_pds_prod' value='Conditionnement' class='class_form_cmde'/>

<input READONLY id='pht_kg_prod' type='text' size='12' name='entet_pht_kg_prod' value='Prix du kilo HT' class='class_form_cmde'/>

<input READONLY id='pht_prod' type='text' size='6' name='entet_pht_prod' value='Prix HT' class='class_form_cmde'/>

<input READONLY id='pttc_prod' type='text' size='6' name='entet_pttc_prod' value='Prix TTC' class='class_form_cmde'/>

<input READONLY id='avis_stock' type='text' size='3' name='entet_avis_stock' value='Stock' class='class_form_cmde'/>

<input READONLY id='entet_qtte_cmde' type='text' size='13' name='entet_qtte_cmde' value='Votre commande' class='class_form_cmde'/></h4>

	</fieldset>



	<fieldset id="cdmde_client">



<?php





$nom_client = strtolower(str_pad(SupprAccents($_POST[nom_client]),4,"x"));



$prenom_client = strtolower(str_pad(SupprAccents($_POST[prenom_client]),4,"x"));



$id_client = substr($nom_client,0,4).substr($prenom_client,0,4);



//$create_tabl = 

$delete = "DELETE FROM tabl_prov";

$dbh -> exec($delete);



$sql = "SELECT prod.id_prod, libelle_prod.libelle_prod, cdmnt_prod.cdmnt_prod, prod.stock_prod, prod.pds_prod, prod.pht_kg_prod, prod.pht_prod, tva.tx_tva FROM libelle_prod,prod,cdmnt_prod,tva WHERE prod.libelle_prod=libelle_prod.id_libelle_prod AND prod.id_cdmnt_prod=cdmnt_prod.id_cdmnt_prod AND prod.cde_tva=tva.cde_tva"; 



$list_prod = $dbh -> query($sql); 



foreach ($list_prod as $id_prod=>$row){



$cdmnt_pds_prod = ($row[cdmnt_prod].' '.de.' '.$row[pds_prod].' '.g);



$prix_ttc = ($row[pht_prod]*('1.'.$row[tx_tva]));



echo "<input id='id_prod' type='HIDDEN' name='id_prod' value='".$row[id_prod]."'/>

<input READONLY id='libelle_prod' type='text' size='33' name='libelle_prod' value='".$row[libelle_prod]."' class='class_form_cmde'/>

<input READONLY id='cdmnt_pds_prod' type='text' size='20' name='cdmnt_pds_prod' value='".$cdmnt_pds_prod."' class='class_form_cmde'/>

<input READONLY id='pht_kg_prod' type='text' size='12' name='pht_kg_prod' value='".$row[pht_kg_prod]." €' class='class_form_cmde'/>

<input READONLY id='pht_prod' type='text' size='6' name='pht_prod' value='".$row[pht_prod]." €' class='class_form_cmde'/>

<input READONLY id='pht_prod' type='text' size='6' name='pttc_prod' value='$prix_ttc €' class='class_form_cmde'/>

<input READONLY id='avis_stock' type='text' size='3' name='avis_stock' value='".$row[stock_prod]."' class='class_form_cmde'/>

<input id='qtte_cmde' type='text' size='13' name='qtte_cmde' value='' class='class_form_cmde'/><br/>";



$sql = "INSERT INTO tabl_prov (id_prod,id_client,libelle_prod,cdmnt_pds_prod,pht_kg_prod,pht_prod,pttc_prod,qtte_cmde) VALUES ('$row[id_prod]','$id_client','$row[libelle_prod]','$cdmnt_pds_prod','$row[pht_kg_prod]','$row[pht_prod]','$prix_ttc','$_POST[qtte_cmde]')";



var_dump($sql);




$dbh->exec($sql);



} 



$dbh = null;

?>



<input type=submit size=10 name=envoi value='Continuer' class='class_form_cmde'/><br/>



</fieldset>

</form>

	</div>



</div>

</body>

</html>



9 réponses

Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

Ce comportement est normal, je vais essayer d'être clair en expliquant pourquoi.
Tu as une page qui contient un formulaire qui l'englobe presque en entier.
Dans ce formulaire, tu as N champs qui comportent le même nom :
<input id='qtte_cmde' type='text' size='13' name='qtte_cmde' value='' class='class_form_cmde'/>
Ce champ est répété N fois dans ta page, autant de fois qu'il y a d'itération dans ta boucle.
Comment le navigateur doit-il choisir quelle valeur envoyer ? Bonne question... Manifestement dans ton cas, il prend le dernier portant ce nom. Ça aurait aussi bien pu être le premier.

Comment résoudre le problème ? La meilleure solution dans ton cas serait de donner un identifiant unique à chacun de ces champs, par exemple en collant à son nom l'id_prod du produit correpsondant.

Xavier
0
cosmopolitan51 Messages postés 10 Statut Membre
 
Bonsoir Xavier. Merci de ta réponse. J'avais bien compris et ai essayé cela, j'avais les id-prod. J'ai essayé toutes les concaténations possibles, j'obtiens soit la valeur d'id_prod, soit son $row avec éventuellement 'qtte_cmde' mais en texte.
J'ai vu depuis longtemps des problèmes identiques mais dans des formulaires hors de php. Il me semble cependant que ma démarche est bonne. Reste à trouver la bonne syntaxe ! Cela fait deux mois que j'essaie tout, mais peut-être que je m'enferme sur une mauvaise syntaxe qui lierait qtte_cmde à id_prod.
0
minalud Messages postés 99 Statut Membre 8
 
Bonjour,

si tu veux récupérer un ensemble d'enregistrement avec des champs nommés à l'identique, utilise la syntaxe tableau:

<input id='qtte_cmde' type='text' size='13' name='qtte_cmde[]' value='' class='class_form_cmde'/>

Dans le post, tu récupères un tableau que tu peux manipuler par indice ou par un foreach!

J'espère avoir compris ton problème ;)

Bonne soirée!
0
cosmopolitan51 Messages postés 10 Statut Membre
 
Bonsoir. Merci de vos réponses. J'ai eu cet après-midi un éclair de joie, le truc affichait ce que je demandais ! Fausse joie ! Ce devait être dû aux rechargements successifs de la page et je ne comprends pas bien ce qui s'est passé. Toujours est-il qu'un essai "en grand" ne me donne plus rien !
La requête me donne "array[et la bonne valeur de $row]"

<input id="qtte_cmde" type="text" size="13" name="qtte_cmde[$id_prod]" value="0" class="class_form_cmde"/><br/>';

$sql = "INSERT INTO tabl_prov (id_prod,id_client,libelle_prod,cdmnt_pds_prod,pht_kg_prod,pht_prod,pttc_prod,qtte_cmde) VALUES ('$row[id_prod]','$id_client','$row[libelle_prod]','$cdmnt_pds_prod','$row[pht_kg_prod]','$row[pht_prod]','$prix_ttc','$_POST[qtte_cmde][$id_prod]')";

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
minalud Messages postés 99 Statut Membre 8
 
Bonsoir,

tu mets bien ça dans le formulaire :

<input id="qtte_cmde" type="text" size="13" name="qtte_cmde[]" value="0" class="class_form_cmde"/>

et dans le script tu récuperes des $_POST['qtte_cmde'][0] $_POST['qtte_cmde'][1]... ?

en fait, l'ordre d'apparition des champs te donne l'indice!

j'essaierai de te préparer un exemple simple sur la base du tien demain ;)
0
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

$sql = "INSERT INTO tabl_prov (id_prod,id_client,libelle_prod,cdmnt_pds_prod,pht_kg_prod,pht_prod,pttc_prod,qtte_cmde) VALUES ('$row[id_prod]','$id_client','$row[libelle_prod]','$cdmnt_pds_prod','$row[pht_kg_prod]','$row[pht_prod]','$prix_ttc','$_POST[qtte_cmde][$id_prod]')";

Il manque un certain nombre de guillemets...
Essaie comme ça :

$sql = "INSERT INTO tabl_prov (id_prod,id_client,libelle_prod,cdmnt_pds_prod,pht_kg_prod,pht_prod,pttc_prod,qtte_cmde) VALUES ('".$row['id_prod']."','$id_client','".$row['libelle_prod']."','$cdmnt_pds_prod','".$row['pht_kg_prod']."','".$row['pht_prod']."','$prix_ttc','".$_POST['qtte_cmde']['$id_prod']."')";
0
cosmopolitan51 Messages postés 10 Statut Membre
 
Bonjour Reivax et merci de ta réponse.
En fait il y a longtemps que je jongle avec les quote et les guillemets. Je possède un bon manuel de php, et dans les exemples, on trouve en effet des guillemets là où je n'en mets pas ! C'est simple, ma syntaxe est la seule qui ne me donne pas de message d'erreur de type "Parse error: syntax error, unexpected T_VARIABLE in /media/www-dev/FermeduMayne/Pags-mayne/Commande-form2.php on line 139", et où la coloration syntaxique semble correcte. Va comprendre ! En fait, tout fonctionne comme je l'avais prévu, sauf la récupération de qtte_cmde en fonction de l'indice row ou id_prod !
0
cosmopolitan51 Messages postés 10 Statut Membre
 
Bonjour Minalud. Merci de ton aide. Je suis preneur de ton exemple. En revanche, je te soumets une écriture qui marche enfin, et "en grand" sans que je comprenne pourquoi ! Car si je remplace, directement, dans la requête "$_SESSION[qtte_cmde]", par le contenu que je lui donne, donc "$_POST[qtte_cmde][$id_prod]", cela ne fonctionne plus ! Qu'est-ce que le passage par une variable de session a changé à la valeur de cette variable ?

$_SESSION[qtte_cmde] = $_POST[qtte_cmde][$id_prod];



echo '<input id="id_prod" type="HIDDEN" name="id_prod" value="'.$row[id_prod].'"/>

<input READONLY id="libelle_prod" type="text" size="33" name="libelle_prod" value="'.$row[libelle_prod].'" class="class_form_cmde"/>

<input READONLY id="cdmnt_pds_prod" type="text" size="20" name="cdmnt_pds_prod" value="'.$cdmnt_pds_prod.'" class="class_form_cmde"/>

<input READONLY id="pht_kg_prod" type="text" size="12" name="pht_kg_prod" value="'.$row[pht_kg_prod].' €" class="class_form_cmde"/>

<input READONLY id="pht_prod" type="text" size="6" name="pht_prod" value="'.$row[pht_prod].' €" class="class_form_cmde"/>

<input READONLY id="pht_prod" type="text" size="6" name="pttc_prod" value="'.$prix_ttc.' €" class="class_form_cmde"/>

<input READONLY id="avis_stock" type="text" size="3" name="avis_stock" value="'.$row[stock_prod].'" class="class_form_cmde"/>

<input id="qtte_cmde" type="text" size="13" name="qtte_cmde[]" value="0" class="class_form_cmde"/><br/>';



$sql = "INSERT INTO tabl_prov (id_prod,id_client,libelle_prod,cdmnt_pds_prod,pht_kg_prod,pht_prod,pttc_prod,qtte_cmde) VALUES ('$row[id_prod]','$id_client','$row[libelle_prod]','$cdmnt_pds_prod','$row[pht_kg_prod]','$row[pht_prod]','$prix_ttc','$_SESSION[qtte_cmde]')";



var_dump($sql);



echo "$id_prod\n";



echo "$_SESSION[id_prod]\n";

echo "$_SESSION[libelle_prod]\n";

echo "$_SESSION[cdmnt_pds_prod]\n";

echo "$_SESSION[pht_kg_prod]\n";

echo "$_SESSION[pht_prod]\n";

echo "$_SESSION[qtte_cmde]\n";
0
minalud Messages postés 99 Statut Membre 8
 
c'est étrange, normalement, les variables tableaux passent bien en POST, en fait c'est la notation d'ajout en fin de tableau la notation []...

j'en ai fait pas mal et je n'ai jamais eu de soucis... notamment de l'ajout dynamique de lignes en javascript, et ça marchait bien!

t'as essayé un truc du genre:
foreach($_POST as $k=>$v){

if(is_array($v))
{
echo "Ligne: ";
foreach($v as $k2=>$v2){
echo $k2.": ".$v2;
}
}
else
{
echo $k.": ".$v;
}

}



ou encore, plus simplement:

var_dump($_POST);


dis moi si tu as un résultat!

;)
0
cosmopolitan51 Messages postés 10 Statut Membre
 
Bonjour Minalud. Merci de ta réponse. La question est certes résolue et depuis hier, j'en suis déjà arrivé à l'édition du bon de commande. Cependant j'aimerais comprendre.
J'ai essayé var_dump sur "$_POST[qtte_cmde][$id_prod]" et sur "$_SESSION[qtte_cmde]". En dehors de la requête, c'est bon ! Mais toujours "$_POST[qtte_cmde][$id_prod]", dans la requête, n'affiche que "0" !
0