IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Erreur : SQLSTATE[HY093]: Invalid parameter number


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 44
    Points : 12
    Points
    12
    Par défaut Erreur : SQLSTATE[HY093]: Invalid parameter number
    Bonjour
    J'essaie de remplir ma base de donnée à partir d'un fichier excel. Mais je me retrouve bloqué par cette erreur depuis hier et je ne vois pas comment la corriger.
    Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
            	$nblignes = 0;
            	//On rentre le libClasse dans la table classe
                 $query = $db->prepare("INSERT INTO CLASSE(libClasse) VALUES(:classe) ON DUPLICATE KEY UPDATE libClasse = :classe");
            	foreach ($sheet->getRowIterator() as $row) {
            	    if($nblignes >= 1){
            	        $nrow = $row->getRowIndex();
                        $classe = $sheet->getCellByColumnAndRow(7, $nrow)->getValue();
                        $query->execute(array(':classe'=>$classe));
            	    } 
    		        $nblignes = $nblignes + 1;
            	}
            	//
            	$nblignes = 0;
            	//On remplit ensuite la table Eleve
                $query = $db->prepare("INSERT INTO ELEVE(libClasse, sexe, INE, nomEleve, prenom1Eleve, prenom2Eleve, prenom3Eleve, libGroupeLV1, libGroupeLV2, libOption, dateNaissance, MEF) values(:classe, :sexe, :INE, :nomEleve, :prenom1, :prenom2, :prenom3, :libGroupeLV1, :libGroupeLV2, :libOption, :dateNaissance, :MEF) ON DUPLICATE KEY UPDATE libClasse = :classe");
    		    foreach ($sheet->getRowIterator() as $row) {
    		       if($nblignes >= 1){
    		            $nrow = $row->getRowIndex();
    		            $sexe = $sheet->getCellByColumnAndRow(0, $nrow)->getValue();
    		            $nomEleve = $sheet->getCellByColumnAndRow(1, $nrow)->getValue();
    		            $prenom1 = $sheet->getCellByColumnAndRow(2, $nrow)->getValue();
                        $prenom2 = $sheet->getCellByColumnAndRow(3, $nrow)->getValue();
    		            $prenom3 = $sheet->getCellByColumnAndRow(4, $nrow)->getValue();
    		            $dateNaissance = $sheet->getCellByColumnAndRow(5, $nrow)->getValue();
                        $INE = $sheet->getCellByColumnAndRow(6, $nrow)->getValue();
    		            $classe = $sheet->getCellByColumnAndRow(7, $nrow)->getValue();
    		            $libGroupeLV1 = $sheet->getCellByColumnAndRow(8, $nrow)->getValue();
    		            $libGroupeLV2 = $sheet->getCellByColumnAndRow(9, $nrow)->getValue();
                        $libOption = $sheet->getCellByColumnAndRow(10, $nrow)->getValue();
                        $MEF = $sheet->getCellByColumnAndRow(11, $nrow)->getValue();
     
     
                        $query->execute(array(':classe'=>$classe, ':sexe'=>$sexe, ':INE'=>$INE, ':nomEleve'=>$nomEleve, ':prenom1Eleve'=>$prenom1, ':prenom2Eleve'=>$prenom2, ':prenom3Eleve'=>$prenom3, 
                        ':libGroupeLV1'=>$libGroupeLV1, ':libGroupeLV2'=>$libGroupeLV2, ':libOption'=>$libOption, ':dateNaissance'=>$dateNaissance, ':MEF'=>$MEF ));
                    }
                    $nblignes = $nblignes + 1;
    		    }
    Et j'obtiens l'erreur suivante :
    [QUOTE]Erreur : SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens[QUOTE]
    Ma base de donnée est la suivante :
    Nom : capturebdd.PNG
