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
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
 
// 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 */


6 réponses

Utilisateur anonyme
27 juil. 2012 à 19:43
Bonjour

Tu es un peu distrait... c'est :cart ou :numcart ton paramètre ?
0
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
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
0
Utilisateur anonyme
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)
0
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
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 :
$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;	} 
0
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
Réponse un peu rapide sans avoir pris le temps de remercier;
Le texte n'y était pas mais le coeur y était ! RJL2727
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
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é :
	$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
0
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
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
0