Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQLSTATE[HY093]: Invalid parameter number: paramet

Sujet résolu
    10 décembre 2018 à 11:25:46

    Salut,

    je cherche à update ma DB, mais j'ai cette erreur : SQLSTATE[HY093]: Invalid parameter number: parameter was not defined .

    je crois avoir tout écris normalement . :

    mon code : 

    private function update() {
          $sql = '
              UPDATE '.self::TABLE_NAME.'
              SET `first_name` = :first_name,
              `last_name` = :last_name,
              `road_number` = :road_number,
              `road_name` = :road_name,
              `region` = :region,
              `departement` = :departement,
              `town` = :town,
              `phone_number` = :phone_number,
              `email` = :email,
              `date_updated` = :NOW()
    
              WHERE id = :id
          ';
          // Je prépare
          $pdoStatement = Database::getPDO()->prepare($sql);
    
          // Je "bind"
          $pdoStatement->bindValue(':first_name', $this->first_name , PDO::PARAM_STR);
          $pdoStatement->bindValue(':last_name', $this->last_name, PDO::PARAM_STR);
          // TODO tester si une valeur décimale est acceptée
          $pdoStatement->bindValue(':road_number', $this->road_number, PDO::PARAM_INT);
          $pdoStatement->bindValue(':road_name', $this->road_name, PDO::PARAM_STR);
          $pdoStatement->bindValue(':region', $this->region, PDO::PARAM_STR);
          $pdoStatement->bindValue(':departement', $this->departement, PDO::PARAM_STR);
          $pdoStatement->bindValue(':town', $this->town, PDO::PARAM_STR);
          $pdoStatement->bindValue(':phone_number', $this->phone_number, PDO::PARAM_INT);
          $pdoStatement->bindValue(':email', $this->email, PDO::PARAM_STR);
          $pdoStatement->bindValue(':date_updated', $this->date_updated, PDO::PARAM_STR);
    
          $pdoStatement->bindValue(':id', $this->id, PDO::PARAM_INT);
    
          // J'exécute la requete
          $affectedRows = $pdoStatement->execute();
    
          return $affectedRows;
      }

    Merci de votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      10 décembre 2018 à 11:50:08

      Pourquoi : devant NOW() ?

      Et pourquoi binder :date_updated, qui n'existe pas dans la requête ? Ce ne sont pas les colonnes qu'il faut binder ...

      -
      Edité par julp 10 décembre 2018 à 11:50:54

      • Partager sur Facebook
      • Partager sur Twitter
        10 décembre 2018 à 12:19:40

        julp a écrit:

        Pourquoi : devant NOW() ?

        Et pourquoi binder :date_updated, qui n'existe pas dans la requête ? Ce ne sont pas les colonnes qu'il faut binder ...

        -
        Edité par julp il y a 6 minutes


        date_updated existe dans ma requête à la ligne 13 . quand je retire : devant NOW()  j'ai ça comme erreur : Invalid parameter number: number of bound variables does not match number of tokens .

        j'ai donc complètement retiré la ligne 13 et 31 et là, pas de MAJ . une nouvelle ligne est  crée avec à chaque fois id = 1.

        j'ai essayé de me connecter avec un autre user et faire une MAJ des informations, toujours pareil 

        • Partager sur Facebook
        • Partager sur Twitter
          10 décembre 2018 à 13:35:18

          Bonjour,

          Relis bien ce qu'a écrit Julp : il faut effectivement retirer la ligne 31 et corriger la 13.

           `date_updated` = NOW()



          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2018 à 14:03:01

            philodick a écrit:

            Bonjour,

            Relis bien ce qu'a écrit Julp : il faut effectivement retirer la ligne 31 et corriger la 13.

             `date_updated` = NOW()



              public function update() {
                  $sql = '
                      UPDATE '.self::TABLE_NAME.'
                      SET `first_name` = :first_name,
                      `last_name` = :last_name,
                      `road_number` = :road_number,
                      `road_name` = :road_name,
                      `region` = :region,
                      `departement` = :departement,
                      `town` = :town,
                      `phone_number` = :phone_number,
                      `email` = :email,
                      `date_updated` = NOW()
                      
                      WHERE id = :id
                  ';
                  // Je prépare
                  $pdoStatement = Database::getPDO()->prepare($sql);
            
                  // Je "bind"
                  $pdoStatement->bindValue(':first_name', $this->first_name , PDO::PARAM_STR);
                  $pdoStatement->bindValue(':last_name', $this->last_name, PDO::PARAM_STR);
                  // TODO tester si une valeur décimale est acceptée
                  $pdoStatement->bindValue(':road_number', $this->road_number, PDO::PARAM_INT);
                  $pdoStatement->bindValue(':road_name', $this->road_name, PDO::PARAM_STR);
                  $pdoStatement->bindValue(':region', $this->region, PDO::PARAM_STR);
                  $pdoStatement->bindValue(':departement', $this->departement, PDO::PARAM_STR);
                  $pdoStatement->bindValue(':town', $this->town, PDO::PARAM_STR);
                  $pdoStatement->bindValue(':phone_number', $this->phone_number, PDO::PARAM_INT);
                  $pdoStatement->bindValue(':email', $this->email, PDO::PARAM_STR);
            
            
                  $pdoStatement->bindValue(':id', $this->id, PDO::PARAM_INT);
            
                  // J'exécute la requete
                  $affectedRows = $pdoStatement->execute();
            
                  return $affectedRows;
              }

            ma requête ressemble à ça mais j'ai plus rien en base de données 

            Sinon voila ma functon profile() :

            public function profile(){
            
                    // On teste si l'utilisateur est connecté(e)
                    if (User::isConnected()) {
            
                      // dump($_POST);
                      // exit;
            
                      if (!empty($_POST)) {
                        // On récupère les données
                        $last_name = isset($_POST['last_name']) ? trim($_POST['last_name']) : '';
                        $first_name = isset($_POST['first_name']) ? trim($_POST['first_name']) : '';
                        $road_number = isset($_POST['road_number']) ? trim($_POST['road_number']) : '';
                        $phone_number = isset($_POST['phone_number']) ? trim($_POST['phone_number']) : '';
                        $road_name = isset($_POST['road_name']) ? trim($_POST['road_name']) : '';
                        $region = isset($_POST['region']) ? trim($_POST['region']) : '';
                        $departement = isset($_POST['departement']) ? trim($_POST['departement']) : '';
                        $town = isset($_POST['town']) ? trim($_POST['town']) : '';
                        $email = isset($_POST['email']) ? trim($_POST['email']) : '';
                        $id = isset($_POST['id']);
            
            
                        // Traiter les données
            
                            $userModel = new ParticulierModel();
            
                            $userModel->setFirstName($first_name);
                            $userModel->setLastName($last_name);
                            $userModel->setRoadNumber($road_number);
                            $userModel->setRoadName($road_name);
                            $userModel->setPhoneNumber($phone_number);
                            $userModel->setRegion($region);
                            $userModel->setDepartement($departement);
                            $userModel->setTown($town);
                            $userModel->setEmail($email);
                            $userModel->setId($id);
                            
                            dump($userModel);
                            exit;
            
                            // Je peux sauvegarder le model
                            $insertedRows = $userModel->save();
                            dump($insertedRows);
                            exit;
                            if ($insertedRows > 0 ) {
                              // je peux rediriger car tout est ok
                              echo 'Ok => redirection';
                            }
                            else {
                              echo  " No =>>> Erreur dans ajout à la base de données ";
                            }
                      }


            Le dump à la ligne 6 donne :  

            array:9 [▼
              "last_name" => "Dupont"
              "first_name" => "Aline"
              "road_number" => "54"
              "road_name" => "Madeleine"
              "phone_number" => "783767441"
              "region" => "Provence-Alpes-Côte d'Azur"
              "departement" => "Alpes-Maritimes"
              "town" => "Nice"
              "id" => "2"]
            et celui à la ligne 38 :
            ParticulierModel {#12 ▼
              -id: true
              -first_name: "Aline"
              -last_name: "Dupont"
              -road_number: "54"
              -road_name: "Madeleine"
              -region: "Provence-Alpes-Côte d'Azur"
              -departement: "Alpes-Maritimes"
              -town: "Nice"
              -phone_number: "783767441"
              -email: ""
              -date_created: null
              -date_updated: null
              -password: null
              -role_id: null
            }
            et enfin ma méthode save à la ligne 42:
            public function save(){
                      // dump($this->id);
                      // exit;
                      if ($this->id > 0) {
                        $retour = $this->update();
            
                        return $retour;
                      }
                      else{
                        $retour = $this->insert();
            
                        return $retour;
                      }
                    }
             

            -
            Edité par thequiet 10 décembre 2018 à 14:26:17

            • Partager sur Facebook
            • Partager sur Twitter
              10 décembre 2018 à 15:22:23

              > mais j'ai plus rien en base de données

              Comment ça plus rien ? Que l'on sache, tu ne fais pas un DELETE ni TRUNCATE.

              Et t'as viré la gestion d'erreur PDO/SQL pour ne plus avoir de message d'erreur pour autant ?

              • Partager sur Facebook
              • Partager sur Twitter
                10 décembre 2018 à 15:33:29

                julp a écrit:

                > mais j'ai plus rien en base de données

                Comment ça plus rien ? Que l'on sache, tu ne fais pas un DELETE ni TRUNCATE.

                Et t'as viré la gestion d'erreur PDO/SQL pour ne plus avoir de message d'erreur pour autant ?

                julp a écrit:

                > mais j'ai plus rien en base de données

                Comment ça plus rien ? Que l'on sache, tu ne fais pas un DELETE ni TRUNCATE.

                Et t'as viré la gestion d'erreur PDO/SQL pour ne plus avoir de message d'erreur pour autant ?


                Je voulais dire que ma requête ne fait plus de mise à jour , so à chaque fois que je remplie mon formulaire de MAJ ça n'envoie rien en DB.  je n'ai plus d'erreurs pourtant la gestion est bien active .  

                Par contre je viens de me rendre compte que mon second DUMP  de la ligne 38 renvoie la valeur id = true au lieu d'un entier . le problème se trouve là . pour l'instant je ne sais pas trop comment corriger 

                • Partager sur Facebook
                • Partager sur Twitter
                  10 décembre 2018 à 15:39:42

                  Ah, oui, du coup il doit chercher à mettre à jour l'id 0 qui ne correspond à aucune ligne.

                  Et ton erreur est ici : $id = isset($_POST['id']);

                  Par contre, c'est un script en zone admin ? Non, parce que si tu passes l'id en POST, on peut modifier le compte de n'importe qui ...

                  -
                  Edité par julp 10 décembre 2018 à 15:41:18

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 décembre 2018 à 15:56:56

                    julp a écrit:

                    Ah, oui, du coup il doit chercher à mettre à jour l'id 0 qui ne correspond à aucune ligne.

                    Et ton erreur est ici : $id = isset($_POST['id']);

                    Par contre, c'est un script en zone admin ? Non, parce que si tu passes l'id en POST, on peut modifier le compte de n'importe qui ...

                    -
                    Edité par julp il y a 11 minutes


                    exactement @julp . j'ai rajouté du coup la fonction trim et ça marche nickel . Non non je ne suis pas en zone admin . pour l'instant je ne trouve pas un moyen pour transmettre l'id du user afin de pouvoir update . une Idée ??

                    Aussi une fois la ligne modifiée, je suis obligé de me déconnecter pour que les modification soient prises en compte . normal ?

                    -
                    Edité par thequiet 10 décembre 2018 à 16:00:16

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 décembre 2018 à 16:12:02

                      > pour l'instant je ne trouve pas un moyen pour transmettre l'id du user afin de pouvoir update . une Idée ??

                      Parce que tu ne l'as pas déjà en session ?

                      > Aussi une fois la ligne modifiée, je suis obligé de me déconnecter pour que les modification soient prises en compte . normal ?

                      Si tu les stockes en session, sans les mettre à jour dans le même temps non plus, c'est parfaitement normal. Soit tu ne gardes que le strict nécessaire en session (l'id surtout) pour refaire un SELECT à chaque page (c'est lourd mais les données seront toujours à jour) soit, quand tu fais ta MàJ, tu t'arranges pour MàJ/écraser aussi celles en session.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 décembre 2018 à 17:39:06

                        julp a écrit:

                        > pour l'instant je ne trouve pas un moyen pour transmettre l'id du user afin de pouvoir update . une Idée ??

                        Parce que tu ne l'as pas déjà en session ?

                        > Aussi une fois la ligne modifiée, je suis obligé de me déconnecter pour que les modification soient prises en compte . normal ?

                        Si tu les stockes en session, sans les mettre à jour dans le même temps non plus, c'est parfaitement normal. Soit tu ne gardes que le strict nécessaire en session (l'id surtout) pour refaire un SELECT à chaque page (c'est lourd mais les données seront toujours à jour) soit, quand tu fais ta MàJ, tu t'arranges pour MàJ/écraser aussi celles en session.

                        >Parce que tu ne l'as pas déjà en session ?

                        Sisi, je l'ai en session . tu préfère ça ?? $id = $_SESSION['user']->getId();


                        Pour la seconde proposition, je vais voir comment mettre ça en place :(



                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 décembre 2018 à 18:06:13

                          > Sisi, je l'ai en session . tu préfères ça ?? $id = $_SESSION['user']->getId();

                          Ce n'est pas modifiable donc aucun risque que quelqu'un modifie le compte d'autrui.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 décembre 2018 à 22:02:55

                            julp a écrit:

                            > Sisi, je l'ai en session . tu préfères ça ?? $id = $_SESSION['user']->getId();

                            Ce n'est pas modifiable donc aucun risque que quelqu'un modifie le compte d'autrui.

                            C’est parfait . Merci d’avoir été là today . Je passe le sujet en résolu. 

                            -
                            Edité par thequiet 10 décembre 2018 à 22:03:32

                            • Partager sur Facebook
                            • Partager sur Twitter

                            SQLSTATE[HY093]: Invalid parameter number: paramet

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown