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 16/03/2011, 18h39   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
Par défaut pourquoi "SELECT count(*) as nb .." renvoie un string ?

Bonjour,

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

Code :
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 :
1
2
array
  'nb' => string '1' (length=1)
Pourquoi 'nb' retourne une chaîne de caractère et non un entier ?

merci
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 18h48   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
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 :
1
2
 
$count = (int)$row['nb'];
Des questions ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 19h04   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 33
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 33
Points : 12
Points : 12
merci, j'avais oublié ce principe (ou je ne l'ai jamais su ).
berlo44 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h22   #4
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
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 :
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);
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 17/03/2011, 12h37   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
De toute façon tu t'en fiche pas mal du type de tes variables, PHP est typé faible:
Code :
1
2
3
 
$a = 1 + 1.0 + "1" + "1.0"
echo $a; // 4
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h11   #6
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
@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).
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h50   #7
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : Finance

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
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 :
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 :
$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())
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 13h56   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
Citation:
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 14h46   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
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)
__________________
http://blog.stealth35.com/
stealth35 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 19h13.


 
 
 
 
Partenaires

Hébergement Web