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 :

Exécution d'une réquête sql sous php


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Exécution d'une réquête sql sous php
    Bonjour,
    J'ai une réquete qui refusent de s'exécuter et j'arrive pas à déboguer. L'erreur qui s'affiche est la suivante :
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
    Voici mon code:
    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
    public function updateSpeaker($email, Intervenant $int) {
              if ($this->readSpeaker($email)!=null) {
     
                $req= $this->bd->prepare("UPDATE intervenant SET biographie= :biographie WHERE email_user=".$email);
                $req->execute(array('biographie'=>$int->getBio())); 
     
                $req2= $this->bd->prepare("UPDATE users SET nom= :nom, prenom = :prenom, adresse = :adresse, regime_Alimentaire = :regime_Alimentaire, pays = :pays, allergies =: allergies, taille_vetement  =: taille_vetement, tel =: tel, organisation =: organisation WHERE email_user=".$email);
                //var_export($req2);
                      var_export($int);
                $req2->execute(array('nom'=>$int->getFirstName(), 'prenom'=>$int->getLastName(), "adresse"=>$int->getAdress(), 'regime_Alimentaire'=>$int->getDiet(), 'pays'=>$int->getCountry(), 'allergies'=>$int->getAllergy(), 'taille_vetement'=>$int->getClothingSize(), 'tel'=>$int->getTelNumber(), 'organisation'=>$int->getOrganization())); 
     
                return true;
              }
              return false;
            }

    La première réquete s'execute sans probleme. c'est la deuxieme qui ,ne marche pas.
    J'ai besoin d'aide

  2. #2
    Modérateur

    salut,

    Pour éviter ce genre de déconvenue, il est préférable de se servir des tableaux en PHP, comme ça tu seras absolument certain de ne rien oublier au passage
    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
    public function updateSpeaker($email, Intervenant $int)
    {
        if ($this->readSpeaker($email) !== null) {
            $stmt = $this->bd->prepare('UPDATE intervenant SET biographie = :biographie WHERE email_user = :email');
            $stmt->execute([
                ':biographie' => $int->getBio(),
                ':email'      => $email
            ]);
     
            $fields = $data = [];
            $add_value = function($field, $value) use (&$fields, &$data) {
                $token        = ":{$field}";
                $fields[]     = "{$field} = {$token}";
                $data[$token] = $value;
            };
     
            $add_value('nom', $int->getFirstName());
            $add_value('prenom', $int->getLastName());
            $add_value('adresse', $int->getAdresse());
            $add_value('regime_Alimentaire', $int->getDiet());
            $add_value('pays', $int->getCountry());
            $add_value('allergies', $int->getAllergy());
            $add_value('taille_vetement', $int->getClothingSize());
            $add_value('tel', $int->getTelNumber());
            $add_value('organisation', $int->getOrganization());
     
            $sql = "UPDATE users SET ".implode(', ', $fields).' WHERE email_user = :email_user';
            $add_value('email_user', $email);
     
            $stmt = $this->bd->prepare($sql);
            $stmt->execute($data);
     
            return true;
        }
        return false;
    }

    Sers toi à fond du langage, PHP offre pléthore de syntaxes pour arriver à tes fins.
    Enfin quand dans la doc, il est indiqué que telle ou telle méthode renvoie un PDOStatement, il est préférable de le nommer $stmt au lieu de $req, n'importe qui en voyant $stmt saura immédiatement à quoi cela correspond.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  3. #3
    Futur Membre du Club
    Merci pour la réponse.
    J'ai utilisé ta réquete mais elle renvoie false. ça n'affiche pas d'erreur mais son exécution renvoie false.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     public function updateSpeaker($email, Intervenant $int) {
              if ($this->readSpeaker($email)!=null) {
     
              $req= $this->bd->prepare("UPDATE intervenant SET biographie= :biographie 
                                                            WHERE email_user=:email;");
     
              $data = array(':biographie'=>$int->getBio(), ':email' => $email);
     
     
     
           //var_export($this->speakersList());
            $req2= $this->bd->prepare("UPDATE users SET  nom= :nom,
                                                         prenom = :prenom, 
                                                         adresse = :adresse, 
                                                         regime_Alimentaire = :regime_Alimentaire,
                                                         pays = :pays, 
                                                         allergies = :allergies, 
                                                         taille_vetement  = :taille_vetement, 
                                                         tel = :tel, 
                                                         organisation = :organisation,
                                                         photo = :photo
                                                   WHERE email_user=:email;");
     
               $data1 = array(':nom'=>$int->getFirstName(), 
                              ':prenom'=>$int->getLastName(), 
                              ':adresse'=>$int->getAdress(), 
                              ':regime_Alimentaire'=>$int->getDiet(), 
                              ':pays'=>$int->getCountry(), 
                              ':allergies'=>$int->getAllergy(), 
                              ':taille_vetement'=>$int->getClothingSize(), 
                              ':tel'=>$int->getTelNumber(), 
                              ':photo' => $int->getPicture(),
                              ':organisation'=>$int->getOrganization(),
                              ':email' => $email
                            );
     
                $req2->execute($data1);
                //$req->execute($data);
     
                echo "<br>Dans EventStorage : ";
            var_export($this->readSpeaker($email));
            echo "<br>Objet Intervenant  dans EventStorage: <br>";
              var_export($int);
                return true;
              }
              return false;
            }


    Je vois pas d'où l'erreur vient.

  4. #4
    Modérateur

    salut,

    faut que tu bosses aussi un peu de ton côté.
    si tu ramasses false, c'est que le premier test if ($this->readSpeaker($email)!=null) échoue, d'ailleurs j'avais repris ton code ainsi if ($this->readSpeaker($email) !== null), ce n'est pas pour rien. Ma version porte sur un test de type et de valeur, comme null l'est.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  5. #5
    Futur Membre du Club
    Le false se trouve dans le bloc if. J’ai fait un var_export() sur $req2->execute($data2), le false était sur l’exécution de la requête . Mais c’est bon, j’ai repris le code à zéro et ça marche maintenant(bizarrement). J’avais sûrement jappé un petit truc de nommage ou un truc du genre.
    Merci pour ton aide