Page 1 sur 1

erreur requête update pdo

Posté : 20 juil. 2021, 10:49
par christrenb
Bonjour, j'ai un message d'erreur à l'update d'une requête SQL utilisée avec php, pdo et çà fait quelques temps que je cherche.
Je souhaite qu'on m'aide à comprendre ce que j'ai mal fait.
Voici mon code de modification obtenu par formulaire :je précise que les valeurs sont bien récupérées (vu par un echo que j'ai mis en commentaires donc ce n'est pas un problème de récupération des données).

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); $idrec = $_POST['idrec']; //echo $idrec; echo "<br>"; $nv_nom_recette = $_POST['nom_recette']; $nv_liste_ing = $_POST['liste_ing']; $nv_nom_magazine = $_POST['nom_magazine']; $nv_page = $_POST['page']; $nv_duree_prepa = $_POST['duree_prepa']; $nv_duree_cuiss = $_POST['duree_cuiss']; $nv_typerecette = $_POST['type_recette']; /*echo "le nom de la recette a été changé en $nv_nomrecette"; echo "<br>"; echo "le type de recette est maintenant $nv_typerecette"; echo "<br>"; echo "La liste des ingrédients est désormais la suivante : $nv_liste_ing"; echo "<br>"; echo "La recette est dans $nv_nom_magazine et se trouve à la page $nv_page"; */ $sql= "UPDATE recette SET nom_recette = :nv_nom_recette, liste_ing = :nv_liste_ing, nom_magazine = :nv_nom_magazine, page = :nv_page, duree_prepa = :nv_duree_prepa, duree_cuiss = :nv_duree_cuiss, type_recette = :nv_typerecette WHERE idrec = :irec"; $requete_modification = $PDO->prepare($sql); $requete_modification->execute(array ( ':nom_recette'=>$nv_nom_recette, ':liste_ing'=>$nv_liste_ing, ':nom_magazine'=>$nv_nom_magazine, ':page'=>$nv_page, ':duree_prepa'=>$nv_duree_prepa, ':duree_cuiss'=>$nv_duree_cuiss, ':type_recette'=>$nv_typerecette)); {echo "recette modifiée avec succès"; } } catch(PDOException $pe) { echo 'ERREUR : ' .$pe->getMessage(); } ?>
et le message d'erreur à la modification:
ERREUR : SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Re: erreur requête update pdo

Posté : 20 juil. 2021, 11:22
par ynx
Bonjour,

Le message d'erreur indique que le nombre de valeurs passées à la fonction execute() ne correspond pas au nombre de paramètre de la requête sql : en effet dans la requête sql il y a 8 paramètres nommés, or dans la fonction execute() il n'y a que 7 valeurs renseignées (il manque à priori la valeur pour le paramètre :irec).

Bonne journée,

Re: erreur requête update pdo

Posté : 20 juil. 2021, 11:33
par christrenb
Bonjour,

Le message d'erreur indique que le nombre de valeurs passées à la fonction execute() ne correspond pas au nombre de paramètre de la requête sql : en effet dans la requête sql il y a 8 paramètres nommés, or dans la fonction execute() il n'y a que 7 valeurs renseignées (il manque à priori la valeur pour le paramètre :irec).

