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 :

Voir si un select est vide


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut Voir si un select est vide
    Bonjour,

    J'essaye de voir depuis 2 jours comment instantier un client qui se connecte. Pour ça, je dois faire une requête qui me retourne le nom du client (ou rien si le login n'est pas bon).

    C'est là que je planche. Impossible de tester si mon résultat est vide. La condition laisse toujours passer.

    Je débute tout à fait en PHP, merci d'être compatissant.

    Voici mon test

    C'est la ligne if ($nombre['Nombre'] == '1') qui me pose le problème.
    J'ai fait un select count(*) AS `Nombre`where login = varlogin (dans une procédure stockée.

    Donc, si le login existe, il me retourne la valeur 1.

    Avant j'avais fait un select col1, col2, etc... et dans la classe client pour ma condition, j'avais fait un if($reponse) puis un if ($response = $listClient->fetch().

    Rien ne fonctionne.

    Help me please.





    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
     
    class Client {
     
        private $idClient;
        private $nom;
        private $prenom;
        private $role;
        private $login;
        private $motDePasse;
        private $compteur;
        private $dateDeNaissance;
        private $sexe;
        public $nombre;
     
        function __construct($login, $motDePasse) {
            $this->login = $login;
            $this->motDePasse = $motDePasse;
            $this->authClient();
        }
     
        function authClient() {
            $nombreClient = DAO::clientExist($this->login);
            $nombre = $nombreClient->fetch();
            if ($nombre['Nombre'] == '1') {
                $this->nombre = $nombre['Nombre'];
                $nombreClient->closecursor();
                $listClient = DAO::listClientParLogin($this->login);
                $reponse = $listClient->fetch();
                $this->idClient = $reponse['IdClient'];
                $this->nom = $reponse['Nom'];
                $this->prenom = $reponse['Prenom'];
                $this->role = $reponse['Role'];
                $this->compteur = $reponse['Compteur'];
                $this->dateDeNaissance = $reponse['DateDeNaissance'];
                $this->sexe = $reponse['Sexe'];
                $listClient->closecursor();
     
                if ($this->compteur >= 3) {
                    return 0;
                } else {
                    $listClient = DAO::listClientParLoginMotDePasse($this->motDePasse, $this->login);
                    $reponse = $listClient->fetch();
                    if ($reponse['Nombre'] == 1) {
                        $this->compteur = 0;
                        $listClient->closecursor();
                        $listClient = DAO::updateClientCompteur($this->compteur, $this->idClient);
                        $listClient->closecursor();
                        return 1;
                    } else {
                        $this->compteur +=1;
                        $listClient->closecursor();
                        $listClient = DAO::updateClientCompteur($this->compteur, $this->idClient);
                        $listClient->closecursor();
                    }
                    return -1;
                }
            } else {
                return -2;
            }
        }
    Voici ma classe DAO qui accède à la base de données MySQL.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?php
     
    class DAO {
     
        /**
         * @var Singleton
         * @access private
         * @static
         */
        private static $_instance = null;
        private static $bdd;
        private static $cle = '************';
     
        /**
         * Constructeur de la classe
         *
         * @param void
         * @return void
         */
        private function __construct() {
     
        }
     
        public static function getInstance() {
            if (is_null(self::$_instance)) {
                self::$_instance = new DAO();
            }
            return self::$_instance;
        }
     
        public static function listAnnees() {
            $listAnnees = self::$bdd->query('call listAnnees()');
     
            return $listAnnees;
        }
     
        public static function getConnexion() {
            try {
                $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                $bdd = new PDO('mysql:host=localhost;dbname=courrier', 'root', '', $pdo_options);
            } catch (Exception $e) {
                die('Erreur : ' . $e->getMessage());
            }
            self::$bdd = $bdd;
            return $bdd;
        }
     
        public static function listClientParLogin($login) {
            $listClient = self::$bdd->query('call listClientParLogin(\'' . $login . '\',\'' . self::$cle . '\')');
            return $listClient;
        }
     
        public static function listClientParLoginMotDePasse($motDePasse, $login) {
            $listClient = self::$bdd->query('call listClientParLoginMotDePasse(\'' . $motDePasse . '\',\'' . $login . '\',\'' . self::$cle . '\')');
            return $listClient;
        }
     
        public static function updateClientCompteur($compteur, $idclient) {
            $listClient = self::$bdd->query('call updateClientCompteur (' . $compteur . ',' . $idclient . ');');
            return $listClient;
        }
     
        public static function clientExist($login) {
            $nombreClient = self::$bdd->query('call clientExist (\'' . $login  . '\',\'' . self::$cle . '\')');
            return $nombreClient;
        }
     
    }
     
    ?>

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    C'est la ligne if ($nombre['Nombre'] == '1') qui me pose le problème.
    1. Et que vaut $nombre ? Fais un print_r( ) ou un var_dump( ) ;
    2. Si $nombre['Nombre'] contient un entier autant le comparer avec... un entier, donc retire les ' autour du 1, sinon le 1 est considéré comme une chaîne ;
    3. DAO::clientExist( ), vu son nom, devrait plutôt retourner un booléen ;-)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Citation Envoyé par Séb. Voir le message
    1. Et que vaut $nombre ? Fais un print_r( ) ou un var_dump( ) ;
    2. Si $nombre['Nombre'] contient un entier autant le comparer avec... un entier, donc retire les ' autour du 1, sinon le 1 est considéré comme une chaîne ;
    3. DAO::clientExist( ), vu son nom, devrait plutôt retourner un booléen ;-)
    D'abord merci de l'aide.

    1. Print_r ($nombre) renvoie ceci: Array ( [Nombre] => 0 [0] => 0 )
    2. Correct, mais j'ai fait des tas de tests et parmi les derniers, je me suis dit que peut-être, $nombre['Nombre'] renvoyait un String. Donc j'y ai mis des quotes, mais ça ne change rien.
    3. Non, il renvoye un int: 0 si le login n'existe pas, 1 s'il existe. En fait, il récupère le count(*) de la procédure.

    Voilà.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par rj450 Voir le message
    1. Print_r ($nombre) renvoie ceci: Array ( [Nombre] => 0 [0] => 0 )
    Donc $nombre est un tableau, et $nombre['Nombre'] vaut 0 (zéro).
    Si ce résultat est incorrect il faut voir en amont d'où peut venir le bug. Peut-être dans la procédure stockée.

    2. Correct, mais j'ai fait des tas de tests et parmi les derniers, je me suis dit que peut-être, $nombre['Nombre'] renvoyait un String. Donc j'y ai mis des quotes, mais ça ne change rien.
    Retire les quotes.

    3. Non, il renvoye un int: 0 si le login n'existe pas, 1 s'il existe. En fait, il récupère le count(*) de la procédure.
    Dans ce cas il faut changer le nom de la variable $nombreClient, sinon je m'attends à avoir de 0 à n clients. Oui je chipote mais j'estime important que le code soit facilement lisible ;-)




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public static function clientExist($login) {
            $nombreClient = self::$bdd->query('call clientExist (\'' . $login  . '\',\'' . self::$cle . '\')');
            return $nombreClient;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        function authClient() {
            $nombreClient = DAO::clientExist($this->login);
            $nombre = $nombreClient->fetch();
            if ($nombre['Nombre'] == '1') {
    Si j'étais toi je mettrais le fetch( ) dans clientExist( ) et clientExist( ) retournerait directement le résultat. Idem pour les autres méthodes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Bonjour,


    Donc $nombre est un tableau, et $nombre['Nombre'] vaut 0 (zéro).
    Si ce résultat est incorrect il faut voir en amont d'où peut venir le bug. Peut-être dans la procédure stockée.
    C'est bien le résultat souhaité. La procédure a été vérifiée et elle est correcte. Elle renvoye 0 si le login n'est pas dans la BD, sinon elle renvoye 1.

    J'ai refait un print_r($nombre).

    Si le login est connu, le résultat est: Array ( [Nombre] => 1 [0] => 1 )
    Si le login est inconnu, le résultat est : Array ( [Nombre] => 0 [0] => 0 )

    Ce qui est exactement ce que je recherche.

    Retire les quotes.
    Quotes retirées. Ceci dit ces quotes n'apparaissaient que parce que j'avais fait un copier coller du dernier code. J'avais toujours fait mes tests sans quotes. Bref...

    Dans ce cas il faut changer le nom de la variable $nombreClient, sinon je m'attends à avoir de 0 à n clients. Oui je chipote mais j'estime important que le code soit facilement lisible ;-)
    Je l'ai renommée en '$isExist'.

    Si j'étais toi je mettrais le fetch( ) dans clientExist( ) et clientExist( ) retournerait directement le résultat. Idem pour les autres méthodes
    C'est fait.

    Juste une question là-dessus.

    J'ai fait le test avec le fetch() dans clientExist() et puis qu'en est-il des ->closecursor()?

    J'ai du les effacer. Je déduis que quand je fais un 'return $listClient->fetc();' et que par conséquent je sors de ma méthode, le closecursor() est fait?

    En attendant, je viens de trouver mon erreur.

    Je récupérai une de ces valeurs retournée par mon 'authClient()'. Valeur est soit -2, -1, 0 ou 1.

    Et je faisais un test
    Forcément, au lieu de faire une comparaison, je faisais une affectation.

    Ceci fonctionne déjà mieux.

    grrrrrr -> deux jours pour trouver un truc comme ça.

    Bon, j'imagine que c'est le métier qui rentre.

    Je ne passe pas encore en résolu car je voudrais la confirmation du closecursor().


    Merci

  6. #6
    Membre Expert
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Par défaut
    salut,

    mysql_num_rows devrait suffire.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 95
    Par défaut
    Citation Envoyé par Thes32 Voir le message
    salut,

    mysql_num_rows devrait suffire.
    Merci de l'aide.

    J'avais déjà essayé ça mais j'obtenais ceci:
    Warning: mysql_num_rows() expects parameter 1 to be resource, array given in C:\xampp\htdocs\courrier\modele\Client.class.php on line 25

    Et la ligne 25 de la classe Client contient :
    return mysql_num_rows($nombreClient);
    J'ai aussi essayé ça:
    return mysql_num_rows($nombre);

    Pas de différence.

    Merci

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    mysql_num_rows( ) doit avoir en argument une ressource MySQL retournée par mysql_query( ), rien d'autre.

Discussions similaires

  1. Vérifier si la valeur d'un select est vide
    Par Bourg dans le forum jQuery
    Réponses: 3
    Dernier message: 30/05/2015, 15h16
  2. Réponses: 2
    Dernier message: 04/07/2014, 20h28
  3. Somme de deux select dont l'un est 'vide'
    Par djidee dans le forum SQL
    Réponses: 2
    Dernier message: 06/11/2009, 15h31
  4. Comment faire pour que SELECT retourne 0 s'il est vide
    Par Chacha35 dans le forum Développement
    Réponses: 4
    Dernier message: 14/10/2009, 13h58
  5. [CR] Avoir seulement une page blanche qd la base est vide???
    Par littleChick dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 13/08/2002, 18h26

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