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 :

Afficher les 24 dernières heures depuis l'heure actuelle [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut Afficher les 24 dernières heures depuis l'heure actuelle
    Bonjour,

    je cherche à générer des résultats d'une table sur les 24 dernières heures, à partir de l'heure actuelle, voici la table en question :



    Chaque ligne ci-dessus correspond à un signalement.

    Ma requête SQL actuelle est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT date_format(`signalements`.`date_submit`,"%d/%m à %Hh00") as `date_submit`,count(`signalements`.`id`) as `id` FROM `signalements` WHERE date_submit > DATE_SUB(NOW(), INTERVAL 72 HOUR) GROUP BY hour(`signalements`.`date_submit`),date_format(`signalements`.`date_submit`,"%d/%m à %Hh00") ORDER BY date_submit ASC
    Ce qui sort avec un array php : (entre parenthèse le nombre de signalements, par exemple)

    05/09 à 10h00 (1)
    05/09 à 17h00 (2)
    05/09 à 18h00 (1)
    06/09 à 08h00 (4)
    06/09 à 09h00 (1)
    06/09 à 10h00 (1)

    Je voudrais arriver à ce résultat :



    Donc un résultat sous cette forme (on compte le nombre de signalements chaque heure entre parenthèses) :

    05/09 à 14h00 (1)
    05/09 à 15h00 (4)
    05/09 à 16h00 (1)
    05/09 à 17h00 (3)
    05/09 à 18h00 (1)
    05/09 à 19h00 (2)
    04/09 à 20h00 (3)
    05/09 à 21h00 (3)
    05/09 à 22h00 (1)
    05/09 à 23h00 (2)
    06/09 à 00h00 (1)
    06/09 à 01h00 (0)
    06/09 à 02h00 (2)
    06/09 à 03h00 (1)
    06/09 à 04h00 (4)
    06/09 à 05h00 (1)
    06/09 à 06h00 (1)
    06/09 à 07h00 (1)
    06/09 à 08h00 (1)
    06/09 à 09h00 (1)
    06/09 à 10h00 (0)
    06/09 à 11h00 (4)
    06/09 à 12h00 (0)
    06/09 à 13h00 (2)
    06/09 à 14h00 (1)

    Même si le comptage des signalements est à 0 (0), je veux quand même pouvoir afficher cette valeur avec l'heure correspondante comme ci-dessus.

    Merci d'avance pour votre aide,

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 431
    Points : 15 803
    Points
    15 803
    Par défaut
    j'ai essayé votre requête avec un petit jeu de test et j'ai récupéré les bonnes sommes.
    essayez de retirez le 1er bout "hour..." dans le "group by", ça ne devrait pas être nécessaire puisqu'il y a déjà "date_format" qui suffit.

  3. #3
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Merci pour votre réponse, j'ai retiré
    hour(`signalements`.`date_submit`),
    et cela affiche :

    04/09 à 06h00 (1)
    04/09 à 07h00 (4)
    04/09 à 08h00 (1)
    04/09 à 09h00 (3)
    04/09 à 13h00 (1)
    04/09 à 16h00 (2)
    04/09 à 17h00 (3)
    05/09 à 06h00 (3)
    05/09 à 07h00 (1)
    05/09 à 08h00 (2)
    05/09 à 09h00 (1)
    05/09 à 10h00 (1)
    05/09 à 17h00 (2)
    05/09 à 18h00 (1)
    06/09 à 08h00 (4)
    06/09 à 09h00 (1)
    06/09 à 10h00 (1)
    06/09 à 15h00 (1)

    Mais cela ne marche pas, il me faudrait les 24 dernières heures depuis l'heure actuelle :

    05/09 à 15h00 (0)
    05/09 à 16h00 (1)
    05/09 à 17h00 (3)
    05/09 à 18h00 (1)
    05/09 à 19h00 (2)
    04/09 à 20h00 (3)
    05/09 à 21h00 (3)
    05/09 à 22h00 (1)
    05/09 à 23h00 (2)
    06/09 à 00h00 (1)
    06/09 à 01h00 (0)
    06/09 à 02h00 (2)
    06/09 à 03h00 (1)
    06/09 à 04h00 (4)
    06/09 à 05h00 (1)
    06/09 à 06h00 (1)
    06/09 à 07h00 (1)
    06/09 à 08h00 (1)
    06/09 à 09h00 (1)
    06/09 à 10h00 (0)
    06/09 à 11h00 (4)
    06/09 à 12h00 (0)
    06/09 à 13h00 (2)
    06/09 à 14h00 (1)
    06/09 à 15h00 (3)
    06/09 à 15h00 (1)

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 431
    Points : 15 803
    Points
    15 803
    Par défaut
    pour les heures à 0 ce n'est pas un souci, je pense que c'est plus simple à faire en php.

    par contre les valeurs ont encore un problème, puisque vous avez par exemple 4 à 08 h 00 et vous dites que ça devrait être 1 ? ou alors c'est normal et ce sont juste des données de test ?

  5. #5
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    D'accord merci, je ne vois pas comment faire en php.

    Concernant les valeurs elles sont choisies au hasard, c'est juste pour illustrer l'exemple.

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 431
    Points : 15 803
    Points
    15 803
    Par défaut
    vous pouvez faire comme cela pour avoir un tableau avec les zéros :
    Code php : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    // tableau des données récupérées à partir de la requête mysql
    $donnees_mysql = [
    	"07/09 à 10 h 00" => 45,
    	"07/09 à 21 h 00" => 6,
    	"07/09 à 22 h 00" => 38,
    	"08/09 à 10 h 00" => 27,
    	"08/09 à 12 h 00" => 85,
    	"08/09 à 19 h 00" => 4,
    	"08/09 à 20 h 00" => 45,
    ];
     
     
     
    $maintenant = time();
    $il_y_a_24_heures = strtotime("-1 day", $maintenant);
     
    $parcours = $il_y_a_24_heures;
     
     
    $resultats = [];
     
    while ($parcours < $maintenant) {
     
    	$date_heure = date("d/m à H \h 00", $parcours);
     
    	$resultats[$date_heure] = 0;
     
    	// s'il y a une donnée pour cette heure
    	if (isset($donnees_mysql[$date_heure])) {
    		$resultats[$date_heure] = $donnees_mysql[$date_heure];
    	}
     
     
    	// prochaine heure
    	$parcours = strtotime("+1 hour", $parcours);
     
    }
     
     
    // ici $resultats contient toutes les heures avec des 0 quand il n'y a pas de données

  7. #7
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Effectivement avec un
    foreach ($resultats as $value) {
    echo $value, "\n";
    }
    j'arrive à avoir : 38 0 0 0 0 0 0 0 0 0 0 0 27 0 85 0 0 0 0 0 0 4 45 0 , je vais tester ça demain.

  8. #8
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Je dois avouer que je ne suis pas très à l'aise avec les tableaux, comment dois-je faire pour avoir cette architecture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $donnees_mysql = [
    	"07/09 à 10 h 00" => 45,
    	"07/09 à 21 h 00" => 6,
    	"07/09 à 22 h 00" => 38,
    	"08/09 à 10 h 00" => 27,
    	"08/09 à 12 h 00" => 85,
    	"08/09 à 19 h 00" => 4,
    	"08/09 à 20 h 00" => 45,
    ];
    à partir de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $query_s1 = mysqli_query($bdd, 'SELECT date_format(`signalements`.`date_submit`,"%d/%m à %Hh00") as `date_submit`,count(`signalements`.`id`) as `id` FROM `signalements` WHERE date_submit >NOW() - INTERVAL 72 HOUR GROUP BY hour(`signalements`.`date_submit`),date_format(`signalements`.`date_submit`,"%d/%m à %Hh00") ORDER BY date_submit ASC');
     
    echo '<strong>24 hours :</strong><br>';
     
    while($row = mysqli_fetch_array($query_s1)) 
    {
    Si vous pouvez détailler pour que j'assimile mieux le principe des tableaux,

    J'ai testé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $dataPoints = array();
     
    while($row = mysqli_fetch_assoc($query_s1)) 
    {
    $dataPoints[] = $row;
    }
     
    echo "".$dataPoints[0]["date_submit"]." => ".$dataPoints[0]["id"].",";
    Cela me sort :

    06/09 à 15h00 => 1,
    C'est juste la première valeur de la table, étrange

    Merci encore pour le temps dédié

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 451
    Points : 4 975
    Points
    4 975
    Par défaut
    Bonjour,
    Citation Envoyé par Saturos2k4 Voir le message
    C'est juste la première valeur de la table, étrange
    Pour parcourir un tableau, il faut utiliser une boucle :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach( $dataPoints as $key => $value ){
        echo $value["date_submit"]." => ".$value["id"]."\n";
    }

  10. #10
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Effectivement un foreach est plus adapté merci :-)

    Pour faire passer les données dans la fonction de mathieu c'est plus complexe non ?

    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
    foreach( $dataPoints as $key => $value ){
    $rr = "".$value["date_submit"]." => ".$value["nb_signalements"].",";
    }
     
    //---------------------------------------------------------------------
     
    // tableau des données récupérées à partir de la requête mysql
     
    $donnees_mysql = [
    	"07/09 à 10 h 00" => 45,
    	"07/09 à 21 h 00" => 6,
    	"07/09 à 22 h 00" => 38,
    	"08/09 à 10 h 00" => 27,
    	"08/09 à 12 h 00" => 85,
    	"08/09 à 19 h 00" => 4,
    	"08/09 à 20 h 00" => 45,
    	"09/09 à 09 h 00" => 1,
    ];
    Il faudrait incorporer $donnees_mysql dans la boucle comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $donnees_mysql = [
    	"".$rr.""
    ];
    Cependant il faudrait rester dans la boucle foreach...

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 451
    Points : 4 975
    Points
    4 975
    Par défaut
    Bonjour,

    Si vous parlez de la réponse 6 de Mathieu, il faudrait donc adapter les données du tableau afin qu'il ait la même structure de $donnees_mysql.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //déclarer un tableau vide
    $donnees_mysql=[];
    foreach( $dataPoints as $key => $value ){
        $donnees_mysql[$value['date_submit']]=$value["id"];
    }
    le nom de la variable $donnees_mysql doit être modifié, car c'est une variable qui représente les signalements...

  12. #12
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Cela donne :





    C'est toujours pas ça... 675 correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $rr[$value["date_submit"]." => ".$value["nb_signalements"].",\n"];
    L'idée c'est de pusher le code de mathieu vers canvajs (exemple provenant de https://canvasjs.com/php-charts/char...from-database/ ) :

    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
    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
        <?php
     
        $dataPoints = array();
        //Best practice is to create a separate file for handling connection to database
        try{
             // Creating a new connection.
            // Replace your-hostname, your-db, your-username, your-password according to your database
            $link = new \PDO(   'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4', //'mysql:host=localhost;dbname=canvasjs_db;charset=utf8mb4',
                                'your-username', //'root',
                                'your-password', //'',
                                array(
                                    \PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                                    \PDO::ATTR_PERSISTENT => false
                                )
                            );
     
            $handle = $link->prepare('select x, y from datapoints'); 
            $handle->execute(); 
            $result = $handle->fetchAll(\PDO::FETCH_OBJ);
     
            foreach($result as $row){
                array_push($dataPoints, array("x"=> $row->x, "y"=> $row->y));
            }
        	$link = null;
        }
        catch(\PDOException $ex){
            print($ex->getMessage());
        }
     
        ?>
        <!DOCTYPE HTML>
        <html>
        <head>  
        <script>
        window.onload = function () {
     
        var chart = new CanvasJS.Chart("chartContainer", {
        	animationEnabled: true,
        	exportEnabled: true,
        	theme: "light1", // "light1", "light2", "dark1", "dark2"
        	title:{
        		text: "PHP Column Chart from Database"
        	},
        	data: [{
        		type: "column", //change type to bar, line, area, pie, etc  
        		dataPoints: <?php echo json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>
        	}]
        });
        chart.render();
     
        }
        </script>
        </head>
        <body>
        <div id="chartContainer" style="height: 370px; width: 100%;"></div>
        <script src="https://cdn.canvasjs.com/canvasjs.min.js"></script>
        </body>
        </html>
    Donc au niveau de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data: [{
        		type: "column", //change type to bar, line, area, pie, etc  
        		dataPoints: <?php echo json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>
        	}]

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 451
    Points : 4 975
    Points
    4 975
    Par défaut
    Bonjour,

    Voilà un exemple fonctionnel (testé avant de le poster) que j'ai adapté pour utiliser le script de mathieu...
    Code php : 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
    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    <?php 
    $dataPoints = array();
    //Best practice is to create a separate file for handling connection to database
    try{
    	// Creating a new connection.
        // Replace your-hostname, your-db, your-username, your-password according to your database
     
    	$host="localhost";$dbName="mettez le nom de la base de donnée mysql...";
    	$user="mettez votre nom d'utilisateur...";
    	$password="mettez votre mot de passe...";
        $link = new \PDO(   "mysql:host=$host;dbname=$dbName;charset=utf8mb4",
    		$user,
    		$password,
    		array(
    			\PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    			\PDO::ATTR_PERSISTENT => false
    		)
    	);
     
        $handle = $link->prepare('SELECT date_format(date_submit,"%Y-%m-%d %H:00") as `date_submit`,
    	count(`signalements`.`id`) as `id` FROM `signalements` WHERE date_submit > DATE_SUB(NOW(), INTERVAL 72 HOUR) GROUP BY hour(`signalements`.`date_submit`),date_format(`signalements`.`date_submit`,"%d/%m à %Hh00") ORDER BY date_submit ASC'); 
        $handle->execute(); 
        $result = $handle->fetchAll(\PDO::FETCH_OBJ);
     
        foreach($result as $row){
            array_push($dataPoints, array("x"=> strtotime($row->date_submit)*1000, "y"=> $row->id));
        }
     
    	$link = null;
    }
    catch(\PDOException $ex){
        print($ex->getMessage());
    }
    //script de mathieu 
    $maintenant = time();
    $il_y_a_24_heures = strtotime("-1 day", $maintenant);
    $parcours = $il_y_a_24_heures;
    while ($parcours < $maintenant) {
    	$date_heure = date("Y-m-d H:00:00", $parcours);
    	$dateExist=array_filter($dataPoints,function($d)use($date_heure){
    		return date("Y-m-d H:00:00",$d['x'])==$date_heure;
    	});
    	// s'il y a une donnée pour cette heure
    	if (empty($dateExist)) $dataPoints[]=["x"=>strtotime($date_heure)*1000,"y"=>0];
    	// prochaine heure
    	$parcours = strtotime("+1 hour", $parcours);
    }
    //fin script
    usort($dataPoints,function($a,$b){return $a["x"]>$b["x"]?1:-1;});	
    ?>
    <!DOCTYPE HTML>
    <html>
    <head>  
    <script>
    window.onload = function () {
     
    var chart = new CanvasJS.Chart("chartContainer", {
    	animationEnabled: true,
    	exportEnabled: true,
    	theme: "light1", // "light1", "light2", "dark1", "dark2"
    	title:{
    		text: "PHP splineArea Chart from Database"
    	},
    	axisX: {
    		interval:3,intervalType: "hour",
    		labelFormatter: function (e) {
    			return new Date(e.value).getUTCHours();
    		},
    		suffix:"H",
    		viewportMinimum: <?=strtotime("-1 hours",$dataPoints[0]["x"]);?>
    	},
    	axisY:{
    		interval:1
    	},
    	toolTip:{
    		contentFormatter: function ( e ) {
    			let date=new Date(e.entries[0].dataPoint.x),nbrSignalements=e.entries[0].dataPoint.y,
    			annee=date.getFullYear(),mois=(date.getMonth()+1),jour=date.getDate(),heure=date.getUTCHours();
    			jour=jour<10?"0"+jour:jour;
    			mois=mois<10?"0"+mois:mois;
    			return annee+"-"+mois+"-"+jour+" à "+heure+"H"+" : "+nbrSignalements;  
    		}  
    	},
    	data: [{
    		type: "splineArea", //change type to bar, line, area, pie, etc ,
    		xValueType:"dateTime",
    		//connectNullData: true,ceci fonctionne seulement si le y==null
    		dataPoints: <?=json_encode($dataPoints, JSON_NUMERIC_CHECK); ?>
    	}]
    });
    chart.render();
     
    }
    </script>
    </head>
    <body>
    <div id="chartContainer" style="height: 370px; width: 100%;"></div>
    <script src="https://cdn.canvasjs.com/canvasjs.min.js"></script>
    </body>
    </html>
    Si vous ne comprenez pas quelque chose, n'hésitez pas à le demander.

  14. #14
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Merci encore Toufik pour le code :-) Est-il possible d'avoir la version mysql que je puisse comprendre ? Je n'ai pas encore appris le PDO

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 451
    Points : 4 975
    Points
    4 975
    Par défaut
    Bonjour,

    PDO est plus clair, optimisé et facile à utiliser que Mysqli, surtout lorsqu'on veut manipuler des données avec des accents ou d'autres caractères spéciaux..., mais bon voici la partie PHP avec mysqli, aucun changement dans les parties JS et HTML
    Code php : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php
    $dataPoints = array();
    // Replace your-hostname, your-db, your-username, your-password according to your database
    $host="localhost";$dbName="mettez le nom de la base de donnée mysql...";
    $user="mettez votre nom d'utilisateur...";
    $password="";//"mettez votre mot de passe..."
    //Best practice is to create a separate file for handling connection to database
    try{
    	// Creating a new connection.
            $link =new mysqli($host, $user, $password, $dbName);
            if($link->connect_error) die("Erreur de connexion :".$link->connect_error);
            $handle=$link->query('SELECT date_format(date_submit,"%Y-%m-%d %H:00") as `date_submit`,
              count(`signalements`.`id`) as `id` FROM `signalements` WHERE date_submit > DATE_SUB(NOW(), INTERVAL 72 HOUR) GROUP BY 
              hour(`signalements`.`date_submit`),date_format(`signalements`.`date_submit`,"%d/%m à %Hh00") ORDER BY date_submit ASC'
            );
    	while($row=$handle->fetch_object())
    		$dataPoints[]=["x"=> strtotime($row->date_submit)*1000, "y"=> $row->id];
    	$handle->free_result();	
    	//script de mathieu 
    	$maintenant = time();
    	$il_y_a_24_heures = strtotime("-1 day", $maintenant);
    	$parcours = $il_y_a_24_heures;
    	while ($parcours < $maintenant) {
    		$date_heure = date("Y-m-d H:00:00", $parcours);
                    // Vérifier si la date existe déjà/ou pas, dans le résultat de la requête
    		$dateExist=array_filter($dataPoints,function($d)use($date_heure){
    			return date("Y-m-d H:00:00",$d['x'])==$date_heure;
    		});
    		// s'il N Y A PAS une donnée pour cette heure, on la rajoute
    		if (empty($dateExist)) $dataPoints[]=["x"=>strtotime($date_heure)*1000,"y"=>0];
    		// prochaine heure
    		$parcours = strtotime("+1 hour", $parcours);
    	}
    	//fin script
            //Trier le tableau en ASC (date inférieure vers date supérieure)
    	usort($dataPoints,function($a,$b){return $a["x"]>$b["x"]?1:-1;});
    	$link->close();
    }
    catch(\Exception $e){
        die("Erreur :".$e->getMessage());
    }

  16. #16
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Merci toufik je comprend mieux l'adaptation :-)

    On y est presque, cela donne :



    On a des valeurs à 0 signalements qui forment un gros pic vers le bas, et un espace blanc entre chaque remontée :



    voici les données mysql :


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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 451
    Points : 4 975
    Points
    4 975
    Par défaut
    Bonjour,
    Citation Envoyé par Saturos2k4 Voir le message
    On a des valeurs à 0 signalements qui forment un gros pic vers le bas, et un espace blanc entre chaque remontée
    Le pic signifie que les dateTime existent deux fois dans le tableau de résultat, une fois avec la valeur 0 et la deuxième avec la valeur correcte, ce qui n'est pas bon, parce que l'instruction PHP if (empty($dateExist)) $dataPoints[]=["x"=>strtotime($date_heure)*1000,"y"=>0]; vérifie chaque heure et ne rajoute que celles n'existant pas dans $dataPoints.

    Si tu fais un var_dump($dataPoints);, ou parcourir le tableau avec une boucle, tu verras qu'il y'a des valeurs de X en double...

    Tu utilises les mêmes options JS de mon exemple?

  18. #18
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Oui j'ai repris le même code sans rien changer.

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 451
    Points : 4 975
    Points
    4 975
    Par défaut
    Bonjour,

    Je ne sais plus quoi rajouter, car cet exemple est fonctionnel sur mon PC sans aucun problème, peut être un espace en trop dans les dates ?

    En plus je vois un décalage horaire entre les dates enregistrées dans la table mysql et les données du graphique, par exemple la date 15-09-2024 22:16:55 alors que le graphique l'affiche à 20H.

    L'option labelFormatter au niveau JS
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    axisX: {
       labelFormatter: function (e) {
            //getUTCHours retourne l'heure GMT et getHours retourn l'heure locale.
    	return new Date(e.value).getUTCHours();
      }
    }
    retourne la date avec l'heure GMT, mais je pense que ceci n'a aucune relation avec le problème des pic...

  20. #20
    Membre à l'essai Avatar de Saturos2k4
    Homme Profil pro
    Analyse système
    Inscrit en
    Juillet 2015
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Juillet 2015
    Messages : 37
    Points : 10
    Points
    10
    Par défaut
    Bonjour Toufik, effectivement j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_default_timezone_set('Europe/Paris');
    En haut de page, et après suppression on a :



    Cela est plus correct si on compare avec les données bdd :


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2013] Code prend 1 heure pour afficher les resultats
    Par Mateos_hiss dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 17/06/2016, 11h50
  2. [MySQL] Afficher les tickets superieurs à 4 heures
    Par maxdata dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 30/05/2013, 12h38
  3. php afficher les heures avec minutes qui reste..
    Par xunil2003 dans le forum Langage
    Réponses: 1
    Dernier message: 21/07/2012, 22h51
  4. Afficher les milièmes dans un champs Date Heure
    Par zooffy dans le forum ASP.NET
    Réponses: 8
    Dernier message: 27/07/2007, 15h51

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