MySQL PDO : Nb param. invalide
Résolu/Fermé
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
-
27 juil. 2012 à 19:37
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 27 juil. 2012 à 23:51
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 27 juil. 2012 à 23:51
A voir également:
- MySQL PDO : Nb param. invalide
- Mysql download - Télécharger - Bases de données
- Xampp mysql ne démarre pas ✓ - Forum MySQL
- Mysql gratuit ou payant - Forum MySQL
- Mysql error 1 ✓ - Forum Réseaux sociaux
- Impossible de se connecter au serveur mysql - Forum Ubuntu
6 réponses
Utilisateur anonyme
27 juil. 2012 à 19:43
27 juil. 2012 à 19:43
Bonjour
Tu es un peu distrait... c'est :cart ou :numcart ton paramètre ?
Tu es un peu distrait... c'est :cart ou :numcart ton paramètre ?
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
27 juil. 2012 à 19:45
27 juil. 2012 à 19:45
La vraie question :
Je pensai (et pense toujours) qu'en lecure je peux citer le nombre de paramètres présents voulu (8 ici) et pour le WHERE, là aussi je ne vois pas de nombre gênant en ne citant qu'un paramètre ? RJL2727
Je pensai (et pense toujours) qu'en lecure je peux citer le nombre de paramètres présents voulu (8 ici) et pour le WHERE, là aussi je ne vois pas de nombre gênant en ne citant qu'un paramètre ? RJL2727
Utilisateur anonyme
27 juil. 2012 à 19:49
27 juil. 2012 à 19:49
Tu n'as pas 8 paramètres, il y en a un seul dans cette requête et c'est :numcart. Le problème, c'est que l'array que tu passes a bien un élément lui aussi, mais sa clé n'est pas la bonne(:cart au lieu de :numcart)
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
27 juil. 2012 à 20:12
27 juil. 2012 à 20:12
Bonsoir,
Déjà, un plaisir de te retrouver sur le Forum...
Que je sois un peu distrait tu l'avais déjà remarqué (et je trouve le terme gentil) car c'est parfois mon incompétence qui me pousse vers des mauvais choix !
Dans le cas présent, cart existe dans ma table... Pour autant, c'est bien numcart qui est récupéré dans le module précédent du Formulaire et transmis en paramètre Session.
je récapitule donc :
je récupère numcart comme index de l'enregistrement à "supprimer" (je mets entre guillemets car en fait, je l'invalide pour suppression à terme) ;
Je dois donc sélectionner un enregistrement dont le champ "cart" (table) égale "numcart" (paramètre transmis).
A partir de là, est-ce que mon query est correct ?
Quel rapport avec le message erreur qui indique un nombre de paramètres incorrect ?
Je n'irai pas beaucoup plus loin ce soir car bloqué par une sortie.
Néanmoins, au passage, je m'interroge sur mon contrôle de numéricité de la zone d'appel de ce champ numcart (dans le module précédent avant de le communiquer au Formulaire). Voila ce morceau de code dont la complexité répondait pour moi en partie à ce que j'ai lu sur la sécurité des champs numériques ; dans le cas présent, j'ai commencé par mettre un code non numérique et il est parti sasn bloquer sur le contrôle... cas susceptible de générer d'autres erreurs :
Déjà, un plaisir de te retrouver sur le Forum...
Que je sois un peu distrait tu l'avais déjà remarqué (et je trouve le terme gentil) car c'est parfois mon incompétence qui me pousse vers des mauvais choix !
Dans le cas présent, cart existe dans ma table... Pour autant, c'est bien numcart qui est récupéré dans le module précédent du Formulaire et transmis en paramètre Session.
je récapitule donc :
je récupère numcart comme index de l'enregistrement à "supprimer" (je mets entre guillemets car en fait, je l'invalide pour suppression à terme) ;
Je dois donc sélectionner un enregistrement dont le champ "cart" (table) égale "numcart" (paramètre transmis).
A partir de là, est-ce que mon query est correct ?
Quel rapport avec le message erreur qui indique un nombre de paramètres incorrect ?
Je n'irai pas beaucoup plus loin ce soir car bloqué par une sortie.
Néanmoins, au passage, je m'interroge sur mon contrôle de numéricité de la zone d'appel de ce champ numcart (dans le module précédent avant de le communiquer au Formulaire). Voila ce morceau de code dont la complexité répondait pour moi en partie à ce que j'ai lu sur la sécurité des champs numériques ; dans le cas présent, j'ai commencé par mettre un code non numérique et il est parti sasn bloquer sur le contrôle... cas susceptible de générer d'autres erreurs :
$numcart = intval($numcartX); if ((is_int($numcart) AND ($numcart = $numcartX) AND ($numcart > 0))) { $_SESSION['numcart'] = $numcart; // si oui c est ok } else { $message .= "<br />Revenir par la flèche à la page précédente et corriger le N° carte"; echo $message; exit; }
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
27 juil. 2012 à 20:14
27 juil. 2012 à 20:14
Réponse un peu rapide sans avoir pris le temps de remercier;
Le texte n'y était pas mais le coeur y était ! RJL2727
Le texte n'y était pas mais le coeur y était ! RJL2727
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
27 juil. 2012 à 21:33
27 juil. 2012 à 21:33
Je n'ai visiblement pas été assez clair...
En fait, ce n'est pas de la distraction, il y a quelque chose que tu ne sembles pas avoir compris.
Quand tu fais une requête préparée avec PDO et que tu utilises des paramètres nommés (:nomdeparamètre et non pas ?) tu peux bien leur donner le nom que tu veux, cela n'a aucune importance, ni aucun rapport avec les noms des champs de tes tables ou de tes formulaires ou de tes variables PHP... La seule chose qui compte, c'est que dans le tableau que tu vas transmettre pour l'execute, il retrouve les noms de tes variables dans les clés du tableau.
Tu as fait une requête avec un paramètre nommé :numcart
Pour l'execute, tu lui passes un tableau qui ne contient aucune clé :numcart (tu as mis :cart) donc il retrouve 0 paramètre au lieu d'un
J'ai volontairement changé le nom du paramètre nommé :
En fait, ce n'est pas de la distraction, il y a quelque chose que tu ne sembles pas avoir compris.
Quand tu fais une requête préparée avec PDO et que tu utilises des paramètres nommés (:nomdeparamètre et non pas ?) tu peux bien leur donner le nom que tu veux, cela n'a aucune importance, ni aucun rapport avec les noms des champs de tes tables ou de tes formulaires ou de tes variables PHP... La seule chose qui compte, c'est que dans le tableau que tu vas transmettre pour l'execute, il retrouve les noms de tes variables dans les clés du tableau.
Tu as fait une requête avec un paramètre nommé :numcart
Pour l'execute, tu lui passes un tableau qui ne contient aucune clé :numcart (tu as mis :cart) donc il retrouve 0 paramètre au lieu d'un
J'ai volontairement changé le nom du paramètre nommé :
$query = 'SELECT cart, civil, nomadh, prenom, ville, excart, MaJ, qui FROM adh WHERE cart = :toto'; $param = array(':toto' => $numcart); $sth = $connexion->prepare($query); var_dump ($param, $sth); $sth->execute($param); // ligne 18
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
Modifié par rjl le 27/07/2012 à 23:52
Modifié par rjl le 27/07/2012 à 23:52
Bonsoir,
Tu avais du être assez clair sauf que, distrait..., je n'avais vu qu'un de tes 2 messages entre celui de 19h43 et celui de 19h 49 quand j'ai répondu à 20h 12 !
Il est vrai que souvent, les cours donnent des zones sans spécifier, exactement, ce à quoi elles correspondent et je cherche alors à me repérer (mal) avec les exemples et donc les noms des variables !
Ton explication est parfaite mais j'y reviendrai à tête reposée et, surtout, j'ai conservé toto qui évite tout amalgame avec des variables aux consonances trop proches.
J'ai aussi corrigé mes tests numériques où, chose curieuse, même en l'isolant, je n'ai pas été capable de faire fonctionner la fonction is_int() mais fait le tour avec if ((is_numeric($numcartX))AND ($numcart == $numcartX) AND ($numcart > 0)) traitant au passage les décimaux.
Pour cette partie, tout fonctionne et demain j'attaquerai la mise à jour... où, je reste capable de ma planter (je dispose de ressources insoupçonnées pour ça ).
Alors, MERCI et, peut-être à demain.Pour la suite, je devrai faire de la révision (INSERT et UPDATE que j'entamerai pour la MàJ demain.
Amicalement RJL2727
Tu avais du être assez clair sauf que, distrait..., je n'avais vu qu'un de tes 2 messages entre celui de 19h43 et celui de 19h 49 quand j'ai répondu à 20h 12 !
Il est vrai que souvent, les cours donnent des zones sans spécifier, exactement, ce à quoi elles correspondent et je cherche alors à me repérer (mal) avec les exemples et donc les noms des variables !
Ton explication est parfaite mais j'y reviendrai à tête reposée et, surtout, j'ai conservé toto qui évite tout amalgame avec des variables aux consonances trop proches.
J'ai aussi corrigé mes tests numériques où, chose curieuse, même en l'isolant, je n'ai pas été capable de faire fonctionner la fonction is_int() mais fait le tour avec if ((is_numeric($numcartX))AND ($numcart == $numcartX) AND ($numcart > 0)) traitant au passage les décimaux.
Pour cette partie, tout fonctionne et demain j'attaquerai la mise à jour... où, je reste capable de ma planter (je dispose de ressources insoupçonnées pour ça ).
Alors, MERCI et, peut-être à demain.Pour la suite, je devrai faire de la révision (INSERT et UPDATE que j'entamerai pour la MàJ demain.
Amicalement RJL2727