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 :

la fonction fetchColumn()


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut la fonction fetchColumn()
    Bonjour,

    Ça fait longtemps que je n'ai pas touché à la programmation,
    "PHP objet" et "PDO" c'est nouveau pour moi,
    je suis en train d'apprendre avec des tutoriels.

    J'ai compris que quand on créer une classe, il faut en créer une autre pour la gérer dans la base de données (par convention "maClassManager").

    Je suis tombé sur un exemple qui me fait patauger sur la fonction fetchColumn

    Je suis allé voir le manuel :
    http://www.php.net/manual/fr/pdostat...etchcolumn.php

    le manuel dit :
    "retourne une colonne depuis la ligne suivante d'un jeu de résultats."

    Je ne comprends pas ce que ça veut dire... Pas même avec les exemples...

    Dans le tutoriel, on a les fichiers :
    - "Personnage.class.php"
    - "PersonnagesManager.class.php"

    on cherche a savoir si un personnage est déjà dans la base de données

    la fonction "existe" est écrite dans "PersonnagesManager.class.php" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function existe($info)
      {
        if (is_int($info)) // On veut voir si tel personnage ayant pour id $info existe.
        {
          return (bool) $this->_db->query('SELECT COUNT(*) FROM personnages WHERE id = '.$info)->fetchColumn();
        }
         
        // Sinon, c'est qu'on veut vérifier que le nom existe ou pas.
         
        $q = $this->_db->prepare('SELECT COUNT(*) FROM personnages WHERE nom = :nom');
        $q->execute(array(':nom' => $info));
         
        return (bool) $q->fetchColumn();
      }

    et on appel la fonction existe de cette manière :
    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
    $db = new PDO('mysql:host=localhost;dbname=mini-test', 'root', '');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); // On émet une alerte à chaque fois quune requête a échoué.
     
    $manager = new PersonnagesManager($db);
     
    if (isset($_POST['nom']))
    {
      $perso = new Personnage(array('nom' => $_POST['nom']));
      
      if ($manager->existe($perso->nom()))
      {
        $message = 'Le nom du personnage est déjà pris.';
        unset($perso);
      }
      else
      {
        $manager->add($perso);
      }
    }

    Alors dans ma tête c'est archi confus...
    Je ne comprend pas ce que fait la fonction fetchColumn


    j'en arrive à me dire :
    "Quand je fais une requête avec un manager, il faut mettre fetchColumn à la fin, sinon on a une erreur de type PDO::STATEMENT"

    J'imagine que je dis n'importe quoi... Est-ce que vous pouvez m'aider svp ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    FETCHCOLONNE renvoie les données d'une seule colonne, par défaut la 1ere, donc c'est plutôt pas très pratique sauf si on ne sélectionne qu'une colonne...
    Après avoir exécuté (EXECUTE/QUERY) la requête il faut récupérer les lignes, en anglais les FETCH.
    Mais vous pouvez utiliser les méthodes FETCH/FETCHALL pour récupérer plus classiquement la valeur.

    Dans l'exemple la requête renvoie 1 ligne de 1 colonne, le développeur a probablement trouvé plus rapide de coder avec FETCHCOLONNE.

    Quelques commentaires sur le code proposé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT COUNT(*) FROM personnages WHERE id = '.$info
    Il FAUT utiliser une variable de liaison également pour l'id comme pour le nom, c'est très important pour les perfs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ($manager->existe($perso->nom()))
      {
        $message = 'Le nom du personnage est déjà pris.';
        unset($perso);
      }
      else
      {
        $manager->add($perso);
      }
    Je ne comprends pas l'utilité de ce genre de code...
    Si le nom doit être unique, on place une contrainte d'unicité sur la colonne nom.
    Ensuite il suffit de passer l'INSERT et de gérer l'erreur pour afficher le message, inutile de sélectionner pour prendre une décision.

    Tester au préalable la disponibilité du nom a du sens pour faciliter l'utilisation du formulaire, par exemple :
    L'utilisateur est informé que le nom n'est pas disponible AVANT de valider le formulaire, typiquement en ajax.
    Mais dans ce cas le test d'existence n'est pas suivi d'un ajout en base, tel que le code est proposé, ça n'a aucune utilité...

  3. #3
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut
    merci beaucoup pour la réponse,

    mais mince, ça n'est toujours pas clair pour moi...

    FETCHCOLONNE renvoie les données d'une seule colonne, par défaut la 1ere, donc c'est plutôt pas très pratique sauf si on ne sélectionne qu'une colonne...
    Après avoir exécuté (EXECUTE/QUERY) la requête il faut récupérer les lignes, en anglais les FETCH.
    Mais vous pouvez utiliser les méthodes FETCH/FETCHALL pour récupérer plus classiquement la valeur.

    Dans l'exemple la requête renvoie 1 ligne de 1 colonne, le développeur a probablement trouvé plus rapide de coder avec FETCHCOLONNE.
    ok ça m'éclaircit déjà beaucoup, merci.


    Mais dans ce cas le test d'existence n'est pas suivi d'un ajout en base, tel que le code est proposé, ça n'a aucune utilité...
    Je n'arrive pas bien à te suivre.
    Si le personnage existe déjà on ne l'ajoute pas, sinon, on l'ajoute dans la base. Ça à l'air bon non ? Peut-être que quelque chose m'échappe...
    Si c'est le cas, je pense qu'il faut prendre en considération que c'est un tutoriel, peut-être que l'auteur choisit de présenter des cas juste pour l'exemple, et que le code n'a pas une finalité en soi.


    En tous cas je patauge toujours

    php objet c'est nouveau pour moi, et donc les "managers" aussi.

    Je vais dire ce que je pense avoir compris, je vais probablement dire des bêtises, mais je pense que ça va vous permettre de comprendre où je bloque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (bool) $this->_db->query('SELECT COUNT(*) FROM personnages WHERE id = '.$info)->fetchColumn();
    1) ici, "$this" représente un manager,
    2) la requête récupère le nombre de lignes qu'il y a d'id "$info" dans la table (c'est Français ça..?). Donc j'imagine que la requête récupère la valeur 1 ou 0.

    Je ne comprends pas pourquoi on utilise un fetchColumn à la fin parce-que si fetchColumn renvoi la ligne d'une colonne (quelle ligne d'ailleurs ? la dernière ?) alors pourquoi l'appliquer à un "int" ?


    en vérité j'ai même du mal à traduire cette ligne de code en Français :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_db->query('SELECT COUNT(*) FROM personnages WHERE id = '.$info)->fetchColumn();
    Traduction...

    le manager utilise son attribut (qui est une instance de PDO) qui va envoyer une requête qui compte le nombre de personnages qui on l'id "$info" (0 ou 1 donc)

    et à la fin, fetchColumn s'applique à la reqête,
    c'est query('SELECT COUNT(*) FROM personnages WHERE id = '.$info) qui appel la fonction "fetchColumn()"

    ...fin traduction.

    j'ai essayé d'enlever "->fetchcolumn" à la fin,
    évidement ça ne marche plus,
    mais je ne comprends toujours pas pourquoi...

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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