Bonne journée,
Merci de ta réponse j'avais oublié une lettre (idrec au lieu de irec). Mais je pensais que idrec n'était pas nécessaire puisque c'est l'identifiant de la table recette que je récupère en champ hidden depuis mon autre formulaire. J'ai quand même essayé de mettre le champ idrec dans le tableau d'exécution de la requête mais il me retourne maintenant le message d'erreur: ERREUR : SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
Voici le code corrigé:

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); $idrec = $_POST['idrec']; //echo $idrec; echo "<br>"; $nv_nom_recette = $_POST['nom_recette']; $nv_liste_ing = $_POST['liste_ing']; $nv_nom_magazine = $_POST['nom_magazine']; $nv_page = $_POST['page']; $nv_duree_prepa = $_POST['duree_prepa']; $nv_duree_cuiss = $_POST['duree_cuiss']; $nv_typerecette = $_POST['type_recette']; $sql= "UPDATE recette SET nom_recette = :nv_nom_recette, liste_ing = :nv_liste_ing, nom_magazine = :nv_nom_magazine, page = :nv_page, duree_prepa = :nv_duree_prepa, duree_cuiss = :nv_duree_cuiss, type_recette = :nv_typerecette WHERE idrec = :idrec"; $requete_modification = $PDO->prepare($sql); $requete_modification->execute(array ( ':idrec'=>$idrec, ':nom_recette'=>$nv_nom_recette, ':liste_ing'=>$nv_liste_ing, ':nom_magazine'=>$nv_nom_magazine, ':page'=>$nv_page, ':duree_prepa'=>$nv_duree_prepa, ':duree_cuiss'=>$nv_duree_cuiss, ':type_recette'=>$nv_typerecette)); {echo "recette modifiée avec succès"; } } catch(PDOException $pe) { echo 'ERREUR : ' .$pe->getMessage(); } ?>
Merci de votre aide

Re: erreur requête update pdo

Posté : 20 juil. 2021, 12:04
par ynx
Attention au nommage de tes paramètres. Je n'avais pas fait attention mais les paramètres nommés dans ta requête sql ne sont pas nommés de manière identique dans la fonction execute() : par exemple, il y a le paramètre :nv_nom_recette dans la requête sql mais dans la fonction execute(), celui-ci est nommé :nom_recette.

Le nom des paramètres passés à la fonction execute() doit être identique au paramètres nommés dans la requête sql :
$sql= "UPDATE recette SET
nom_recette = :nv_nom_recette,
liste_ing = :nv_liste_ing,
nom_magazine = :nv_nom_magazine,
page = :nv_page,
duree_prepa = :nv_duree_prepa,
duree_cuiss = :nv_duree_cuiss,
type_recette = :nv_typerecette
 WHERE idrec = :idrec";
$requete_modification = $PDO->prepare($sql);
$requete_modification->execute(array (
    ':nv_nom_recette' => $nv_nom_recette,
    ':nv_liste_ing' => $nv_nom_recette,
    ':nv_nom_magazine' => $nv_nom_recette,
    ':nv_page' => $nv_page,
    ':nv_duree_prepa' => $nv_duree_prepa,
    ':nv_duree_cuiss' => $nv_duree_cuiss,
    ':nv_typerecette' => $nv_typerecette,
    ':idrec' => $idrec
));

Re: erreur requête update pdo

Posté : 20 juil. 2021, 15:51
par christrenb
Attention au nommage de tes paramètres. Je n'avais pas fait attention mais les paramètres nommés dans ta requête sql ne sont pas nommés de manière identique dans la fonction execute() : par exemple, il y a le paramètre :nv_nom_recette dans la requête sql mais dans la fonction execute(), celui-ci est nommé :nom_recette.

