Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/11/2011, 17h51   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 12
Points : 12
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 :
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 :
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;
    }
 
}
 
?>
rj450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 18h59   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Citation:
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 ;-)
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 19h03   #3
Rédacteur/Modérateur
 
Avatar de Thes32
 
Homme
Développeur Web
Inscription : décembre 2006
Messages : 2 335
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2006
Messages : 2 335
Points : 3 774
Points : 3 774
salut,

mysql_num_rows devrait suffire.
__________________
Développeur | Zend Certified Engineer

Étapes Pour mieux se servir du forum:
1. Commencez par lire les cours et tutoriels ;
2. Faites une recherche;
3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

Nix>_Rien n'est plus pratique que la théorie
Thes32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 20h17   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 12
Points : 12
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à.
rj450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 20h24   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 12
Points : 12
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
rj450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 20h43   #6
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
mysql_num_rows( ) doit avoir en argument une ressource MySQL retournée par mysql_query( ), rien d'autre.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 21h02   #7
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
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.

Citation:
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.

Citation:
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 :
1
2
3
4
    public static function clientExist($login) {
        $nombreClient = self::$bdd->query('call clientExist (\'' . $login  . '\',\'' . self::$cle . '\')');
        return $nombreClient;
    }
Code :
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.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2011, 10h16   #8
Candidat au titre de Membre du Club
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 12
Points : 12
Bonjour,


Citation:
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.

Citation:
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...

Citation:
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'.

Citation:
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
rj450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h27.


 
 
 
 
Partenaires

Hébergement Web