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 :

Requète préparée et échappement [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut Requète préparée et échappement
    Bonjour bonjour !

    Ca fait 30 minutes que je bloque sur un problème de requête préparée. J'espère que vous pourrez m'éclairer un peu

    Voici le 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
    16
    17
    18
    19
    public function getIdsInd($listEq,$typeEq,$listNomInd)
      {
        $bdd = Model::getCqBdd();
     
        foreach ($listEq as $le)
        {
          foreach ($listNomInd as $lni)
          {
            $req = $bdd->prepare("SELECT ID FROM tab_:nomEq_:typeEq WHERE ID = :idInd");
            var_dump($req);
            $req->execute([':nomEq' => $le, ':typeEq' => $typeEq, ':lni' => "$lni"]);   // LIGNE 48
            var_dump($req);
            $listIdInd[] = $req->fetch(PDO::FETCH_NUM);  
          }
        }
        print "Liste ID ind :\n";
        var_dump($listIdInd);
        return $listIdInd;
      }
    et voici mon appel à cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->content['listeID'] = $this->gen_alarme_model->getIdsInd($this->content['listEq'],"XXX",$this->content['listeNomInd']);
    mon erreur :
    Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in gen_alarme_model.php:48 Stack trace: #0 gen_alarme_model.php(48): PDOStatement->execute(Array) #1 gen_alarme_controller.php(26): gen_alarme_model->getIdsInd(Array, 'XXX', Array) #2 [internal function]: gen_alarme_controller->Index() #3 index.php(35): call_user_func_array(Array, Array) #4 {main} thrown in gen_alarme_model.php on line 48
    Cependant je pense bien avoir déclaré et injecté le bon nombre de paramètres...

    Je dois avouer avoir un problème avec la visualisation de la requête une fois que les différents paramètres ont été injectés.

    Merci d'avance

  2. #2
    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
    :idInd n'est pas défini.
    Également le nom d'une table ne peut pas être mis en paramètre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Même si c'est qu'une partie du nom ? Y-a-t'il un moyen pour le faire quand même ? J'ai déclaré dans l'execute idInd mais j'ai toujours la même erreur étrangement. Ca vient du nom de la table qui ne doit pas contenir de param comme tu l'as dis ?

  4. #4
    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
    Même si c'est qu'une partie du nom ? Y-a-t'il un moyen pour le faire quand même ?
    Les paramètres ne peuvent pas être partiels et ne peuvent pas représenter des objets de la structure : double raison pour que ce ne soit pas possible.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach ($listEq as $le)
        {
          foreach ($listNomInd as $lni)
          {
            $tab = $le . "_" . $typeEq;
            $req = $bdd->prepare("SELECT ID_indicateur FROM tab_$tab WHERE ID_indicateur = :idInd");
            var_dump($req);
            $req->execute([':idInd' => $lni]);       
            var_dump($req);
            $listIdInd[] = $req->fetch(PDO::FETCH_NUM);  
          }
        }
    Je pense pouvoir contourner le problème comme ça non ?

    En faisant ça, je découvre peut-être le problème bloquant. Dans le message d'erreur il me dit que la base de données n'est pas la bonne. Voilà un bout de code qui permet d'avoir une meilleure vision.

    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
    public function getAllSeuils($typeEq)
      {
        $bdd = Model::getDevBdd();
        $req = $bdd->prepare("SELECT seuil_crit, seuil_maj, seuil_min FROM Indicateurs_Seuils_$typeEq");
        $req->execute();
        while ($row = $req->fetch(PDO::FETCH_NUM))
        {
          $listSeuils[] = $row[0];
          $listSeuils[] = $row[1];
          $listSeuils[] = $row[2];
        }
        var_dump($listSeuils);
        return $listSeuils;
      }
     
      /**
       * 
       * @param type $listEq : Liste des équipements
       * @param type $typeEq : Le type d'équipement (MME, SGSN, ...)
       * @param type $listNomInd : Liste des noms d'indicateurs en fct du type
       * @return type : Liste des ID indicateurs
       */
      public function getIdsInd($listEq,$typeEq,$listNomInd)
      {
        $bdd = Model::getCqBdd();
     
        foreach ($listEq as $le)
        {
          foreach ($listNomInd as $lni)
          {
            $tab = $le . "_" . $typeEq;
            $req = $bdd->prepare("SELECT ID_indicateur FROM indicateur_$tab WHERE ID_indicateur = :idInd");
            var_dump($req);
            $req->execute([':idInd' => $lni]);       
            var_dump($req);
            $listIdInd[] = $req->fetch(PDO::FETCH_NUM);  
          }
        }
        print "Liste ID ind :\n";
        var_dump($listIdInd);
        return $listIdInd;
      }
    Mes deux connexions fonctionnent mais apparemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd = Model::getCqBdd();
    ne marche pas. $bdd reste connecté à la première base. J'ai farfouillé afin de trouver des exemples avec deux connexions différentes mais j'ai rien trouvé de bien transcendant.

    Méthode de connexion base :
    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
     public function getCqBdd()
      {
        if (!isset(self::$_bdd))
        {
          try
          {
            $strConnexion = 'mysql:host=xxxx;dbname=xxxx';
            $arrExtraParam = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
            $pdo = new PDO($strConnexion, "xxx", "xxx", $arrExtraParam);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);
            self::$_bdd = new PDO($strConnexion, "xxx", "xxx", array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
          }
          catch (Exception $e)
          {
            die('Erreur, la connexion à la base de données de CQuest a échouée : ' . $e->getMessage());
          }
        }
        return self::$_bdd;
      }
    Une idée ?

  6. #6
    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
    Quelle est le message d'erreur exact ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ATR.indicateur_XXX_XXX' doesn't exist' in gen_alarme_model.php:57 Stack trace: #0 gen_alarme_model.php(57): PDOStatement->execute(Array) #1 gen_alarme_controller.php(26): gen_alarme_model->getIdsInd(Array, 'XXX', Array) #2 [internal function]: gen_alarme_controller->Index() #3 index.php(35): call_user_func_array(Array, Array) #4 {main} thrown in gen_alarme_model.php on line 57
    La présence d'ATR. signifie que la connexion existante pointe encore sur l'ancienne base.

  8. #8
    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
    Si tu utilises la propriété _bdd dans getDevBdd et dans getCqBdd, seul le premier utilisé sera pris en compte.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    J'ai viré tous les self::_ et ça à l'air de fonctionner. Je vais encore faire quelques tests pour voir si tout est ok !

    Pour être honnête, self:: et _ ne sont pas super clairs dans mon esprit et la doc n'est pas forcément super claire pour moi non plus...

    Merci !

  10. #10
    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
    self:: désigne la classe dans la quelle tu es, par opposition à parent:: par exemple.
    _ n'a pas de sens particulier
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Super. Merci beaucoup pour tes réponses rapides !

    Je clôture ce post.

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

Discussions similaires

  1. [PDO] échappement dans requête préparée
    Par andaman dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/12/2013, 21h59
  2. [PDO] Échappement dans une requête préparée
    Par shadeoner dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/05/2010, 21h16
  3. [PDO] Requête préparée
    Par Yoshio dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2007, 12h07
  4. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53
  5. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07

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