[/PHP]
D'accord merci pour cette réponse mais j'ai toujours un message d'erreur. Je suis donc persuadé que je m'y prends mal dans la déclaration de variable. Prenons donc un exemple concret sur un seul champ : le nom de ma recette de cuisine:
Dans ma table recette (créée via PHPmyadmin), le nom de ce champ est : nom_recette.
Donc dans mon formulaire de récupération des données, j'ai nommé comme tel la variable qui me permet de récupérer le nom de modifié de ma recette.
Pour confirmer, voici un extrait de mon code du formulaire de récupération des données ( pour être sûr qu'on parle avec les mêmes noms de variable)

Code : Tout sélectionner

<form action = "champmodif.php" method="post"> <p><input type="hidden" name="idrec" value = "<?php echo $re['idrec']; ?>"></p> <p><label> nom de la recette : </label> <input type="text" name = "nom_recette" value = "<?php echo $re['nom_recette']; ?>"></p>
Donc il me semblait "logique" que dans ma page champmodif.php, je déclare la variable $nv_nom_recette = $_POST['nom_recette'];

Dans ma requête SQL, il me faut bien mettre le nom de mon champ à updater (donc nom_recette) qui prend la nouvelle valeur que l'on trouve dans $nv_nom_recette (pour nouveau nom de la recette)?
Merci donc de m'éclairer car je suis autodidacte et malgré bon nombre de lecture de forums je ne comprends pas mon erreur.

Enfin malgré les tentatives de correction, j'ai toujours le même message d'erreur:
ERREUR : SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

voici ma requête modifiée:

Code : Tout sélectionner

$requete_modification->execute(array ( ':nv_nom_recette'=> $nv_nom_recette, ':nv_liste_ing'=> $nv_liste_ing, ':nv_nom_magazine'=> $nv_nom_magazine, ':nv_page'=> $nv_page, ':nv_duree_prepa'=> $nv_duree_prepa, ':nv_duree_cuiss'=> $nv_duree_cuiss, ':nv_type_recette'=> $nv_typerecette, ':idrec'=>$idrec ));

Re: erreur requête update pdo

Posté : 20 juil. 2021, 16:22
par or 1
on peut avoir le dernier code complet testé ?

Re: erreur requête update pdo

Posté : 20 juil. 2021, 16:34
par christrenb
on peut avoir le dernier code complet testé ?
sans problème. il s'agit de la page champmodif.php

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); $idrec = $_POST['idrec']; //echo $idrec; echo "<br>"; $nv_nom_recette = $_POST['nom_recette']; $nv_liste_ing = $_POST['liste_ing']; $nv_nom_magazine = $_POST['nom_magazine']; $nv_page = $_POST['page']; $nv_duree_prepa = $_POST['duree_prepa']; $nv_duree_cuiss = $_POST['duree_cuiss']; $nv_typerecette = $_POST['type_recette']; $sql= "UPDATE recette SET nom_recette = :nv_nom_recette, liste_ing = :nv_liste_ing, nom_magazine = :nv_nom_magazine, page = :nv_page, duree_prepa = :nv_duree_prepa, duree_cuiss = :nv_duree_cuiss, type_recette = :nv_typerecette WHERE idrec = :idrec"; $requete_modification = $PDO->prepare($sql); $requete_modification->execute(array ( ':nv_nom_recette'=> $nv_nom_recette, ':nv_liste_ing'=> $nv_liste_ing, ':nv_nom_magazine'=> $nv_nom_magazine, ':nv_page'=> $nv_page, ':nv_duree_prepa'=> $nv_duree_prepa, ':nv_duree_cuiss'=> $nv_duree_cuiss, ':nv_type_recette'=> $nv_typerecette, ':idrec'=>$idrec )); {echo "recette modifiée avec succès"; } } catch(PDOException $pe) { echo 'ERREUR : ' .$pe->getMessage(); } ?>
S'il faut l'autre page de code (celle du formulaire de récupération de données) je suis prêt à le fournir également.
Cordialement.

Re: erreur requête update pdo

Posté : 20 juil. 2021, 17:01
par ynx
Pas de soucis dans la déclaration de tes variables à priori, ici l'erreur semble encore dû à une erreur de nommage sur les paramètres nommés : ":nv_typerecette" dans la requête sql, ":nv_type_recette" dans la fonction execute().

Re: erreur requête update pdo

Posté : 21 juil. 2021, 00:03
par christrenb
":nv_typerecette" dans la requête sql, ":nv_type_recette" dans la fonction execute().
Mais quel boulet !!! Désolé de cette erreur d'inattention. Trop tard pour ce soir mais je reteste demain dès la première heure. Encore merci.

Re: erreur requête update pdo

Posté : 21 juil. 2021, 05:23
par christrenb
":nv_typerecette" dans la requête sql, ":nv_type_recette" dans la fonction execute().
Mais quel boulet !!! Désolé de cette erreur d'inattention. Trop tard pour ce soir mais je reteste demain dès la première heure. Encore merci.
Forcément maintenant çà fonctionne beaucoup mieux. Désolé de cette erreur bête mais j'étais tellement obnubilé par la syntaxe que j'en ai oublié les fautes de frappe!! Donc çà me rassure quelque peu, j'avais bien compris la syntaxe de l'update!!
Merci encore de vos conseils! Je vous souhaite de bonnes vacances (moi vendredi) et en espérant ne pas trop vous embêter avec mes erreurs d'inattention.
Cordialement,
Christophe