Affichages : 803
Taille : 15,0 Ko
    Quelqu'un aurait une idée ?
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    La réponse est dans le message d'erreur :
    number of bound variables does not match number of tokens
    Traduction :
    Le nombre de variables liées ne correspond pas au nombre de marqueurs
    Les marqueurs ce sont les :classe, :sexe, etc. dans tes requêtes. Dommage que tu n'aies pas mis le numéro de ligne de l'erreur, car on ne sait pas laquelle de tes requêtes pose problème.

    L'explication la plus probable est que l'une des variables est indéfinie. Essaye de mettre l'array que tu passes à execute dans une variable et de faire var_dump sur cette variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $params = array( ':classe' => $classe );
    var_dump($params);
    query->execute($params);
    Fais ça pour les deux requêtes.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 44
    Points : 12
    Points
    12
    Par défaut
    Ah d'accord, merci pour la réponse.
    J'ai fait ce que vous m'avez dit et je me retrouve avec ceci :
    array (size=1)
    ':classe' => float 1

    array (size=1)
    ':classe' => float 2

    array (size=1)
    ':classe' => float 3

    array (size=1)
    ':classe' => float 4

    array (size=1)
    ':classe' => float 5

    array (size=1)
    ':classe' => float 6

    array (size=1)
    ':classe' => float 7

    array (size=1)
    ':classe' => float 8

    array (size=1)
    ':classe' => float 9

    array (size=1)
    ':classe' => float 10

    array (size=1)
    ':classe' => float 11

    array (size=1)
    ':classe' => float 12

    array (size=1)
    ':classe' => float 13

    array (size=1)
    ':classe' => float 14

    array (size=12)
    ':classe' => float 1
    ':sexe' => string 'F' (length=1)
    ':INE' => string '1508016236H' (length=11)
    ':nomEleve' => string 'DE ABREU' (length=8)
    ':prenom1Eleve' => string 'Mélissa' (length=8)
    ':prenom2Eleve' => string 'a' (length=1)
    ':prenom3Eleve' => string 'b' (length=1)
    ':libGroupeLV1' => string 'ANGLAIS LV1' (length=11)
    ':libGroupeLV2' => string 'ESPAGNOL LV2' (length=12)
    ':libOption' => null
    ':dateNaissance' => float 35611
    ':MEF' => float 1

    Erreur : SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
    Je ne vois pas à quelle endroit est ce que ça bloque ? c'est peut être le libOption qui est null qui gêne, mais je suis censé pouvoir le laisser en null.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Oui c'est ça, c'est libOption qui pose problème. Même si dans la table, ce champ peut être null, il ne s'agit pas du même type de null : Il y a le null de PHP et le null de MySQL. (À ce propos, cet article est très intéréssant, dommage qu'il ne soit pas disponible en français.) Dans les détails, j'imagine que PHP considère que la variable ne représente rien, et donc il ne la lie pas.

    Quand on fouille sur le Web, on trouve cette façon de faire pour indiquer un null :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $query->bindValue(':libOption', null, PDO::PARAM_NULL);
    Mais il a été reporté que le type n'est pas toujours correctement passé, selon le driver et la configuration de PHP. C'est un bug qui n'est pas encore corrigé. Alors si ça ne marche pas chez toi il y a cette alternative :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $query->bindValue(':libOption', null, PDO::PARAM_INT);

    Du coup pour les autres paramètres tu as le choix entre les lier tous avec bindValue/bindParam ou bien continuer à utiliser un array, en faisant attention à retirer :libOption.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as mis ':prenom1Eleve' dans les paramètres et ':prenom1' dans la requête.

    Le fait que tu alternes des majuscules et des minuscules te pousse de plus à l'erreur.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 44
    Points : 12
    Points
    12
    Par défaut
    Merci des conseils !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2015, 19h47
  2. [PDO] Erreur execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables
    Par Aaymeric91 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 30/09/2013, 17h27
  3. [Doctrine] SQLSTATE[HY093]: Invalid parameter number
    Par fastone650 dans le forum ORM
    Réponses: 6
    Dernier message: 09/07/2011, 20h41
  4. Réponses: 6
    Dernier message: 03/06/2010, 10h09
  5. Réponses: 3
    Dernier message: 25/08/2009, 23h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo