[RESOLU] Erreur insertion enregistrement

Eléphanteau du PHP | 10 Messages

12 juil. 2021, 14:29

Bonjour, je suis assez débutant en php et j'ai une erreur sur l'insertion d'un enregistrement dans une table sql.
Pour information et pour poser les bases, mon but est de créer une base de données de recettes dans lequel il y a plusieurs champs (nom de la recette, temps, liste d'ingrédients etc).
Lorsque j'appuie sur le bouton valider de la saisie d'une nouvelle recette, j'ai un message d'erreur que je pense comprendre mais que je n'arrive pas à résoudre: ERREUR : SQLSTATE[HY093]: Invalid parameter number: no parameters were bound
Avant de vous poster mon code, j'ai peut être une piste mais j'ai essayé de trouver une solution dans de nombreux forums mais je ne trouve aucun sujet correspondant à mon problème.
J'ai un champ idrec correspondant à un identifiant auto_increment donc clé primaire. Il me semble qu'il ne faut pas le passer lors de l'insertion des valeurs ou je me trompe ? sinon je ne vois pas où est mon erreur. Voici les 2 codes: celui de ma page principale (formulaire de saisie et celui de l'ajout des données dans la table "recettes".
En espérant avoir été aussi clair que possible.
Merci de votre aide.
page principale:

Code : Tout sélectionner

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Saisie d'une recette</title> </head> <body> <?php require 'connectbd.php'; try { $options = [ PDO ::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES utf8', PDO ::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]; $PDO = new PDO($DB_DSN, $DB_USER, $DB_PASS, $options); echo "Connexion établie"; $sql = 'SELECT * FROM type_recette'; $resultat = $PDO->query($sql); ?> <form method ="post" action="page2.php"> <label> Nom de la recette : <input name="nom_recette" value =""></label> <p> <label> Liste des ingrédients : <input name="liste_ing" value =""></label> <p> type de recette : <select name = "type_recette"> <?php foreach($resultat as $re) { ?> <option> <?php echo $re['type_recette']; ?> </option> <?php } ?> </select> <label> Nom du magazine : <input name="nom_magazine" value =""></label> <label> Page : <input name="page" value =""></label> <label> Temps de préparation : <input name="duree_prepa" value =""></label> <label> Temps de cuisson : <input name="duree_cuiss" value =""></label> <br> <input type ="submit" value="Valider" /> </form> <?php } catch(PDOException $pe) { echo 'ERREUR : ' .$pe->getMessage(); } ?> </body> </html>
page d'insertion

Code : Tout sélectionner

<?php require 'connectbd.php'; try { $options = [ PDO ::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES utf8', PDO ::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ]; $PDO = new PDO($DB_DSN, $DB_USER, $DB_PASS, $options); $nom_recette = $_POST['nom_recette']; $type_recette = $_POST['type_recette']; $liste_ing = $_POST['liste_ing']; $nom_magazine = $_POST['nom_magazine']; $page = $_POST['page']; $duree_prepa = $_POST['duree_prepa']; $duree_cuiss = $_POST['duree_cuiss']; $type_recette = $_POST['type_recette']; $requete_insertion = $PDO->prepare ("SELECT INTO recette (idrec,nom_recette, liste_ing,nom_magazine, page, duree_prepa, duree_cuiss, type_recette) VALUES ('',:nom_recette, :liste_ing, :nom_magazine, :page, :duree_prepa, :duree_cuiss, :type_recette)"); if ($requete_insertion->execute()) { echo "Enregistrement ajouté avec succès"; } else { echo "problème insertion"; } } catch(PDOException $pe) { echo 'ERREUR : ' .$pe->getMessage(); } ?>

Mammouth du PHP | 2703 Messages

12 juil. 2021, 17:51

"Invalid parameter number: no parameters were bound"
le principe : on prépare une requete avec des paramètres, on exécute en passant les paramètres.
il n'y a pas de passage de paramètre dans le code, d'où le message d'erreur.
la doc : https://www.php.net/manual/fr/pdo.prepare.php

Avatar du membre
Eléphant du PHP | 70 Messages

13 juil. 2021, 09:06

Bonjour,

En effet si ton champs idrec est auto-incrémenté, ne le met pas dans ta requete. Il sera automatiquement renseigné quand ta nouvelle recette sera créé !

Ensuite, tu a choisie d'utiliser la méthode prepare, ce qui implique que tu doit lui passer les variables soit dans ton execute, soit en bindparam, je te conseille de te renseigné sur le PDO prepare : https://www.php.net/manual/fr/pdo.prepare.php
" La révolution informatique fait gagner un temps fou aux Hommes, mais ils le passent avec leur ordinateur ! " by Khalil Assala