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 :

JPGraph : créer un array Countable depuis une requete SELECT COUNT [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut JPGraph : créer un array Countable depuis une requete SELECT COUNT
    Bonjour,

    Pour générer un bargraphe de nombre de présents par date, je vais compter le nombre de personnes marquées présentes dans une table, le tout groupé par date de présence et rangé par ordre chronologique.
    J'utilise JPGraph sur le site en developpement en local.

    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
     
    $requete3 = "SELECT
        	      DATE(`date_presence`) AS 'day', 
        	      COUNT(*) AS 'number_of_users' // prépare le comptage avec conditions
        	      FROM `presences` // depuis la table des présences
        	      WHERE `present` LIKE '%Pr%' // compte que les personnes marquées présentes 'Présent'
        	      GROUP BY DATE(`date_entrainement`) // regroupe par date de présence
        	      ORDER BY date_entrainement ASC"; // et affiche dans l'ordre chronologique
     
    $result3 = mysqli_query($conn, $requete3);
     
    foreach($result3 as $row3) {
    	$resultat3[] = $row3['number_of_users'];
    }
    $datay = implode(",",$resultat3);
    Le $datay devrait reprendre ces nombres l'un à la suite de l'autre, et séparés par une virgule. Soit $datay=array(7,7,7,9);
    Si je fais un echo $datay; , cela m'affiche bien 7,7,7,9

    Hors, dans mon code, je n'arrive pas à ressortir un graphique de plusieurs barres, une seule barre s'affiche, avec 9 ou j'obtiens une erreur
    Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, string given in /jpgraph/jpgraph.php:5394 Stack trace: #0 /jpgraph/jpgraph_bar.php(50): Plot->__construct('7,7,7,9', false) #1 graph.php(85): BarPlot->__construct('7,7,7,9') #2 {main} thrown in /jpgraph/jpgraph.php on line 5394
    D'après l'erreur, mon $datay serait compris comme une chaîne de caractères (string given).
    Comment puis-je faire remonter le nombre de présents par jour dans un array comme décrit ci-dessus et que ce soit pris comme un type Countable|array et non une chaine "string" ?

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 511
    Par défaut
    Bonjour,

    D'après l'erreur, tu essaies d'appliquer la fonction count() sur un string et pas sur un tableau.

    tu sais ce qu'elle fait cette ligne ? : $datay = implode(",",$resultat3);.

    à remplacer par :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $datay=array_column($resultat3,"day");
    //ou bien avec array_map 
    $datay=array_map(function($elem){ return $elem["day"];},$resultat3);

  3. #3
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    J'ai remplacé la ligne $datay = implode(",",$resultat3); par les deux codes fournis, un par un :
    Avec le premier code en remplacement, j'ai une erreur
    ArrayJpGraph Error: 25121 Empty input data array specified for plot. Must have at least one data point.
    Avec la seconde, erreur également :
    Fatal error: Uncaught TypeError: Cannot access offset of type string on string in /graph.php:68 Stack trace: #0 [internal function]: {closure}('7') #1 /graph.php(68): array_map(Object(Closure), Array) #2 {main} thrown in /graph.php on line 68
    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
    $requete3 = "SELECT
     
    			DATE(`date_presence`) AS 'day', 
        	      COUNT(*) AS 'number_of_users' 
        	      FROM `presences` 
        	      WHERE `present` LIKE '%Pr%'
        	      GROUP BY DATE(`date_entrainement`) 
        	      ORDER BY date_entrainement ASC";
     
    $result3 = mysqli_query($conn, $requete3);
     
    foreach($result3 as $row3) {
    	$resultat3[] = $row3['number_of_users'];
    }
    //$datay = implode(",",$resultat3); // ancien code qui donnait les résultats séparés par virgules mais en "string"
    $datay=array_column($resultat3,"day"); // premier test, erreur ArrayJpGraph Error: 25121 ---> remplacé par la 2e ligne de code 
    $datay=array_map(function($elem){ return $elem["day"];},$resultat3); // second test, erreur Fatal error: Uncaught TypeError: Cannot access offset of type string on string

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 511
    Par défaut
    Bonjour,

    Un var_dump($resultat3) retourne bien un tableau ou pas ?

  5. #5
    Membre averti
    Homme Profil pro
    Pub
    Inscrit en
    Octobre 2018
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Pub
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2018
    Messages : 35
    Par défaut
    Cela me donne
    array(4) { [0]=> string(1) "7" [1]=> string(1) "7" [2]=> string(1) "7" [3]=> string(1) "9" }
    (j'ai oublié de le noter dans la réponse, j'avais fait le var_dump suite à l'erreur)

    Maintenant, je ne suis pas sûr que ma requête soit correctement exprimée et utilisée pour obtenir ce genre d'information depuis ma table. Au besoin, je peux donner un exemple de ce qui y est enregistré

  6. #6
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 511
    Par défaut
    Ah oui, le tableau contient seulement les valeurs de $row3['number_of_users']; et c'est pour ça que les erreurs s'affichent, car il n'y a pas de colonne day.

    Il faudrait remplacer $resultat3[] = $row3['number_of_users']; par $resultat3[] = $row3;, comme ça tu récupère toutes les colonnes de la requête SQL puis après tu peux utiliser l'une des méthodes que je t'ai montré plus haut.

    Et attention, tu utilises deux alias avec le même nom "day" dans la requête SQL DATE(`date_entrainement`) AS 'day', DATE(`date_presence`) AS 'day',, modifies l'un d'eux pour éviter les conflits...

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

Discussions similaires

  1. Passage de value array depuis un select
    Par dominos dans le forum jQuery
    Réponses: 8
    Dernier message: 03/02/2022, 15h40
  2. Réponses: 2
    Dernier message: 26/06/2009, 12h55
  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
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

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