8795 sujets

Développement web côté serveur, CMS

Bonjour à tous,

J'ai un petit problème avec PHP. Je génère un tableau HTML dans un formulaire en récupérant des données d'une base. Pour chaque ligne j'affiche une zone de saisie. Le problème c'est que l'attribut "name" possède la même valeur pour chaque ligne, ce qui rend impossible le traitement du formulaire.

Ma question : comment obtenir une valeur différente pour chaque attribut "name" afin de traiter correctement le formulaire par la suite ?

while ($donnees = $produits->fetch()) {
	echo '
	<tr>
		<td>'.$donnees['nom_produit'].'</td>
		<td>'.$donnees['prix_unitaire'].'</td>
	        <td><input type="number" name="quantite" /></td>
	</tr>';
}


Voilà pour tout, merci d'avance Smiley biggrin
Bonsoir Javert67,

Afin de rattacher facilement vos champs de formulaire à vos enregistrements, Il serait possible d'exploiter l'identifiant de vos produits. Vous devriez avoir quelque chose de similaire à...
'<td><input type="number" name="produit-' . $donnees['id_produit'] . '" /></td>'
Au traitement du formulaire, Il faudra extraire l'id retourné par l'attribut name.

Espérant que cette petite solution vous dégage un peu le terrain.
Bonne soirée et bon code...
Modérateur
Guiwint a écrit :
Bonsoir Javert67,

Afin de rattacher facilement vos champs de formulaire à vos enregistrements, Il serait possible d'exploiter l'identifiant de vos produits. Vous devriez avoir quelque chose de similaire à...
'&lt;td&gt;&lt;input type=&quot;number&quot; name=&quot;produit-' . $donnees['id_produit'] . '&quot; /&gt;&lt;/td&gt;'
Au traitement du formulaire, Il faudra extraire l'id retourné par l'attribut name.

Espérant que cette petite solution vous dégage un peu le terrain.
Bonne soirée et bon code...


+1 ou un compteur dans le while


$c = 0;
while(....){
echo '<td><input type="number" name="produit-' . $c . '" /></td>';
$c++;
....
}

Plutôt que d'extraire des id ou la valeur d'un compteur, je propose plutôt un tableau, c'est infiniment plus simple à traiter :


'<td><input type="number" name="produit[]" /></td>'


ET on peut même utiliser un tableau associatif :

'<td><input type="number" name="produit[' . $donnees['id_produit'] . ']" /></td>'
En effet, mille excuses Javert67,
j'avais zappé le tableau associatif Smiley murf .

Si vous me permettez d'ajouter un complément...

Je note que vous utilisez une balise HTML5 <input type="number" /> qui filtrera votre valeur côté client.

Etant donné l'incompatibilité de certains navigateurs avec cette balise (IE inférieur à la version 10, ou Android inférieur à la version 4), et tout simplement par sécurité, le format sera à assurer dans votre boucle côté serveur. Exemple avec la fonction PHP filter_var():
filter_var($produit_quantite, FILTER_VALIDATE_INT);
Et encore mille excuses pour l'oubli du tableau associatif.
bon code...
Modifié par Guiwint (05 Mar 2014 - 10:00)
Merci à tous pour vos réponses Smiley smile

Alors j'ai utilisé la méthode des tableaux associatifs comme ceci :

							
while ($donnees = $produits->fetch()) {
	echo '
	<tr>
		<td>'.$donnees['nom_produit'].'</td>
		<td>'.$donnees['prix_unitaire'].'</td>
		<td><input type="number" name="quantite['.$donnees['id_produit'].']" /></td>
	</tr>';
}


Maintenant ma question, en validant le formulaire, comment insérer dans ma base de données la quantité correspondant à chaque ligne ? Voici mon code :

$quantite = htmlentities($_POST['quantite']);
//On ajoute le détail de la commande dans la base
$requete = $base->prepare('INSERT INTO detailscommande (commandes_id_commande, produits_id_produit, quantite) VALUES(:id_commande, :id_produit, :quantite)');
$requete->execute(array(
	'id_commande' => 1,
	'id_produit' => 2,
	'quantite' => $quantite
));


Que faut-il mettre à la place de $_POST['quantite'] ?
Tu vas recevoir un tableau associatif sous la forme :

array(
123 => 10,
456 => 1,
789 => 1


Tu peux soit faire autant d'insert isolés qu'il n'y a d'items (pas terrible), ou alors faire un seul insert groupé.