MySQL PDO : Nb param. invalide
Résolu
rjl
Messages postés
543
Date d'inscription
Statut
Membre
Dernière intervention
-
rjl Messages postés 543 Date d'inscription Statut Membre Dernière intervention -
rjl Messages postés 543 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je savais que ça n'irait pas au bout mais Où cela allait-il bloquer ? La réponse n'est jamais ce que l'on pressent...
J'ai 19 champs dans cette table (clé comprise) mais n'en utilise dans cette page que 8 (je n'ai bien entendu pas cité la cle qui est un champ en auto incrémentation).
En INCLUDE, j'ai ma connexion à la base dont je n'ai pas repris ici les 3 paramètres : $dsn, $utilisateur, $motDePasse
Je copie ici le message d'erreur obtenu :
array(1) { [":cart"]=> string(4) "8io6" }
object(PDOStatement)#2 (1) { ["queryString"]=> string(90) "SELECT cart, civil, nomadh, prenom, ville, excart, MaJ, qui FROM adh WHERE cart = :numcart" }
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /web/utlsudgoelo/www/pgUTL/AdhSup.php:18 Stack trace: #0 /web/utlsudgoelo/www/pgUTL/AdhSup.php(18): PDOStatement->execute(Array) #1 {main} thrown in /web/utlsudgoelo/www/pgUTL/AdhSup.php on line 18
Enfin, je confirme que je n'ai qu'une clé de concordance dans le WHERE un champ numérique (que vous retrouverez en instruction 18 du code ci-dessous) et que je suis bien parvenu dans ce module AdhSup.php à bon escient suite à une demande par Formulaire du traitement à réaliser et communication de l'adhérent visé.
merci de vos observations et corrections sur ce sujet (ou tout autre) ; je ne manquerai pas de vous tenir informé, voire répondre à vos interrogations. RJL2727
Je savais que ça n'irait pas au bout mais Où cela allait-il bloquer ? La réponse n'est jamais ce que l'on pressent...
J'ai 19 champs dans cette table (clé comprise) mais n'en utilise dans cette page que 8 (je n'ai bien entendu pas cité la cle qui est un champ en auto incrémentation).
En INCLUDE, j'ai ma connexion à la base dont je n'ai pas repris ici les 3 paramètres : $dsn, $utilisateur, $motDePasse
// Connexion à MySQL try { $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); $connexion = new PDO( $dsn, $utilisateur, $motDePasse ); $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $er ) { echo "Connexion à la Base de données MySQL impossible : ", $er->getMessage(); die(); }
Je copie ici le message d'erreur obtenu :
array(1) { [":cart"]=> string(4) "8io6" }
object(PDOStatement)#2 (1) { ["queryString"]=> string(90) "SELECT cart, civil, nomadh, prenom, ville, excart, MaJ, qui FROM adh WHERE cart = :numcart" }
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in /web/utlsudgoelo/www/pgUTL/AdhSup.php:18 Stack trace: #0 /web/utlsudgoelo/www/pgUTL/AdhSup.php(18): PDOStatement->execute(Array) #1 {main} thrown in /web/utlsudgoelo/www/pgUTL/AdhSup.php on line 18
Enfin, je confirme que je n'ai qu'une clé de concordance dans le WHERE un champ numérique (que vous retrouverez en instruction 18 du code ci-dessous) et que je suis bien parvenu dans ce module AdhSup.php à bon escient suite à une demande par Formulaire du traitement à réaliser et communication de l'adhérent visé.
merci de vos observations et corrections sur ce sujet (ou tout autre) ; je ne manquerai pas de vous tenir informé, voire répondre à vos interrogations. RJL2727
<?php // MàJ RJL2725 Code des lignes 1 à 20 Module AdhSup.php session_start(); // Ouvrir la session (venant de IdentifK) // à ajouter au début du script au cas où magic_quotes soit à ON $nomresp = $_SESSION['Login']; $cdpw = $_SESSION['MotPasse']; $MajPossible = $_SESSION['Initiales']; If (empty ($MajPossible)) {Header("Location:/pgUTL/identifA.php"); // Retour Identification exit; } $numcart = $_SESSION['numcart']; include_once("ConnectBDutl.php"); // Connexion à la base de données MySQL (users enregistrés) /* Création de la requête préparée */ $query = 'SELECT cart, civil, nomadh, prenom, ville, excart, MaJ, qui FROM adh WHERE cart = :numcart'; $param = array(':cart' => $numcart); $sth = $connexion->prepare($query); var_dump ($param, $sth); $sth->execute($param); // ligne 18 $a_results = $sth->fetch(); /* Récup sélection */
A voir également:
- MySQL PDO : Nb param. invalide
- Mysql community server - Télécharger - Bases de données
- Could not connect to mysql! please check your database settings! - Forum Redhat
- Mysql error 1 ✓ - Forum Réseaux sociaux
- Phpmyadmin a tenté de se connecter au serveur mysql, et le serveur a rejeté la connexion. merci de vérifier les valeurs de host, username et password dans la configuration et de s'assurer qu'elles correspondent aux informations fournies par l'administrateur du serveur mysql. ✓ - Forum PHP
- Access vs mysql - Forum Webmastering
6 réponses
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
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)
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; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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