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 :

PDO et count [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut PDO et count
    Bonjour
    Dites-moi si je me trompe, mais j'en étais restée là.
    On fait sans arrêt du SQL à la volée, et on a BESOIN pour l'algo de savoir si une requête produite ainsi retourne 0 ou n résultats.
    En PDO, pas de fonction classique num_rows sur un select.
    Donc la SEULE façon de contourner le problème est d'utiliser ce genre de logique (un query sur une requête count, un execute sur la requête select.

    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
    $data=array();
    $sqlCount='select count(distinct id) as nb
    from matable
    where champ="'.$filtre.'";';
    if($res=$pdo->query($sqlCount)){
    	if ($res->fetchColumn() > 0){
    		$sql='select champ1,champ2,champ3
    		from matable
    		where champ="'.$filtre.'";';
    		$stmt=$dereq->prepare($sql);			
    		$stmt->execute();
    		while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    			array_push($data,$row);
    		}
    	}
    	else{
    		echo 'Cette requête ne retourne aucun résultat.';
    	}
    }
    1) Dites-moi si j'ai bon là dessus.
    2) Si oui, mon problème est le suivant :
    Quand on génère des requêtes UNION à la volée, voir d'autres requêtes tout aussi alambiquées (sous requetes etc), comment coder le count... Avant de me lancer dans du traitement de chaînes un peu torturé, j'aimerais savoir si vous avez d'autres méthodes.

    Merci d'avance,

    Sylvie
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Oh que oui il y a plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $sql = 'select champ1,champ2,champ3
    		from matable
    		where champ="' . $filtre . '";';
    $stmt = $dereq->prepare($sql);
    $stmt->execute();
    $res = $stmt->fetchAll();
     
    if (empty($res)) {
        echo 'vide';
    } else {
        //Do something..
    }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Oui, enfin bon, si tu as 12 millions de résultats, un fetchAll c'est un peu excessif...

    Si le but est uniquement d'afficher "j'ai rien fait pasque j'avais pas de résultat", tu peux contourner le problème avec un booléen :
    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
    $data=array();
     
    $sql='select champ1,champ2,champ3
    from matable
    where champ="'.$filtre.'";';
    $stmt=$dereq->prepare($sql);			
    $stmt->execute();
     
    $ligneTrouvee = false;
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    	$ligneTrouvee = true;
    	array_push($data,$row);
    }
     
    if (!$ligneTrouvee) {
    	echo 'Cette requête ne retourne aucun résultat.';
    }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Oui, enfin bon, si tu as 12 millions de résultats, un fetchAll c'est un peu excessif...
    Ca prendra pas plus de temps qu'avec un fetch, voir même moins. Je dis pas que ce sera rapide non ça c'est sur,, mais dans tous les cas ce sera lent.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Effectivement. Cela dit, si tu fais de toute façon une boucle avec fetch ensuite, autant en profiter
    (évidemment, faire le fetchAll puis la boucle sur le fetch, c'est pas une bonne idée du tout, du tout, du tout...)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par Celira Voir le message
    Oui, enfin bon, si tu as 12 millions de résultats, un fetchAll c'est un peu excessif...

    Si le but est uniquement d'afficher "j'ai rien fait pasque j'avais pas de résultat", tu peux contourner le problème avec un booléen :
    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
    $data=array();
     
    $sql='select champ1,champ2,champ3
    from matable
    where champ="'.$filtre.'";';
    $stmt=$dereq->prepare($sql);			
    $stmt->execute();
     
    $ligneTrouvee = false;
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    	$ligneTrouvee = true;
    	array_push($data,$row);
    }
     
    if (!$ligneTrouvee) {
    	echo 'Cette requête ne retourne aucun résultat.';
    }
    Bon, ben je retiens ta solution simple Celira.
    Tu es d'accord que ça revient au même que d'aller chercher le sizeof($data) après la boucle ou j'ai encore raté un truc ?
    Je sais pas pourquoi, je m'imaginais que ça n'était pas pertinent...
    Merci bien.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Effectivement, si tu stockes les données au fur et à mesure de la boucle dans $data, regarder la taille de $data fonctionnera très bien.
    Le booléen est utile surtout si tu fais de l'affichage dans la boucle et pas du stockage de données.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    @Dendrite

    Pour des questions de performances, il est très largement préférable de privilégier une structure de langage à l'appel d'une fonction car ce dernier est entre 3 et 6 fois plus lent.
    Dans tes codes tu peux avantageusement remplacer partout array_push($data, $row); par $data[] = $row;

  9. #9
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Merci à vous deux.
    Tout est noté, je peux terminer ma librairie !
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] count (*) as total pdo
    Par speedylol dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 10/01/2014, 04h32
  2. [PDO] PDO et COUNT
    Par Invité dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/10/2013, 12h39
  3. [PDO] Récupérer le résultat d'un COUNT avec PDO
    Par Zanarkand dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/11/2012, 20h24
  4. [PDO] Count(*) + LIKE PDO
    Par icarius62 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/03/2012, 22h28
  5. [PDO] Pdo fetch et count
    Par rikemSen dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/09/2010, 12h02

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