Je ne sais pas si le sujet a déjà été aborder sur ce forum, mais a vrai dire je n'arrive pas moi meme a exprimer ma recherche. J'espère que vous comprendrez mon problème.
Voilà je suis en train de créer un page pour gérer des inventaires.
Mon formulaire d'inventaire est généré a partir d'une table :
Je souhaite récupérer chaque valeur de mes inputs "nomproduit" en cliquant sur mon submit "save" et les ajouters a ma bdd ou si le produit existe faite un update.
Problème c'est que mon code récupérant mes valeur étant un while, je ne récupère que la dernière valeur.
Comme puis-je récupérer toute les valoir pour les mettre dans des enregistrements de ma bdd.
Voilà mon code PHP.
if(isset($_POST['save']))
{
$stockcompte = $_POST['nomproduit'];
$reqaddinventaire = $bdd->prepare("SELECT * FROM produits WHERE id_etablissement=:id_etablissement AND id_produit = :id_produit");
$reqaddinventaire->execute(array('id_etablissement'=>$_SESSION['id_etablissement'], 'id_produit' => $id_produit));
$compteproduit = $reqaddinventaire->rowCount();
while ($resultaddinventaire = $reqaddinventaire->fetch())
{
$id_inventaire = $resultaddinventaire['id_inventaire'];
}
$reqaddinventaire = $bdd->prepare("SELECT * FROM tempinventaire WHERE id_etablissement=:id_etablissement AND id_produit = :id_produit");
$reqaddinventaire->execute(array('id_etablissement'=>$_SESSION['id_etablissement'], 'id_produit' => $id_produit));
$compteinventaire = $reqaddinventaire->rowCount();
if ($compteinventaire == '0')
{
$insertresa = $bdd->prepare("INSERT INTO `tempinventaire`(
`id_produit`,
`id_inventaire`,
`id_etablissement`,
`stockcompte`)
VALUES (?,?,?,?)");
$insertresa->execute(array(
$id_produit,
$id_inventaire,
$_SESSION['id_etablissement'],
$stockcompte));
}
else
{
$updateinventaire = $bdd->prepare('UPDATE tempinventaire SET
id_produit=:id_produit,
id_inventaire=:id_inventaire,
id_etablissement=:id_etablissement,
stockcompte=:stockcompte WHERE
`id_produit` = :id_produit AND
`id_etablissement` = :id_etablissement' );
$updateinventaire->execute(array(
'id_produit' => $id_produit,
'id_inventaire' => $id_inventaire,
'id_etablissement' => $_SESSION['id_etablissement'],
'stockcompte' => $stockcompte,
'id_produit' => $id_produit,
'id_etablissement' => $_SESSION['id_etablissement']));
}
}
Forcément tu écrases ta variable ($id_inventaire) à chaque itération. Pourquoi n'utilises-tu pas fetchAll déjà ?
Pas sûr de tout comprendre :
d'où sort $id_produit et pourquoi tu ne reprends que id_inventaire au lieu de ceux des produits ?
pourquoi name="nomproduit" au lieu de name="idproduit[<?= $resultinfoinventaire['idproduit'] ?>]" et n'exploites aucune information dudit formulaire (au lieu de refaire un SELECT) ?
Il y a éventuellement moyen d'optimiser suivant les clés primaires et uniques en remplaçant les SELECT puis INSERT ou UPDATE par un INSERT ... ON DUPLICATE KEY UPDATE.
Ton traitement (requête SELECT puis INSERT sinon UPDATE) n'étant pas dans une boucle, tu ne traites qu'un produit à la fois.
> jusque la tous fonction impecable
J'en doute parce qu'en l'état (cf second point ci-dessus), tu n'as que la valeur du dernier champ où name="nomproduit".
Changer le name du form.
Tu remplaces ton (premier) SELECT par :
foreach ($_POST['idproduit'] as $id_produit => $quantite) {
// mettre ici le restant de ton code
}
Améliorations :
virer cet immonde SELECT * pour ensuite faire un rowCount par un SELECT COUNT(*)
déplacer les prepare avant le foreach
et comme évoqué ci-dessus, utiliser INSERT ... ON DUPLICATE KEY UPDATE si possible (id_produit + id_etablissement + id_inventaire - l'ensemble - en PK ou UNIQUE ?)
Le markdown est buggé depuis bientôt 2 ans, il faut lire > à < et < à <, tu devrais donc reconnaître la balise courte équivalente à echo.
Sinon le but c'est de générer un champ ayant pour nom idproduit[id_du_produit] de façon, en PHP, à récupérer un tableau ($_POST['idproduit'] - j'aurais peut être du opter pour un pluriel d'ailleurs) où les clés seront l'identifiant du produit et en valeur la quantité associée (faire un var_dump au besoin).
excusez ma réponse tardive, j'ai beaucoup de boulot en ce moment.
Je viens de réussir mon foreach (avec beaucoup de mal)
Tout fonction parfaitement SAUF (désolé il y a un sauf) mon champ id_produit, si je le rentre dans mon insert into, rien ne s'enregistre, je l'enlève, mon insert fonction mais du coup je ne peux pas identifier le produit (ce qui pose pas mal de problème xD).
Si l'insert ne se fait pas, c'est que ta requête doit planter, par conséquent, si toutes les erreurs (php + pdo) sont activées, tu devrais en avoir la raison, non ?
tempinventaire.id_produit est bien FK de produits.id_produit ?
Code ? Structure de la table ?
Et var_dump($_POST); ? (des fois que $_POST['id_produit'] n'existe même pas au départ)
foreach ($_POST['idproduit'] as $id_produit => $quantite)
Je ne sais pas comment récupérer la valeur de mon array, en gros il me faut le 1313 et le 10 le 1313 qui correspond au nombre d'article, et le 10 a l'id de l'article.
la valeur saisi par l'utilisateur est bien prise en compte, le soucis c'est pour l'enregistrement (pour le traitement par la suite) il me faut l'id_produit avec la valeur saisie par l'utilisateur dans le meme enregistrement. Mais comment retrouver cette id en rapport avec la quantité ?
foreach ($_POST['idproduit'] as $quantitesaisie=>$quantite)
{
$insertresa = $bdd->prepare("INSERT INTO `tempinventaire`(
'id_produit',
`id_inventaire`,
`id_etablissement`,
`stockcompte`)
VALUES (?,?,?,?)");
$insertresa->execute(array(
$quantitesaisie,
$id_inventaire,
$_SESSION['id_etablissement'],
$quantite));
}
}
EDIT :
Je viens de voir ma connerie, le 'au lieu du `
- Edité par Noncascou 22 mars 2019 à 19:30:17
ajouter donner dans bdd en boucle
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli