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 :

pourquoi "SELECT count(*) as nb .." renvoie un string ?


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut pourquoi "SELECT count(*) as nb .." renvoie un string ?
    Bonjour,

    Je m'essaie au PDO & singleton avec cette class.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $db1 = Outils_Bd::getInstance()->getConnexion(DSN_DATA, USER_DATA, PASS_DATA);
    $stmt=$db1->prepare("SELECT count(*) as nb FROM membres WHERE mb_login =:login");
    $stmt->bindparam(':login', $login, PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);  // retourne un string
    $stmt = NULL;
    var_dump($result);
    et j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array
      'nb' => string '1' (length=1)
    Pourquoi 'nb' retourne une chaîne de caractère et non un entier ?

    merci

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Parce que tout (à l'exception de null) ce qui provient d'une requête est interprété comme une chaine de caractères par PHP.

    Utilise le typecasting pour avoir des entiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $count = (int)$row['nb'];
    Des questions ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    merci, j'avais oublié ce principe (ou je ne l'ai jamais su ).

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Citation Envoyé par berlo44 Voir le message
    Je m'essaie au PDO & singleton
    PDO a la solution pour faire un count(). http://fr.php.net/manual/fr/pdostatement.rowcount.php

    Ton code deviendrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $db1 = Outils_Bd::getInstance()->getConnexion(DSN_DATA, USER_DATA, PASS_DATA);
    $stmt=$db1->prepare("SELECT * as nb FROM membres WHERE mb_login =:login");
    $stmt->bindparam(':login', $login, PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->rowCount();  // retourne un int
    $stmt = NULL;
    var_dump($result);

  5. #5
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    De toute façon tu t'en fiche pas mal du type de tes variables, PHP est typé faible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $a = 1 + 1.0 + "1" + "1.0"
    echo $a; // 4

  6. #6
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    @Shikiryu
    Ce serait tout de même bien moins performant. Dans le cas d'une table contenant un million de n-uplet tu les chargeraient tous en mémoire, alors qu'une requête count faite en SQL ne ferrai que les parcourir et les compter sans les charger en mémoire (puisqu'aucun retour n'est demandé de ces n-uplets).

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    De toute façon tu t'en fiche pas mal du type de tes variables, PHP est typé faible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $a = 1 + 1.0 + "1" + "1.0"
    echo $a; // 4
    Je sais pas si c'est un bon conseil. C'est autant une des forces qu'une des faiblesse du php. Si une erreur survient dans sa requête, rien n'est contrôlé ici (ni les erreurs, ni le type de retour), tu recevras un booléen (false) qui avec ton caste en int donnera 0... bof bof.

    Citation Envoyé par transgohan Voir le message
    @Shikiryu
    Ce serait tout de même bien moins performant. Dans le cas d'une table contenant un million de n-uplet tu les chargeraient tous en mémoire, alors qu'une requête count faite en SQL ne ferrai que les parcourir et les compter sans les charger en mémoire (puisqu'aucun retour n'est demandé de ces n-uplets).
    Tout dépend du use-case (ici non indiqué). Souvent, quand on veut connaitre le nombre de lignes d'un SELECT, on veut aussi une liste d'éléments.
    Puis, si cette requête est souvent appelée, même avec un count(*), elle sera laborieuse. Dans ce cadre là, je passerai par un cache de la requête ou par une vue statistique.

    Mais quoi qu'il arrive, je viens de bien relire le manuel et quelque chose me semblant acquis est erroné : Il faut éviter d'utiliser rowCount() dans les requêtes type SELECT (dixit http://www.php.net/manual/fr/pdostatement.rowcount.php)

    Il est beaucoup plus utile dans le cadre d'un UPDATE / INSERT / DELETE pour connaitre le nombre de lignes affectées par la dernière requête. (et donc faire des vérifications sécuritaires ou de l'affichage)

    Enfin, quoi qu'il arrive même si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = (int)$stmt->fetch(PDO::FETCH_ASSOC);
    fonctionne, il serait judicieux de vérifier d'abord si execute() ne retourne pas d'erreur (et la même pour le fetch())

  8. #8
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Je sais pas si c'est un bon conseil. C'est autant une des forces qu'une des faiblesse du php. Si une erreur survient dans sa requête, rien n'est contrôlé ici (ni les erreurs, ni le type de retour), tu recevras un booléen (false) qui avec ton caste en int donnera 0... bof bof.
    Bien entendu qu'il faut contrôler, ça paraît évident. Mais pour les types de variables, ça ne sert pas à grand chose de les caster, c'est ce que j'ai voulu dire. Seuls ceux qui ont le luxe de pouvoir installer la PECL SplTypes peuvent s'affranchir de cette contrainte de types en utilisant les wrappers.

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Seuls ceux qui ont le luxe de pouvoir installer la PECL SplTypes peuvent s'affranchir de cette contrainte de types en utilisant les wrappers.

    moi moi


    tien cadeau (pour version 5.3)

Discussions similaires

  1. [Java][debutant]select count(*) ne retourne rien !!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/01/2007, 11h39
  2. [MySQL] Mon SELECT COUNT me renvoie toujours 1
    Par diaboloche dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 11/07/2006, 11h53
  3. [Performance] RecordCount ou select Count(champ) ?
    Par shwin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/09/2004, 17h37
  4. résultat de " select count "
    Par marie253 dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2004, 12h07

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