Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mise à jour requête suite à action utilisateur

Comment modifier & mettre à jour une requête suite à une action bouton

Sujet résolu
    23 juin 2022 à 10:15:56

    Oui mon message est un peu confus en fait comme il faut attendre 24 heures entre 2 post si pas de réponse entre temps, j'ai complété le post d'origine avec mes pistes...:(

    Pour la requête select count en fait je n'arrive pas à la faire.. enfin elle ne me retourne pas la bonne valeur!

    Je cherchais à compter le nombre total de retour possible de cette requête :

    $requete = 'SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
    			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
    	    SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                        	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches WHERE horodatage 
    			BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
    			AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )
                   	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
    			WHERE M.horodatage
    			BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
    			AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )
    			GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
    			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC, M.id_ruche';
    			

    ceci me donnerait le nombre de ligne de la page.

    Et je voudrais faire le même genre de requête select count sur cette requête mais sur toute la table pour connaitre le nombre de sortie possible.

    Du coup je pourrais aussi connaitre le nombre de page possible à l'affichage en faisant par exemple nbdepage restant à afficher=un nb de ligne totale de la table - nb de ligne déjà affichée.(fonction du nombre de page que l'on a déjà défilé..)

    Pour la question du nombre de ligne qui peut différer d'une page à l'autre ce n'est pas pour compléter mais pour savoir quand faire disparaitre le bouton suivant..(pour ne pas permettre d'aller plus loin qu'il n'y a de données dans la table)

    J'espère avoir été plus clair.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2022 à 13:51:00

      Un exemple de code simplifié, en partant du principe de 4 variables $_GET : ruche, page, taille et unité.

      $ruche	= !empty( $_GET['ruche'] )	? $_GET['ruche']	: 1;
      $page	= !empty( $_GET['page'] )	? $_GET['page']		: 0;
      $taille	= !empty( $_GET['taille'] )	? $_GET['taille']	: 1;
      $unite	= !empty( $_GET['unite'] )	? $_GET['unite']	: 'HOUR';
      
      // Récupération des données de la page demandées
      $requete = $bdd->prepare( '
          SELECT *, DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee
          FROM Telemesures_ruches
          WHERE
              id_ruche = ?
              AND horodatage
                  BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($taille).' * ( '.intval($page).' + 1 ) '.$unite.' )
                  AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($taille).' * '.intval($page).' '.$unite.' );'
      );
      $requete->execute( [ $ruche ] );
      $donnees = $requete->fetchAll();
      
      // Récupération du nombre de la page précédente
      $nbPrecedent = 0;
      if( $page >= 1 ) {
      	$requete = $bdd->prepare( '
      	    SELECT COUNT(*) as nombre
      	    FROM Telemesures_ruches
      	    WHERE
      	        id_ruche = ?
      	        AND horodatage
      	            BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($taille).' * ( '.intval($page-1).' + 1 ) '.$unite.' )
      	            AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($taille).' * '.intval($page-1).' '.$unite.' );'
      	);
      	$requete->execute( [ $ruche ] );
      	$nbPrecedent = $requete->fetchColumn();
      }
      
      // Récupération du nombre de la page suivante
      $nbSuivant = 0;
      $requete = $bdd->prepare( '
          SELECT COUNT(*) as nombre
          FROM Telemesures_ruches
          WHERE
              id_ruche = ?
              AND horodatage
                  BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($taille).' * ( '.intval($page+1).' + 1 ) '.$unite.' )
                  AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($taille).' * '.intval($page+1).' '.$unite.' );'
      );
      $requete->execute( [ $ruche ] );
      $nbSuivant = $requete->fetchColumn();
      
      var_dump( $donnees );
      
      if( $nbPrecedent ) {
      	echo '<a href="index.php?ruche='.$ruche.'&page='.($page - 1).'&taille='.$taille.'&unite='.$unite.'">Page précédente</a>';
      }
      
      if( $nbSuivant ) {
      	echo '<a href="index.php?ruche='.$ruche.'&page='.($page + 1).'&taille='.$taille.'&unite='.$unite.'">Page précédente</a>';
      }
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        23 juin 2022 à 15:39:36

        Alors heureusement que tu as dit code simplifié! Il va me falloir un peu de temps pour bien essayer de tout comprendre!

        J'ai regardé un peu et j'ai déjà des questions!

        Pourquoi stock tu en GET les variables  $taille et $unités qui sont actuellement dans le code (sous les nom de  $limite et $ type_intervalle)?

        Puisqu'elles restent constantes dans chaque page.

        Bien qu'actuellement je stocke déjà le numéro de ruche et la page...

        Pour cette requête actuellement j'ai fais ceci :

        // ici on calcule le nombre total d'entrée dans la table!
        $resultFoundRows = $bdd->query("SELECT count(DISTINCT id_mesure) FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche");
        
        /* On doit extraire le nombre du jeu de résultat */
        $nombredElementsTotal = $resultFoundRows->fetchColumn();
        //echo "Nombre total d'élément :".$nombredElementsTotal;
        
        
        // numéro de page actuelle et si vide attribue la page 1
        $page = (isset($_GET['page']) ? $_GET['page'] : 1);
        
        $page = intval($_GET['page']); // Conversion forcée en entier
        // Si le nombre est invalide, on demande la première page par défaut
        if($page <= 0) {
            $page = 1;
        }
        
        /* On calcule le numéro du premier élément à récupérer */
        $debut = ($page - 1) ;
        
        //ancienne requete
        //$reponse = $bdd->query("SELECT * , DATE_FORMAT(horodatage, '%d/%m/%Y %Hh%i:%s') AS date_formatee FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche AND horodatage >= NOW() - INTERVAL 2 WEEK ORDER BY horodatage DESC");
        
        
        // Partie "Requête"
        
        
        // nombre de X type_intervalle à afficher
        $limite = 15;
        
        // type d'intervalle, seconds, minute, day, week, month
        $type_intervalle = 'DAY';
        
        // requête pour obtenir les données
        $reponse= 'SELECT * , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee FROM Telemesures_ruches WHERE (id_ruche) =' .$NumRuche.' 
        	   AND horodatage BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
        	   AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )ORDER BY horodatage DESC';
        
        
        
        // ici requête pour calculer le nombre total de ligne dans la page!
        $nbreponse = 'SELECT COUNT(id_mesure) , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee FROM Telemesures_ruches WHERE (id_ruche) =' .$NumRuche.' 
        	   AND horodatage BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
        	   AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )ORDER BY horodatage DESC';
        
        
        
        //var_dump( $nbreponse );	//permet l'affichage texte de la requête
        //var_dump( $reponse );	//permet l'affichage texte de la requête
        
        /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
        $reponse = $bdd->prepare($reponse);
        
        /* On lie ici une valeur à la requête, soit remplacer de manière sûre un marqueur par
         * sa valeur, nécessaire pour que la requête fonctionne. */
        
        $reponse->bindValue(
            'limite',         // Le marqueur est nommé « limite »
             $limite,         // Il doit prendre la valeur de la variable $limite
             PDO::PARAM_INT   // Cette valeur est de type entier
        );
        /* … auquel il faut aussi lier la valeur, comme pour la limite */
        $reponse->bindValue('debut', $debut, PDO::PARAM_INT);
        
        /* Maintenant qu'on a lié la valeur à la requête, on peut l'exécuter */
        $reponse->execute();
        
        //echo "page n°". $page ."et sur =".$sur;
        
        
        // on memorise le nombre de page juste à la première page
        if ($page == 1){
        // calcul du nombre de ligne de retour de la requete
        
        $nbreponse = $bdd->prepare($nbreponse);
        
        /* On lie ici une valeur à la requête, soit remplacer de manière sûre un marqueur par sa valeur, nécessaire pour que la requête fonctionne. */
        
        $nbreponse->bindValue(
            'limite',         // Le marqueur est nommé « limite »
             $limite,         // Il doit prendre la valeur de la variable $limite
             PDO::PARAM_INT   // Cette valeur est de type entier
        );
        
        /* … auquel il faut aussi lier la valeur, comme pour la limite */
        $nbreponse->bindValue('debut', $debut, PDO::PARAM_INT);
        
        /* Maintenant qu'on a lié les valeurs à la requête, on peut l'exécuter */
        $nbreponse->execute();
        $nbEntree = $nbreponse->fetchColumn();	// on compte le nombre de ligne
        //echo "Nombre d'entrée dans la page : ".$nbEntree;
        
        
        // calcul du nombre total de pages possible en fonction de limite
        $sur = ceil($nombredElementsTotal / $nbEntree);//ceil= arrondi au supérieur entier
        //echo  "Nombre de page possible :".$sur ;
        
        		}	// fin du if
        
        
        // affichage tableau listing données complète de la ruche
        ?>   <table>
        <thead>
        
        <?php
        
        echo '<tr><th>Heure</th><th>Hygrométrie</th><th>Température exterieure</th><th>Température interieure</th><th>Masse</th><th>Luminosité</th><th>Pluie (1 si pluie)</th></tr>';
        
        ?>
        
        </thead>
        <tbody>
        	
        	<?php
        // Partie "Boucle" d'affichage des données
        
        while ($donnees  = $reponse->fetch()) { 
            // C'est là qu'on affiche les données  
        if ($donnees['lum']<>'-1' AND $donnees['eau']<>'-1'){	// cas ou on a tous les capteurs
        						    echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
        							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.$donnees['lum'].'%</td><td>'.$donnees['eau'].'</td></tr>';
        						    }
        
        
        if ($donnees['lum']=='-1' AND $donnees['eau']=='-1'){	// cas ou on a pas de capteur de luminosité ni de pluie
        			  			    echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
        							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.'-</td><td>'.'-</td></tr>';	
        						    }
        
        
        if ($donnees['eau']=='-1'AND $donnees['lum']<>'-1' ){		// cas ou on a pas le capteur de pluie mais on a le capteur de luminosité
        			  			   echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
        							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.$donnees['lum'].'%</td><td>'.'-</td></tr>';
        			  			   }
        
        
        if ($donnees['lum']=='-1'AND $donnees['eau']<>'-1'){		//cas ou on a pas le capteur de luminosité mais on a le capteur de pluie
        			  			   echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
        							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.'-</td><td>'.$donnees['eau'].'</td></tr>';
         
         			  			   }    
            
        					}
        					
        					
        				
        					
        ?>
        					
        						
        
        
        
        </tbody>
        <tfoot>
        <?php
        echo '<tr><td></td></tr>';
        	
        ?>
        
        </tfoot>
        </table>
        
        <?php
        
        // Partie "Liens"
        
        /* Si on est sur la première page, on n'a pas besoin d'afficher de lien
          vers la précédente. On va donc ne l'afficher que si on est sur une autre page que la première */
        if ($page > 1):
            ?>
            <a href="?ruche=<?php echo $NumRuche?>&p=donnees&page=<?php echo $page - 1; ?>&sur=<?php echo $sur ?>"><img src="images/fleche_gauche_rouge.png"/></a>
             <?php
        endif;
        
        
        
        /* Avec le nombre total de pages, on peut aussi masquer le lien vers la page suivante quand on est sur la dernière */
        if ($page < $sur):
            ?>
            
            <div style="float: right ">
            <a href="?ruche=<?php echo $NumRuche?>&p=donnees&page=<?php echo $page + 1; ?>&sur=<?php echo $sur ?>"><img src="images/fleche_droite_rouge.png"/></a>
            </div>
            <?php
        	endif;
              ?>
        
        
        <?php
        
        
        $reponse->closeCursor();
        $bdd=Null;
        
        ?>

        Cela semble fonctionner... Tu peux aller voir sur mon site c'est déjà en place...

        Mais je voulais faire quelque chose d'identique pour la page d'accueil, mais je n'arrive pas à calculer le nombre de ligne que retourne chaque page, ni le nombre total de ligne que peut sortir la requête sur la totalité de la base.

        Tout ce que j'essaye ou bien ne tourne pas ou renvoie de mauvaises informations.

        Il s'agit de cette requête que tu m'as fais qui est de très loin au dessus de mon niveau (calcul des moyennes sur un point une heure)

        $requete = 'SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
        			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
        	    SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                            	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches WHERE horodatage 
        			BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
        			AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )
                       	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
        			WHERE M.horodatage
        			BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
        			AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )
        			GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
        			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC, M.id_ruche';



        Comment calculer un select count dessus?

        Merci

        -
        Edité par GillesMangin-Voirin 23 juin 2022 à 15:41:28

        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2022 à 16:16:55

          @Benzouye est surement plus apte a te repondre la.

          Pour moi dans le pire des cas tu peux toujours faire un count($resultat_de_la_requete) pour avoir ce que tu veux, mais c'est peut-etre plus couteux.

          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2022 à 18:21:16

            Remarques préliminaires sur ton code : on est bien d'accord que tes bindValue (ligne 57, 63, 79, 86) ne servent strictement à rien ... il n'y a dans ta requête SQL aucun marqueur à "binder" ... Je suis même étonné que tu n'ais pas d'erreur ...

            GillesMangin-Voirin a écrit:

            Pourquoi stock tu en GET les variables  $taille et $unités qui sont actuellement dans le code (sous les nom de  $limite et $ type_intervalle)

            Cela te permet plus de souplesse dans ton affichage pour modifier l'intervalle et l'unité de temps, tu peux du coup fonctionner avec un formulaire par exemple pour modifier ces paramètres ... Mais c'est en effet facultatif ;)

            GillesMangin-Voirin a écrit:

            // calcul du nombre total de pages possible en fonction de limite
            $sur = ceil($nombredElementsTotal / $nbEntree);//ceil= arrondi au supérieur entier

            Comme je le disais plus tôt, cela ne peut pas fonctionner ainsi !

            Ta requête fait la liste des mesures pour un intervalle de temps données, par exemple 2 heures ($limite = 2 et $type = HOUR). Sur deux heures, pour une ruche donnée, tu peux avoir 24 mesures, ou 26, ou 22, ou aucune si la transmission n'a pas fonctionné ... Les deux heures suivantes (page 2) tu pourras avoir les mêmes différences, etc. Du coup, $sur a une valeur très (très très) approximative ...

            Cela soulève d'ailleurs un gros problème que je n'avais pas identifié sur le coup ... Si pour un intervalle donné tu n'as pas de valeur, alors la page précédent cet intervalle n'affichera pas le bouton "Suivant", même si il existe des valeurs dans l'intervalle "suivant-suivant" ... Ouch ! il faudrait réfléchir à cela ...

            Mais tant que tu bornes ton intervalle non pas au nombre de lignes mais à une durée, je ne vois pas comment faire ... justement pour les raisons évoquées ci-dessus ...

            GillesMangin-Voirin a écrit:

            Comment calculer un select count dessus?

            @Asmitta a proposé une solution simple avec le count() de PHP :

            $requete = $bdd->prepare( ... );
            $requete->execute( ... );
            $donnees = $requete->fetchAll();
            $nb_donnees = count( $donnees );

            Cela a le mérite d'éviter de faire deux requêtes pour rien ...

            -
            Edité par Benzouye 23 juin 2022 à 18:22:01

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              23 juin 2022 à 21:29:21

              Bonjour, alors je vais essayer de répondre à toutes tes remarques dans l'ordre:

              Benzouye a écrit:

              Remarques préliminaires sur ton code : on est bien d'accord que tes bindValue (ligne 57, 63, 79, 86) ne servent strictement à rien ... il n'y a dans ta requête SQL aucun marqueur à "binder" ... Je suis même étonné que tu n'ais pas d'erreur ...

              Comme tu t'en doutes je n'ai pas inventé cela! je l'ai trouvé dans le post que ma conseillé : Monkey3D :

              https://zestedesavoir.com/tutoriels/351/paginer-avec-php-et-sql/

              Je viens de les commenter et effectivement cela fonctionne toujours...

              Ok pour les GET de souplesse.

              GillesMangin-Voirin a écrit:

              // calcul du nombre total de pages possible en fonction de limite
              $sur = ceil($nombredElementsTotal / $nbEntree);//ceil= arrondi au supérieur entier

              Comme je le disais plus tôt, cela ne peut pas fonctionner ainsi !

              Ta requête fait la liste des mesures pour un intervalle de temps données, par exemple 2 heures ($limite = 2 et $type = HOUR). Sur deux heures, pour une ruche donnée, tu peux avoir 24 mesures, ou 26, ou 22, ou aucune si la transmission n'a pas fonctionné ... Les deux heures suivantes (page 2) tu pourras avoir les mêmes différences, etc. Du coup, $sur a une valeur très (très très) approximative ...

              Oui je m'en suis aperçu!

              j'ai donc commencer à modifier comme ceci (mais je ne suis pas sur que cela fonctionne bien si on revient en arrière) :

              // numéro de page actuelle et si vide attribue la page 1
              $page = (isset($_GET['page']) ? $_GET['page'] : 1);
              
              // Nombre total de ligne actuelle et si vide attribue 0
              $nombredElementsTotal = (isset($_GET['total']) ? $_GET['total'] : 0);
              
              // Nombre total de ligne avant et si vide attribue 0
              $nbligneavant = (isset($_GET['NbligneAvant']) ? $_GET['NbligneAvant'] : 0);
              
              $page = intval($_GET['page']); // Conversion forcée en entier
              // Si le nombre est invalide, on demande la première page par défaut
              
              
              if($page <= 0) {
                  $page = 1;
              		}
              
              
              // ici on calcule le nombre total d'entrée dans la table!
              if ($page == 1){
              //	$sur =1;
              $resultFoundRows = $bdd->query("SELECT count(DISTINCT id_mesure) FROM Telemesures_ruches WHERE (id_ruche) = $NumRuche");
              
              /* On doit extraire le nombre du jeu de résultat */
              $nombredElementsTotal = $resultFoundRows->fetchColumn();
              echo "Nombre total d'élément :".$nombredElementsTotal;
              
              }
              
              
              
              /* On calcule le numéro du premier élément à récupérer */
              $debut = ($page - 1) ;
              
              
              
              // Partie "Requête"
              
              
              // nombre de X type_intervalle à afficher
              $limite = 15;
              
              // type d'intervalle, seconds, minute, day, week, month
              $type_intervalle = 'DAY';
              
              // requête pour obtenir les données
              $reponse= 'SELECT * , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee FROM Telemesures_ruches WHERE (id_ruche) =' .$NumRuche.' 
              	   AND horodatage BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
              	   AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )ORDER BY horodatage DESC';
              
              
              
              // ici requête pour calculer le nombre total de ligne dans la page!
              
              $nbreponse = 'SELECT COUNT(id_mesure) , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee FROM Telemesures_ruches WHERE (id_ruche) =' .$NumRuche.' 
              	   AND horodatage BETWEEN DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * ( '.intval($debut).' + 1 ) '.$type_intervalle.' )
              	   AND DATE_ADD( CURRENT_TIMESTAMP, INTERVAL - '.intval($limite).' * '.intval($debut).' '.$type_intervalle.' )ORDER BY horodatage DESC';
              
              
              
              //var_dump( $nbreponse );	//permet l'affichage texte de la requête
              //var_dump( $reponse );	//permet l'affichage texte de la requête
              
              /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
              $reponse = $bdd->prepare($reponse);
              
              
              /* Maintenant qu'on a lié la valeur à la requête, on peut l'exécuter */
              $reponse->execute();
              
              
              
              // calcul du nombre de ligne de retour de la requete
              
              $nbreponse = $bdd->prepare($nbreponse);
              
              
              
              /* Maintenant qu'on a lié les valeurs à la requête, on peut l'exécuter */
              $nbreponse->execute();
              $nbEntree = $nbreponse->fetchColumn();	// on compte le nombre de ligne
              echo "Nombre d'entrée dans la page : ".$nbEntree;
              echo "sur avant calcul:".$sur;
              
              
              
              if ($sur == 1){
              $surTemp= $nombredElementsTotal;	
              
              }
              else{ 
              	$surTemp=$sur;
              }
              
              
              echo  "Nombre de ligne restante :".$sur ;
              
              	
              	
              	
              	<?php
              // Partie "Boucle" d'affichage des données
              
              while ($donnees  = $reponse->fetch()) { 
                  // C'est là qu'on affiche les données  
              if ($donnees['lum']<>'-1' AND $donnees['eau']<>'-1'){	// cas ou on a tous les capteurs
              						    echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
              							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.$donnees['lum'].'%</td><td>'.$donnees['eau'].'</td></tr>';
              						    }
              
              
              if ($donnees['lum']=='-1' AND $donnees['eau']=='-1'){	// cas ou on a pas de capteur de luminosité ni de pluie
              			  			    echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
              							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.'-</td><td>'.'-</td></tr>';	
              						    }
              
              
              if ($donnees['eau']=='-1'AND $donnees['lum']<>'-1' ){		// cas ou on a pas le capteur de pluie mais on a le capteur de luminosité
              			  			   echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
              							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.$donnees['lum'].'%</td><td>'.'-</td></tr>';
              			  			   }
              
              
              if ($donnees['lum']=='-1'AND $donnees['eau']<>'-1'){		//cas ou on a pas le capteur de luminosité mais on a le capteur de pluie
              			  			   echo '<tr><td>'.$donnees['date_formatee'].'</td><td>'.$donnees['hyg'].'%</td><td>'.$donnees['tex'].'°C</td><td>'.
              							$donnees['tin'].'°C</td><td>'.$donnees['mas'].'Kg</td><td>'.'-</td><td>'.$donnees['eau'].'</td></tr>';
               
               			  			   }    
                  
              					}
              					
              					
              				
              					
              ?>
              					
              						
              
              
              
              </tbody>
              <tfoot>
              <?php
              echo '<tr><td></td></tr>';
              	
              ?>
              
              </tfoot>
              </table>
              
              <?php
              
              // Partie "Liens"
              
              /* Si on est sur la première page, on n'a pas besoin d'afficher de lien
                vers la précédente. On va donc ne l'afficher que si on est sur une autre page que la première */
                if ($page == 0) $nbEntree=0;
                
              if ($page > 1):
                  ?>
                  <a href="?ruche=<?php echo $NumRuche?>&p=donneestest&page=<?php echo $page - 1; ?>&sur=<?php $sur= $surTemp + $nbligneavant  ; echo $sur ?>&total=<?php echo $nombredElementsTotal ?>&NbligneAvant=<?php echo $nbEntree ?>"><img src="images/fleche_gauche_rouge.png"/></a>
                   <?php
              endif;
              
              
              
              /* Avec le nombre total de lignes on peut aussi masquer le lien vers la page suivante quand on est sur la dernière */
              //if ($page < $sur):
              
              if ($surTemp - $nbEntree >0 ):
                  ?>
                  
                  <div style="float: right ">
                  <a href="?ruche=<?php echo $NumRuche?>&p=donneestest&page=<?php echo $page + 1; ?>&sur=<?php $sur= $surTemp - $nbEntree  ; echo $sur ?>&total=<?php echo $nombredElementsTotal ?>&NbligneAvant=<?php echo $nbEntree ?>"><img src="images/fleche_droite_rouge.png"/></a>
                  </div>
                  <?php
              	endif;
                    ?>
              
              
              <?php
              
              
              $reponse->closeCursor();
              $bdd=Null;
              
              ?>

              Cela soulève d'ailleurs un gros problème que je n'avais pas identifié sur le coup ... Si pour un intervalle donné tu n'as pas de valeur, alors la page précédent cet intervalle n'affichera pas le bouton "Suivant", même si il existe des valeurs dans l'intervalle "suivant-suivant" ... Ouch ! il faudrait réfléchir à cela ...

              Mais tant que tu bornes ton intervalle non pas au nombre de lignes mais à une durée, je ne vois pas comment faire ... justement pour les raisons évoquées ci-dessus ...

              Du coup, si j'ai bien compris cela simplifierai la  de borner sur un nombre de valeur plutôt que sur du temps!

              Pourquoi pas après tout si c'est trop compliqué autrement.

              Pour la remarque de count en PHP faites par Asmitta si je passe en nombre de ligne je n'en aurait plus forcement besoin on est d'accord?

              Merci

              • Partager sur Facebook
              • Partager sur Twitter
                24 juin 2022 à 6:56:58

                >Pour la remarque de count en PHP faites par Asmitta si je passe en nombre de ligne je n'en aurait plus forcement besoin on est d'accord?

                Pour une bonne pagination tu auras besoin du nombre total d'elements dans la base de donnees pour connaitre le nombre de pages a afficher sur ta vue. Mais c'est mieux la au moi tu n'auras plus besoin de mettre toutes ces conditions sur la date mais juste tout prendre.

                • Partager sur Facebook
                • Partager sur Twitter
                  24 juin 2022 à 9:54:09

                  GillesMangin-Voirin a écrit:

                  Comme tu t'en doutes je n'ai pas inventé cela! je l'ai trouvé dans le post que ma conseillé : Monkey3D :

                  Oui, mais dans son lien, il y a bien des marqueurs dans la requête ;)

                  $query = 'SELECT * FROM `my_table` LIMIT :limite';

                  Dans ce cas, c'est :limite. C'est d'ailleurs plus sécurisé de fonctionner avec le bindValue, cela empêche l'injection de valeur inattendue dans la requête. Dans ton cas il faudrait l'utiliser sur NumRuche, limite et debut, et il faudrait sécuriser $type_intervalle pour empêcher d'autres valeurs que MINUTE, HOUR, DAY, MONTH et YEAR ...

                  GillesMangin-Voirin a écrit:

                  cela simplifierai la de borner sur un nombre de valeur plutôt que sur du temps

                  Oui, il me paraît impossible de déterminer le nombre total de page selon un intervalle de temps, alors que cela est très simple (cf. lien de Monkey3D) sur un intervalle de nombre (avec une clause LIMIT) ...

                  Si tu acceptes de ne pas avoir le nombre total de pages, tu peux rester ainsi, mais si tu veux absolument l'avoir, le code se simplifie très grandement avec une pagination par nombre :

                  <?php
                  // numéro de ruche (1 par défaut)
                  $ruche = 1;
                  if( !empty( $_GET['ruche'] ) ) {
                  	$page = $_GET['ruche'] > 0 ? intval( $_GET['ruche'] ) : 1;
                  }
                  
                  // numéro de page (1 par défaut)
                  $page = 1;
                  if( !empty( $_GET['page'] ) ) {
                  	$page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                  }
                  
                  // limite (10 par défaut)
                  $limite = 10;
                  if( !empty( $_GET['limite'] ) ) {
                  	$page = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 10;
                  }
                  
                  // nombre total d'entrée dans la table pour la ruche
                  $requete = $bdd->prepare("
                  	SELECT COUNT(*)
                  	FROM Telemesures_ruches
                  	WHERE id_ruche = ?");
                  $requete->execute( [ $ruche ] );
                  $nbMesures = $requete->fetchColumn();
                  
                  // nombre total de pages
                  $nbPages = ceil( $nbMesures / $limite );
                  
                  // requête pour obtenir les données de la page
                  $mesures = $bdd->prepare( '
                  	SELECT * , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee
                  	FROM Telemesures_ruches
                  	WHERE id_ruche = :ruche
                  	ORDER BY horodatage DESC
                  	LIMIT :limit OFFSET :offset;'
                  );
                  $mesures->bindValue('ruche', $ruche, PDO::PARAM_INT);
                  $mesures->bindValue('limit', $limite, PDO::PARAM_INT);
                  $mesures->bindValue('offset', $limite*($page-1), PDO::PARAM_INT);
                  $mesures->execute();
                  
                  // On affiche les données
                  while( $donnees = $mesures->fetch() ) {
                  ?>
                  		<tr>
                  			<td><?= $donnees['date_formatee'];?></td>
                  			<td><?= $donnees['hyg'];?> %</td>
                  			<td><?= $donnees['tex'];?> °C</td>
                  			<td><?= $donnees['tin'];?> °C</td>
                  			<td><?= $donnees['mas'];?> Kg</td>
                  			<td><?= $donnees['lum']<>'-1' ? $donnees['lum'] : '-';?></td>
                  			<td><?= $donnees['eau']<>'-1' ? $donnees['eau'] : '-';?></td>
                  		</tr>
                  	</tbody>
                  	<tfoot>
                  		<tr>
                  			<td colspan="7"></td>
                  		</tr>
                  	</tfoot>
                  </table>
                  <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                  <?php
                  if( $page > 1 ) {
                  ?>
                  <p style="float: left;">
                  	<a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                  </p>
                  <?php
                  }
                  if( $page < $nbPages ) {
                  ?>
                  <p style="float: right;">
                  	<a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                  </p>

                  J'en ai profité pour simplifier la partie d'affichage de la ligne avec tes 4 IF tordus ;)

                  -
                  Edité par Benzouye 24 juin 2022 à 9:55:46

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    24 juin 2022 à 11:58:41

                    Bon j'ai essayé de tester rapidement (trop) mais du coup j'ai parfois cette erreur dans la console de développement:

                    GET http://url/indexatest.php?ruche=2&p=donneestest&page=1&limite=20 500 (Internal Server Error)


                    Y a-t-il un moyen d'avoir plus de détail pour essayer de trouiver l'origine du problème?

                    Merci

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 juin 2022 à 12:14:28

                      Peux-tu poster le code complet de ton fichier indexatest.php ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        24 juin 2022 à 12:15:17

                        Salut, 

                        Quel est le contenu de indexatest.php ? J'ai l'impression que y'a une erreur. Quand tu dis dans la console, c'est la console du navigateur ? 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 juin 2022 à 14:24:37

                          Oui console de développement (f12) du navigateur (google chrome)!

                          Le fichier indexatest.php ne contient quasiment rien, il oriente soit vers les données soit vers les graphiques.

                          Il reçoit les informations du menu que je vais joindre.

                          indexatest.php :

                          <?php
                          
                          $sPage = $_GET['p'] ;
                          $NumRuche = $_GET['ruche'];
                          $page = $_GET['page'] ;
                          $sur= $_GET['limite'] ;
                          
                             include($sPage.'.php');
                          ?>
                          

                          Menu :

                          <?php
                          error_reporting(E_ALL);
                          ini_set('display_errors', TRUE);
                          ini_set('display_startup_errors', TRUE);
                          
                          $sDatabase = 'ruches';
                          $sHostIP = '127.0.0.1';
                          $sUser = 'abeille';
                          $sPwd = 'bbbzzzzz';
                           
                          $sDSN = 'mysql:dbname='.$sDatabase.';host='.$sHostIP;
                          
                          // Connexion MySQL 
                          try {
                              $bdd = new PDO($sDSN, $sUser, $sPwd);
                          
                          // Activation des erreurs PDO
                           $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                          
                          // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                          
                           $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                              } catch (PDOException $e) {
                              echo 'Connexion échouée : ' . $e->getMessage();
                          			      } 
                          
                              
                            
                               
                                // Liste de toutes les ruches
                              $requete1 = $bdd->query('SELECT * FROM Liste_ruches');
                              $ruches = $requete1->fetchAll();
                          
                          
                          /*requete création menu */
                          
                          $sSql = "SELECT id_ruche, nom FROM Liste_ruches ORDER BY id_ruche ASC";
                          
                          
                          
                          $rResult = $bdd->query($sSql);
                          $aData = $rResult->fetchAll();
                          
                          //echo 'il y a '.count($aData).' entrées.';	// affichage du nombre d'entrée de la table les_ruches
                          
                          
                          $aMenuPrincipal = []; // préparer le menu en tableau
                          
                          
                          
                          foreach ($aData as $donneesMenu)
                          {
                          //echo '<tr><th>'.$donneesMenu['id_ruche'].'</th><th>'.$donneesMenu['nom'].'</th></tr>';			// affichage du contenu de la table les_ruches
                          
                          
                                $aMenuPrincipal[] = array('id' => $donneesMenu['id_ruche'],'nom' => $donneesMenu['nom']);	// remplissage du tableau $aMenuPrincipal à partir de la table les_ruches
                            								       
                          }
                          
                          /* fin requete création menu */
                          $rResult->closeCursor();
                          
                          ?>
                          
                          
                          
                          
                          <!--Affichage menu -->								
                          
                          						</div>
                          					</div>
                          
                          				<!-- Sidebar -->
                          					<div id="sidebar">
                          						<div class="inner">
                          
                          
                          							<!-- Menu -->
                          								<nav id="menu">
                          									<header class="major">
                          										<h2>Menu</h2>
                          									</header>
                          
                           <?php if (count($aMenuPrincipal) > 0) { ?>
                          
                          
                              <ul>
                          
                              <?php
                              foreach ($aMenuPrincipal as $iLine => $aMenu) {
                                  $sLink = 'indexatest.php?ruche='.$aMenu['id'].'&p=';
                                  echo '<li>
                                      <span class="opener">'.$aMenu['nom'].'</span>
                                      	<ul>
                                          <li><a href="'.$sLink.'donneestest&page=1&limite=20"> DONNEES </a></li>
                                          <li><a href="'.$sLink.'graphiquestest"> GRAPHIQUES </a></li>
                                      	</ul>
                                       </li>';
                              						   }
                          
                              ?>		
                          	<li>	
                          	<span class="opener">A propos des ruches de Gilles</span>
                          	<ul>
                          	<li><a href="Lesruchestest.php">Les ruches</a></li>
                          	<li><a href="apiculteurtest.php">l'apiculteur et ce site!</a></li>
                          	</li>	
                          
                          											</ul>
                          	
                              </ul>
                          
                              <?php } ?>
                          
                          								</nav>
                          
                          							
                          							<!-- Footer -->
                          								<footer id="footer">
                          									<p class="copyright">&copy; Rémi Lefèvre & Gilles- Design inspiré de HTML5 UP. Version du 18/06/22</p>
                          								</footer>
                          								
                          		<!-- Scripts de gestion du menu-->
                          			<script src="assets/js/jquery.min.js"></script>
                          			<script src="assets/js/browser.min.js"></script>
                          			<script src="assets/js/breakpoints.min.js"></script>
                          			<script src="assets/js/util.js"></script>
                          			<script src="assets/js/main.js"></script>
                          				
                          		
                          


                          Voilà

                          bon il pleut fort je vais regarder d'un peu plus près le soucis!

                          Merci

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 juin 2022 à 14:29:31

                            C'est donc le contenu du fichier donneestest.php qu'il faudrait poster.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                              24 juin 2022 à 14:46:00

                              alors j'ai regardé dans le fichier error.log d'Apache 2 j'ai ceci lorsque je souhaite accéder à la page :

                              [Fri Jun 24 14:41:51.887034 2022] [php7:error] [pid 2937] [client 90.101.73.153:56585] PHP Parse error:  syntax error, unexpected end of file in /var/www/html/donneestest.php on line 155, referer: http://URL/indextest.php

                              le problème c'est que je n'ai pas de ligne 155voici le contenu actuel du fichier donneestest.php:

                              <!DOCTYPE HTML>
                              <!--
                              	Editorial by HTML5 UP
                              	html5up.net | @ajlkn
                              	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
                              	https://zestedesavoir.com/tutoriels/351/paginer-avec-php-et-sql/
                              -->
                              <html lang="fr">
                              
                              	<head>
                              		<title>Les ruches de Gilles </title>
                              		<meta charset="utf-8" />
                              		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
                              		<link rel="stylesheet" href="assets/css/main.css" />
                              		<link rel="stylesheet" href="assets/css/mon_css.css" />
                              		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
                              		
                              	</head>
                              	
                              	<body class="is-preload">
                              	<h1> <CENTER>Les ruches de Gilles </CENTER></h1>		<!-- Titre de la page centré -->
                              	<h2> <CENTER>Ruche N° <?php echo $NumRuche;?></CENTER></h2>
                              		<!-- Wrapper -->
                              			<div id="wrapper">
                              
                              				<!-- Main -->
                              					<div id="main">
                              						<div class="inner">
                              
                              							<!-- Header -->
                              								<header id="header">
                              									<a href="indextest.php" class="logo"><strong>Acceuil</strong></a>
                              
                              								</header>
                              
                              							<!-- Content -->
                              								<section>
                              									<header class="main">
                              					<h4><div><strong>Nous sommes le <span id="heure_exacte"></span></strong></div> 	</h4>
                              					<span class="image main"><img src="images/ruche<?php echo $NumRuche;?>.png" alt="" title ="Ruche N° <?php echo $NumRuche; ?>"  style="width:250px;height:400px;margin-left: auto; margin-right: auto;" /></span>	
                              								
                              						</header>
                              												
                              
                              
                              										<h1>Dernières données remontées</h1>
                              										
                              
                              				
                              									
                              
                              <?php
                              error_reporting(E_ALL);
                              ini_set('display_errors', TRUE);
                              ini_set('display_startup_errors', TRUE);
                              
                              /* Connexion à une base MySQL avec l'invocation de pilote */
                              $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                              $user = 'abeilles';
                              $password = 'password';
                              
                              
                              try {
                                  $bdd = new PDO($dsn, $user, $password);
                              // Activation des erreurs PDO
                               $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                              
                              // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                              
                               $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                              } catch (PDOException $e) {
                                  echo 'Connexion échouée : ' . $e->getMessage();
                              }
                              
                              
                              
                              
                              // numéro de ruche (1 par défaut)
                              $ruche = 1;
                              if( !empty( $_GET['ruche'] ) ) {
                                  $page = $_GET['ruche'] > 0 ? intval( $_GET['ruche'] ) : 1;
                              }
                               
                              // numéro de page (1 par défaut)
                              $page = 1;
                              if( !empty( $_GET['page'] ) ) {
                                  $page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                              }
                               
                              // limite (10 par défaut)
                              $limite = 10;
                              if( !empty( $_GET['limite'] ) ) {
                                  $page = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 10;
                              }
                               
                              // nombre total d'entrée dans la table pour la ruche
                              $requete = $bdd->prepare(" SELECT COUNT(*) FROM Telemesures_ruches WHERE id_ruche = ?");
                              
                              $requete->execute( [ $ruche ] );
                              $nbMesures = $requete->fetchColumn();
                               
                              // nombre total de pages
                              $nbPages = ceil( $nbMesures / $limite );
                               
                              // requête pour obtenir les données de la page
                              $mesures = $bdd->prepare( ' SELECT * , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee FROM Telemesures_ruches WHERE id_ruche = :ruche ORDER BY horodatage DESC LIMIT :limit OFFSET :offset;');
                              
                              $mesures->bindValue('ruche', $ruche, PDO::PARAM_INT);
                              $mesures->bindValue('limit', $limite, PDO::PARAM_INT);
                              $mesures->bindValue('offset', $limite*($page-1), PDO::PARAM_INT);
                              
                              $mesures->execute();
                               
                              // On affiche les données
                              while( $donnees = $mesures->fetch() ) {
                              ?>
                                      <tr>
                                          <td><?= $donnees['date_formatee'];?></td>
                                          <td><?= $donnees['hyg'];?> %</td>
                                          <td><?= $donnees['tex'];?> °C</td>
                                          <td><?= $donnees['tin'];?> °C</td>
                                          <td><?= $donnees['mas'];?> Kg</td>
                                          <td><?= $donnees['lum']<>'-1' ? $donnees['lum'] : '-';?></td>
                                          <td><?= $donnees['eau']<>'-1' ? $donnees['eau'] : '-';?></td>
                                      </tr>
                                  </tbody>
                                  <tfoot>
                                      <tr>
                                          <td colspan="7"></td>
                                      </tr>
                                  </tfoot>
                              </table>
                              <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                              <?php
                              if( $page > 1 ) {
                              ?>
                              <p style="float: left;">
                                  <a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                              </p>
                              <?php
                              }
                              if( $page < $nbPages ) {
                              ?>
                              <p style="float: right;">
                                  <a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                              </p>
                              
                              
                              <script src="assets/js/mon_javascript.js"></script> <!--fichier contenant mes fonctions javaScript-->
                              
                              </section>
                              	</body>
                              </html>
                              

                              le </html> est en ligne 154

                              Il s'agit de la version actuelle de test comme cela ne semblait aps bien aller j'ai supprimé le menu et l'affichage des deltas avec les requêtes qui allaient avec!

                              l'erreur vient de cette partie je vais regarder aussi!

                              // On affiche les données
                              while( $donnees = $mesures->fetch() ) {
                              ?>
                                      <tr>
                                          <td><?= $donnees['date_formatee'];?></td>
                                          <td><?= $donnees['hyg'];?> %</td>
                                          <td><?= $donnees['tex'];?> °C</td>
                                          <td><?= $donnees['tin'];?> °C</td>
                                          <td><?= $donnees['mas'];?> Kg</td>
                                          <td><?= $donnees['lum']<>'-1' ? $donnees['lum'] : '-';?></td>
                                          <td><?= $donnees['eau']<>'-1' ? $donnees['eau'] : '-';?></td>
                                      </tr>
                                  </tbody>
                                  <tfoot>
                                      <tr>
                                          <td colspan="7"></td>
                                      </tr>
                                  </tfoot>
                              </table>
                              <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                              <?php
                              if( $page > 1 ) {
                              ?>
                              <p style="float: left;">
                                  <a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                              </p>
                              <?php
                              }
                              if( $page < $nbPages ) {
                              ?>
                              <p style="float: right;">
                                  <a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                              </p>


                              la parenthèse de fin du while n'est pas présente! je regarde encore

                              Merci

                              -
                              Edité par GillesMangin-Voirin 24 juin 2022 à 14:58:41

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 juin 2022 à 15:02:34

                                GillesMangin-Voirin a écrit:

                                la parenthèse de fin du while n'est pas présente

                                Oops .. C'est ma faute ... Il faut rajouter la fermeture du while, ligne 13 :

                                // On affiche les données
                                while( $donnees = $mesures->fetch() ) {
                                ?>
                                		<tr>
                                			<td><?= $donnees['date_formatee'];?></td>
                                			<td><?= $donnees['hyg'];?> %</td>
                                			<td><?= $donnees['tex'];?> °C</td>
                                			<td><?= $donnees['tin'];?> °C</td>
                                			<td><?= $donnees['mas'];?> Kg</td>
                                			<td><?= $donnees['lum']<>'-1' ? $donnees['lum'] : '-';?></td>
                                			<td><?= $donnees['eau']<>'-1' ? $donnees['eau'] : '-';?></td>
                                		</tr>
                                <?php
                                }
                                ?>
                                	</tbody>
                                	<tfoot>
                                		<tr>
                                			<td colspan="7"></td>
                                		</tr>
                                	</tfoot>
                                </table>
                                <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                                <?php
                                if( $page > 1 ) {
                                ?>
                                <p style="float: left;">
                                	<a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                                </p>
                                <?php
                                }
                                if( $page < $nbPages ) {
                                ?>
                                <p style="float: right;">
                                	<a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                                </p>

                                -
                                Edité par Benzouye 24 juin 2022 à 15:02:47

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                  24 juin 2022 à 15:07:01

                                  oui je viens de la faire juste avant que tu me le dises (histoire de dire que pour une fois j'avais aussi trouvé!)

                                  j'allais reposter mais il y a encore une erreur dans la partie suivante je cherche aussi :

                                  <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                                  <?php
                                  if( $page > 1 ) {
                                  ?>
                                  <p style="float: left;">
                                      <a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                                  </p>
                                  <?php
                                  }
                                  if( $page < $nbPages ) {
                                  ?>
                                  <p style="float: right;">
                                      <a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                                  </p>
                                  


                                  j'ai trouvé! il manque encore une fin d'accolade après la dernière ligne du code ci-dessus!

                                  Merci beaucoup

                                  Bon, il me reste encore des trucs qu'il faut que je regarde par exemple la première page porte le numéro du limite dans l' URL..

                                  -
                                  Edité par GillesMangin-Voirin 24 juin 2022 à 15:12:51

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 juin 2022 à 15:09:16

                                    Là encore, oubli de ma part, il manque l'accolade fermante du deuxième IF :

                                    <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                                    <?php
                                    if( $page > 1 ) {
                                    ?>
                                    <p style="float: left;">
                                        <a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                                    </p>
                                    <?php
                                    }
                                    if( $page < $nbPages ) {
                                    ?>
                                    <p style="float: right;">
                                        <a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                                    </p>
                                    <?php
                                    }
                                    ?>
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                      24 juin 2022 à 15:13:18

                                      Tu as une boucle while dans ton fichier, a l'affichage peut-etre que tu te retrouves avec bien plus de ligne que tu ne le crois, qui depend du nombre d'iterations dans cette boucle. A l'interieur tu remplis une ligne d'un tableau puis tu fermes, mais a quel moment tu ouvres ce tableau: <table>

                                      Edit:

                                      C'est un peu comprehensible ces oublis sur les accolades. Pour moi tu devrais ouvrir une balise php, ecrire ce que tu veux puis refermer lorsque tu as fini ton operation au lieu d'ouvrir a chaque fois pour un if ou un while :

                                      <?php
                                        while(){
                                          // Traitemt
                                        }
                                      ?>

                                      Au lieu de :

                                      <?php
                                        while(){
                                      ?>
                                      
                                      // traitement
                                      
                                      <?php
                                      }
                                      
                                      ?>
                                      
                                      

                                      Tu oublieras moins ainsi, d'apres moi

                                      -
                                      Edité par Asmitta 24 juin 2022 à 15:21:27

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        24 juin 2022 à 15:26:53

                                        Alors là j'ai rectifié un peu tout ce qui manquait du coup je reposte le code il y a cette histoire de numéro de page qui est en fait la valeur de limite de l'url à regarder

                                        et le fait d'appuyer sur une des flèches renvoie aux données de la ruche 1 tout cela semble lié ..

                                        (bon cela je l'ai réglé en changeant le nom de variable $ruche en $NumRuche

                                        Bon il ne pleut pu j'ai encore pas mal de boulot au jardin avant le départ en vacances dimanche!

                                        <!DOCTYPE HTML>
                                        <!--
                                        	Editorial by HTML5 UP
                                        	html5up.net | @ajlkn
                                        	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
                                        	https://zestedesavoir.com/tutoriels/351/paginer-avec-php-et-sql/
                                        -->
                                        <html lang="fr">
                                        
                                        	<head>
                                        		<title>Les ruches de Gilles </title>
                                        		<meta charset="utf-8" />
                                        		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
                                        		<link rel="stylesheet" href="assets/css/main.css" />
                                        		<link rel="stylesheet" href="assets/css/mon_css.css" />
                                        		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
                                        		
                                        	</head>
                                        	
                                        	<body class="is-preload">
                                        	<h1> <CENTER>Les ruches de Gilles </CENTER></h1>		<!-- Titre de la page centré -->
                                        	<h2> <CENTER>Ruche N° <?php echo $NumRuche;?></CENTER></h2>
                                        		<!-- Wrapper -->
                                        			<div id="wrapper">
                                        
                                        				<!-- Main -->
                                        					<div id="main">
                                        						<div class="inner">
                                        
                                        							<!-- Header -->
                                        								<header id="header">
                                        									<a href="indextest.php" class="logo"><strong>Acceuil</strong></a>
                                        
                                        								</header>
                                        
                                        							<!-- Content -->
                                        								<section>
                                        									<header class="main">
                                        					<h4><div><strong>Nous sommes le <span id="heure_exacte"></span></strong></div> 	</h4>
                                        					<span class="image main"><img src="images/ruche<?php echo $NumRuche;?>.png" alt="" title ="Ruche N° <?php echo $NumRuche; ?>"  style="width:250px;height:400px;margin-left: auto; margin-right: auto;" /></span>	
                                        								
                                        						</header>
                                        												
                                        
                                        
                                        										<h1>Dernières données remontées</h1>
                                        										
                                        
                                        				
                                        									
                                        
                                        <?php
                                        error_reporting(E_ALL);
                                        ini_set('display_errors', TRUE);
                                        ini_set('display_startup_errors', TRUE);
                                        
                                        /* Connexion à une base MySQL avec l'invocation de pilote */
                                        $dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                                        $user = 'abeilles';
                                        $password = 'password';
                                        
                                        
                                        try {
                                            $bdd = new PDO($dsn, $user, $password);
                                        // Activation des erreurs PDO
                                         $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                        
                                        // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                        
                                         $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                        } catch (PDOException $e) {
                                            echo 'Connexion échouée : ' . $e->getMessage();
                                        }
                                        
                                        
                                        // numéro de ruche (1 par défaut)
                                        $ruche = 1;
                                        if( !empty( $_GET['ruche'] ) ) {
                                            $page = $_GET['ruche'] > 0 ? intval( $_GET['ruche'] ) : 1;
                                        }
                                         
                                        // numéro de page (1 par défaut)
                                        $page = 1;
                                        if( !empty( $_GET['page'] ) ) {
                                            $page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                                        }
                                         
                                        // limite (10 par défaut)
                                        $limite = 6000;
                                        if( !empty( $_GET['limite'] ) ) {
                                            $page = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 10;
                                        }
                                         
                                        // nombre total d'entrée dans la table pour la ruche
                                        $requete = $bdd->prepare(" SELECT COUNT(*) FROM Telemesures_ruches WHERE id_ruche = ?");
                                        
                                        $requete->execute( [ $ruche ] );
                                        $nbMesures = $requete->fetchColumn();
                                         
                                        // nombre total de pages
                                        $nbPages = ceil( $nbMesures / $limite );
                                         
                                        // requête pour obtenir les données de la page
                                        $mesures = $bdd->prepare( ' SELECT * , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee FROM Telemesures_ruches WHERE id_ruche = :ruche ORDER BY horodatage DESC LIMIT :limit OFFSET :offset;');
                                        
                                        $mesures->bindValue('ruche', $ruche, PDO::PARAM_INT);
                                        $mesures->bindValue('limit', $limite, PDO::PARAM_INT);
                                        $mesures->bindValue('offset', $limite*($page-1), PDO::PARAM_INT);
                                        
                                        $mesures->execute();
                                        ?>
                                        
                                        <table>
                                        	<thead>
                                        
                                        <?php
                                        //echo '<table>';
                                        echo '<tr><th>Heure</th><th>Hygrométrie</th><th>Température exterieure</th><th>Température interieure</th><th>Masse</th><th>Luminosité</th><th>Pluie (1 si pluie)</th></tr>';
                                        ?>
                                        
                                        </thead>
                                        <tbody>
                                        
                                        <?php 
                                        // On affiche les données
                                        while( $donnees = $mesures->fetch() ) {
                                        ?>
                                                <tr>
                                                    <td><?= $donnees['date_formatee'];?></td>
                                                    <td><?= $donnees['hyg'];?> %</td>
                                                    <td><?= $donnees['tex'];?> °C</td>
                                                    <td><?= $donnees['tin'];?> °C</td>
                                                    <td><?= $donnees['mas'];?> Kg</td>
                                                    <td><?= $donnees['lum']<>'-1' ? $donnees['lum'] : '-';?></td>
                                                    <td><?= $donnees['eau']<>'-1' ? $donnees['eau'] : '-';?></td>
                                        				
                                                </tr>
                                        				<?php }?>
                                            </tbody>
                                            <tfoot>
                                        	   
                                                <tr>
                                                    <td colspan="7"></td>
                                                </tr>
                                            </tfoot>
                                        </table>
                                        
                                        
                                        <p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                                        <?php
                                        if( $page > 1 ) {
                                        ?>
                                        <p style="float: left;">
                                            <a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                                        </p>
                                        <?php
                                        }
                                        if( $page < $nbPages ) {
                                        ?>
                                        <p style="float: right;">
                                            <a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                                        </p>
                                        <?php
                                        }
                                        ?>
                                        
                                        
                                        <?php
                                        
                                        
                                        $requete->closeCursor();
                                        $bdd=Null;
                                        
                                        ?>
                                        
                                        <!--Affichage menu -->								
                                        								
                                         <?php include "menu.php"; // rajout du menu	?>
                                        						</div>
                                        					</div>
                                        
                                        				
                                        
                                        			
                                        
                                        <!-- affichage du bouton remontée contenu dans mon_javascript et mon_css-->
                                        
                                        <div id="scrollUp">
                                        <a href="#top"><img src="images/to_top.png"/></a>
                                        </div>
                                        
                                        
                                        	
                                        </section>
                                        
                                        <script src="assets/js/mon_javascript.js"></script> <!--fichier contenant mes fonctions javaScript-->
                                        
                                        	</body>
                                        </html>
                                        



                                        Merci

                                        bon quand j'ai un soucis j'ai du mal à décrocher du coup j'ai trouvé l'origine il s'agit de ceci :

                                        // numéro de ruche (1 par défaut)
                                        $ruche = 1;
                                        if( !empty( $_GET['ruche'] ) ) {
                                            $page = $_GET['ruche'] > 0 ? intval( $_GET['ruche'] ) : 1;
                                        }
                                          
                                        // numéro de page (1 par défaut)
                                        $page = 1;
                                        if( !empty( $_GET['page'] ) ) {
                                            $page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                                        }
                                          
                                        // limite (10 par défaut)
                                        $limite = 10;
                                        if( !empty( $_GET['limite'] ) ) {
                                            $page = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 10

                                        à chaque fois c'est $page qui est actualisé au lieu de $limite pour le dernier et $NumRuche pour le 1er

                                        Merci encore

                                        Je confirme cela fonctionne nickel, il ne me reste plus que la page d'accueil à refaire à partir de cette requête : 

                                        $requete = $bdd->query('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
                                        			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
                                                        SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                            	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches WHERE horodatage >= NOW() - INTERVAL 20 DAY
                                                       	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                        			WHERE M.horodatage >= NOW() - INTERVAL 20 DAY GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                        			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC, M.id_ruche');

                                        en la modifiant pour y intégrer limit et offset (à la place des now et intervall) .

                                        Puis en faire une avec le select count dessus mais je ne sais pas trop si cela va fonctionner vu que sur le même genre de requête je n'ai pas réussis à compter...

                                        Merci



                                        -
                                        Edité par GillesMangin-Voirin 24 juin 2022 à 16:16:11

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          24 juin 2022 à 16:09:39

                                          Asmitta a écrit:

                                          tu devrais ouvrir une balise php, ecrire ce que tu veux puis refermer lorsque tu as fini ton operation

                                          Je préfères laisser le HTML hors des balises PHP, pour conserver la coloration syntaxique ;)

                                          Sinon pour le code :

                                          • Ligne 22, $NumRuche n'est pas encore initialisée. Idem ligne 40.
                                          • Il faudrait déplacer le bloc de la ligne 13 à 46 directement ligne 112.
                                          • Ligne 79, 85 et 91, j'ai fait un copier/coller sans changer le nom de la variable.
                                          • Quelques décalages aussi dans les fermetures de balises <section> et <div>.

                                          Je propose :

                                          <!DOCTYPE HTML>
                                          <html lang="fr">
                                          	<head>
                                          		<title>Les ruches de Gilles </title>
                                          		<meta charset="utf-8" />
                                          		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
                                          		<link rel="stylesheet" href="assets/css/main.css" />
                                          		<link rel="stylesheet" href="assets/css/mon_css.css" />
                                          		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
                                          	</head>
                                          	<body class="is-preload">
                                          <?php
                                          	error_reporting(E_ALL);
                                          	ini_set('display_errors', TRUE);
                                          	ini_set('display_startup_errors', TRUE);
                                          	 
                                          	// Connexion à une base MySQL
                                          	$dsn = 'mysql:dbname=ruches;host=127.0.0.1';
                                          	$user = 'abeilles';
                                          	$password = 'password';
                                          	
                                          	try {
                                          		$bdd = new PDO($dsn, $user, $password);
                                          		// Activation des erreurs PDO
                                          		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                          		// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                          		 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                          	}
                                          	catch( PDOException $e ) {
                                          		echo 'Connexion échouée : ' . $e->getMessage();
                                          	}
                                          	
                                          	// numéro de ruche (1 par défaut)
                                          	$ruche = 1;
                                          	if( !empty( $_GET['ruche'] ) ) {
                                          		$ruche = $_GET['ruche'] > 0 ? intval( $_GET['ruche'] ) : 1;
                                          	}
                                          	  
                                          	// numéro de page (1 par défaut)
                                          	$page = 1;
                                          	if( !empty( $_GET['page'] ) ) {
                                          		$page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                                          	}
                                          	  
                                          	// limite (10 par défaut)
                                          	$limite = 10;
                                          	if( !empty( $_GET['limite'] ) ) {
                                          		$limite = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 10;
                                          	}
                                          	
                                          	// nombre total d'entrée dans la table pour la ruche
                                          	$requete = $bdd->prepare(" SELECT COUNT(*) FROM Telemesures_ruches WHERE id_ruche = ?");
                                          	$requete->execute( [ $ruche ] );
                                          	$nbMesures = $requete->fetchColumn();
                                          	
                                          	// nombre total de pages
                                          	$nbPages = ceil( $nbMesures / $limite );
                                          ?>
                                          		<h1><CENTER>Les ruches de Gilles</CENTER></h1>
                                          		<h2><CENTER>Ruche N° <?= $ruche; ?></CENTER></h2>
                                          		<div id="wrapper">
                                          			<div id="main">
                                          				<div class="inner">
                                          					<header id="header">
                                          						<a href="indextest.php" class="logo"><strong>Acceuil</strong></a>
                                          					</header>
                                          					<section>
                                          						<header class="main">
                                          							<h4><strong>Nous sommes le <span id="heure_exacte"></span></strong></h4>
                                          							<span class="image main"><img src="images/ruche<?= $ruche; ?>.png" alt="" title ="Ruche N° <?= $ruche; ?>"  style="width:250px;height:400px;margin-left: auto; margin-right: auto;" /></span> 
                                          						</header>
                                          						<h1>Dernières données remontées</h1>
                                          						<table>
                                          							<thead>
                                          								<tr>
                                          									<th>Heure</th>
                                          									<th>Hygrométrie</th>
                                          									<th>Température exterieure</th>
                                          									<th>Température interieure</th>
                                          									<th>Masse</th>
                                          									<th>Luminosité</th>
                                          									<th>Pluie (1 si pluie)</th>
                                          								</tr>
                                          							</thead>
                                          							<tbody>
                                          <?php
                                          	// requête pour obtenir les données de la page
                                          	$mesures = $bdd->prepare( '
                                          		SELECT * , DATE_FORMAT( horodatage, "%d/%m/%Y %Hh%i:%s" ) AS date_formatee
                                          		FROM Telemesures_ruches
                                          		WHERE id_ruche = :ruche
                                          		ORDER BY horodatage DESC
                                          		LIMIT :limit OFFSET :offset;'
                                          	);
                                          	$mesures->bindValue('ruche', $ruche, PDO::PARAM_INT);
                                          	$mesures->bindValue('limit', $limite, PDO::PARAM_INT);
                                          	$mesures->bindValue('offset', $limite*($page-1), PDO::PARAM_INT);
                                          	$mesures->execute();
                                          
                                          	// On affiche les données
                                          	while( $donnees = $mesures->fetch() ) {
                                          ?>
                                          								<tr>
                                          									<td><?= $donnees['date_formatee'];?></td>
                                          									<td><?= $donnees['hyg'];?> %</td>
                                          									<td><?= $donnees['tex'];?> °C</td>
                                          									<td><?= $donnees['tin'];?> °C</td>
                                          									<td><?= $donnees['mas'];?> Kg</td>
                                          									<td><?= $donnees['lum']<>'-1' ? $donnees['lum'] : '-';?></td>
                                          									<td><?= $donnees['eau']<>'-1' ? $donnees['eau'] : '-';?></td>
                                          										 
                                          								</tr>
                                          <?php
                                          	}
                                          ?>
                                          							</tbody>
                                          							<tfoot>
                                          								<tr>
                                          									<td colspan="7"></td>
                                          								</tr>
                                          							</tfoot>
                                          						</table>
                                          						<p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                                          <?php
                                          	if( $page > 1 ) {
                                          ?>
                                          						<p style="float: left;">
                                          							<a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                                          						</p>
                                          <?php
                                          	}
                                          	if( $page < $nbPages ) {
                                          ?>
                                          						<p style="float: right;">
                                          							<a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                                          						</p>
                                          <?php
                                          	}
                                          ?>
                                          					</section>
                                          				</div>
                                          			</div>
                                          <?php 
                                          	include "menu.php";
                                          ?>
                                          			<div id="scrollUp">
                                          				<a href="#top"><img src="images/to_top.png"/></a>
                                          			</div>
                                          		</div>
                                          		<script src="assets/js/mon_javascript.js"></script>
                                          	</body>
                                          </html>

                                          -
                                          Edité par Benzouye 24 juin 2022 à 16:11:38

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                            24 juin 2022 à 18:35:44

                                            Re: je réponds à tes remarques au fur et à mesure en espérant ne pas dire trop de bêtises.

                                            Si $NumRuche est initialisé, il est passé dans l'URL (ruche)  et comme le fichier indexa.ph contient ceci :

                                            $NumRuche = $_GET['ruche']; avant l'insertion du fichier donnees.test.php par la ligne :include($sPage.'.php'); ou ici $sPage=donnees.test.

                                            Pour le déplacement du bloc 13 à 46 à partir de la ligne 112 c'était uniquement pour le $NumRuche? Si c'est la cas ce n'est pas nécessaire du coup à moins que cela ai une autre raison d'être?

                                            Pour les</ div> il me semble que tu en as un trop non ligne 148 ou 149?

                                            Pour la remontée de la fin de section et 2 des div OK. Cela fonctionne toujours.

                                            Merci

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              28 juin 2022 à 15:37:11

                                              Bonjour, je reviens un peu sur ce sujet car si maintenant que le choix de faire défiler sur un nombre de données précises plutôt que de mettre un bornage temporel est fait!

                                              Et que le problème sur ma page données est réglé, j'avais aussi une question plus haut dans le post (qui a été noyée dans le flot d'informations) concernant la réalisation de la requête de select count sur le calcul du nombre d'heures contenu dans ma table.

                                              En effet la page d'accueil du site présente la moyenne horaire de la température et le poids moyen horaire de chaque ruche grâce à cette requête :

                                              $requete = $bdd->query('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
                                              			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
                                                              SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                                  	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches WHERE horodatage >= NOW() - INTERVAL 20 DAY
                                                             	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                              			WHERE M.horodatage >= NOW() - INTERVAL 20 DAY GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                              			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC, M.id_ruche'); 
                                              
                                              $mesures = $requete->fetchAll();
                                              $requete->closeCursor();
                                              $bdd=Null;

                                              Du coup pour pouvoir faire défiler (même principe que la page donnees.php) la totalité des moyennes  horaires de la table, il me faut commencer par compter le nombre total d'heures enregistrées dans la table.

                                              Avec donc un select count sur cette requête : (ou du genre si plus économe en temps)

                                              $requete = $bdd->query('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
                                              			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
                                                              SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                                  	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches 
                                                             	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                              			 GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                              			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC, M.id_ruche'); 



                                              Chose que je n'arrive pas à faire : soit cela plante soit, cela ne renvoi pas le bon nombre (du genre 68)...

                                              Puis modifier la requête pour remplacer par ceci :

                                              echo "pages : ".$page;
                                              echo "limite :".$limite;
                                              echo "offset : ".$limite*($page-1);
                                              echo "NumRuche : ".$NumRuche;
                                              
                                              $requete = $bdd->prepare('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
                                              			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
                                                              SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                                  	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches 
                                                             	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                              			 GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                              			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC LIMIT :limit OFFSET :offset;, M.id_ruche'); 
                                              
                                              
                                              $requete->bindValue('limit', $limite, PDO::PARAM_INT);
                                              $requete->bindValue('offset', $limite*($page-1), PDO::PARAM_INT);
                                              
                                              $requete->execute();

                                              cela fonctionne presque...

                                              $limite ne correspond du coup pas au nombre de ligne affichée puisqu'il y a un regroupement par exemple avec

                                              $limite = 10 on a 2 lignes d'affichée

                                              et $limite =30 on a 6 lignes d'affichées...

                                              Deuxième petit soucis d'affichage sur la dernière ligne (incomplete) surement du au fait qu'on n'a pas encore eu de mise à jour sur le point horaire affiché (comme on travaille maintenant sur un nombre de données et plus en temps) pour là ou les ruches concernées.

                                              Du coup la dernière ligne est parfois (en fonction de la valeur de $limite) incomplète certaines ruches manquent image ci dessous:

                                              Voilà ou j'en suis...Si quelqu'un a une idée pour régler ces 2 soucis et comment réaliser le calcul du nombre de ligne maximale possible à afficher..

                                              Je me demandais si pour l'affichage des boutons suivants et précédent on ne pouvait pas envisager (à défaut de mieux) que lorsque count($mesures) =0 cacher le bouton suivant..

                                              Je remet le code complet mais pas achevé (bouton, calculs pages,...) de ma page de test car pour comprendre je crois que c'est indispensable...

                                              <!DOCTYPE HTML>
                                              <!--
                                              	Editorial by HTML5 UP
                                              	html5up.net | @ajlkn
                                              	Free for personal and commercial use under the CCA 3.0 license (html5up.net/license)
                                              -->
                                              <html lang="fr">
                                              
                                              	<head>
                                              		<title>Les ruches de Gilles</title>
                                              		<meta charset="utf-8" />
                                              		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
                                              		<link rel="stylesheet" href="assets/css/main.css" />
                                              		<link rel="stylesheet" href="assets/css/mon_css.css" />
                                              		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
                                              	</head>
                                              	
                                              	<body class="is-preload">
                                              	<h1> <CENTER>Les ruches de Gilles </CENTER></h1>		<!-- Titre de la page centré -->
                                              		<!-- Wrapper -->
                                              			<div id="wrapper">
                                              
                                              				<!-- Main -->
                                              					<div id="main">
                                              						<div class="inner">
                                              
                                              														<!-- Header -->
                                              								<header id="header">
                                              									<a href="indextest.php" class="logo"><strong>Recharger cette page</strong></a>
                                              
                                              								</header>
                                              
                                              							<!-- Content -->
                                              								<section>
                                              									<header class="main">
                                              								 <h4>	<div><strong>Nous sommes le <span id="heure_exacte"></span></strong></div> </h4>
                                              								<span class="image main"><img src="images/ruche.png" alt="" /></span>	
                                              			
                                              									</header>
                                              												
                                              
                                              										<h1>Dernières données remontées test</h1>
                                              				
                                              
                                              
                                              
                                              
                                              
                                              <script>
                                               /* window.addEventListener('DOMContentLoaded', function () {
                                                setInterval("dateEtHeure()", 1000);
                                              });*/
                                              
                                              window.onload = function() {
                                              setInterval("dateEtHeure()", 1000);
                                              							};
                                              
                                              							
                                              </script>
                                              
                                              
                                              <?php
                                              error_reporting(E_ALL);
                                              ini_set('display_errors', TRUE);
                                              ini_set('display_startup_errors', TRUE);
                                              
                                              $sDatabase = 'ruches';
                                              $sHostIP = '127.0.0.1';
                                              $sUser = 'user';
                                              $sPwd = 'password';
                                               
                                              $sDSN = 'mysql:dbname='.$sDatabase.';host='.$sHostIP;
                                              
                                              // Connexion MySQL 
                                              try {
                                                  $bdd = new PDO($sDSN, $sUser, $sPwd);
                                              
                                              // Activation des erreurs PDO
                                               $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                              
                                              // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                              
                                               $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                                  } catch (PDOException $e) {
                                                  echo 'Connexion échouée : ' . $e->getMessage();
                                              			      } 
                                              			      
                                              			      
                                                    // Liste de toutes les ruches
                                                  $requete1 = $bdd->query('SELECT * FROM Liste_ruches');
                                                  $ruches = $requete1->fetchAll();
                                              
                                              
                                              
                                              // numéro de ruche (1 par défaut)
                                              $NumRuche = 4;
                                              if( !empty( $_GET['ruche'] ) ) {
                                                  $NumRuche = $_GET['ruche'] > 0 ? intval( $_GET['ruche'] ) : 2;
                                              }
                                               
                                              // numéro de page (1 par défaut)
                                              $page = 1;
                                              if( !empty( $_GET['page'] ) ) {
                                                  $page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                                              }
                                               
                                              // limite (360 par défaut environ 15 jours si tout c'est bien passé!)
                                              $limite = 30;
                                              
                                              if( !empty( $_GET['limite'] ) ) {
                                                  $limite = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 10;
                                              }
                                              
                                              echo "pages : ".$page;
                                              echo "limite :".$limite;
                                              echo "offset : ".$limite*($page-1);
                                              echo "NumRuche : ".$NumRuche;
                                              
                                              $requete = $bdd->prepare('SELECT DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,M.id_ruche,MH.temperature, ROUND(AVG(M.mas),2) AS poids
                                              			FROM Telemesures_ruches M INNER JOIN (-- Moyennes temperature
                                                              SELECT DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                                  	ROUND(AVG(tex),1) AS temperature FROM Telemesures_ruches 
                                                             	 	GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) ) AS MH ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                              			 GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                              			ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC LIMIT :limit OFFSET :offset;, M.id_ruche'); 
                                              
                                              
                                              $requete->bindValue('limit', $limite, PDO::PARAM_INT);
                                              $requete->bindValue('offset', $limite*($page-1), PDO::PARAM_INT);
                                              
                                              $requete->execute();
                                              
                                              $mesures = $requete->fetchAll();
                                              $requete->closeCursor();
                                              $bdd=Null;
                                              
                                              echo "mesures :".count($mesures);
                                              echo "ruches :".count ($ruches);
                                                   
                                                  // Si il y a des ruches et des mesures on affiche le tableau
                                                  // Sinon on affiche un message "aucune données"
                                                  if( count( $ruches ) && count( $mesures ) ) {
                                              ?>
                                                  <table>
                                              
                                                      <thead>
                                                          <tr>
                                                              <th>Dates</th><th>T° rucher</th>
                                              <?php
                                                      // Une entête de colonne par ruche
                                                      foreach( $ruches as $ruche ) {
                                              ?>
                                                                                  <th><?= $ruche['nom']; ?></th>
                                              <?php
                                                      			     }
                                              ?>
                                                                              </tr>
                                                                          </thead>
                                              
                                                                          <tbody>
                                              <?php
                                              
                                              
                                                  // On construit le tableau 2D
                                                  $donnees = array();
                                                  $moyennes = array();
                                                  foreach( $mesures as $mesure ) {
                                                      $moyennes[$mesure['horodatage']] = $mesure['temperature'];
                                                      $donnees[$mesure['horodatage']][$mesure['id_ruche']] = $mesure['poids'];
                                                  				   }
                                                   
                                                  // On boucle sur le 2D pour afficher les lignes
                                              
                                                  foreach ( $donnees as $date => $mesures ) {
                                                      					$moyenne = $moyennes[$date];
                                              ?>
                                                                              <tr>
                                                                                  <td><?= $date; ?></td>
                                                                                  <td><?= $moyenne.'°C'; ?></td>
                                              <?php 
                                                      foreach( $ruches as $ruche ) {
                                              ?>
                                                                                  <td>
                                              <?php
                                              
                                                          foreach( $mesures as $id => $valeur ) {
                                                              if( $id == $ruche['id_ruche'] ) echo $valeur.' Kg';
                                                          }
                                              
                                              				     } 
                                              ?>
                                                                                  </td>
                                              <?php
                                                      				      }	// fin de s'il y a des données 
                                              ?>
                                                                              </tr>
                                              
                                                      </tbody>
                                              
                                                  </table>
                                              
                                              
                                              
                                              <!-- affichage du bouton remontée contenu dans mon_javascript et mon_css-->
                                              
                                              <div id="scrollUp">
                                              <a href="#top"><img src="images/to_top.png"/></a>
                                              </div>
                                              
                                              <?php
                                                  } else {						// si pas de données
                                              ?>
                                                  <p>Aucune données à afficher.</p>
                                              
                                              <?php
                                                  }							// fin du si pas de données
                                              
                                              ?>
                                              
                                              <!--Affichage menu -->								
                                               <?php include "menutest.php"; // rajout du menu	?>
                                              						</div>
                                              					</div>
                                              
                                              
                                              
                                              
                                              
                                              
                                              	
                                              
                                              </section>	
                                              
                                              <script src="assets/js/mon_javascript.js"></script> <!--fichier contenant mes fonctions javaScript-->
                                              
                                              	</body>
                                              </html>
                                              



                                              Merci

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                28 juin 2022 à 15:50:09

                                                Comme dit plus haut aussi, pour avoir le nombre total de requetes tu peux faire un count sur le resultat:

                                                // Si $resulat contient tes donnees: array et non PDO 
                                                $total = count($resultat);

                                                >$limite ne correspond du coup pas au nombre de ligne affichée puisqu'il y a un regroupement par exemple avec

                                                limite correspond aux nombres d'enregistrements, si $limite = 10 et que y'a juste deux lignes affichees euh c'est que tu n'affiches pas les enregistrements tel qu'ils le sont.

                                                >Deuxième petit soucis d'affichage sur la dernière ligne (incomplete) surement du au fait qu'on n'a pas encore eu de mise à jour sur le point horaire affiché (comme on travaille maintenant sur un nombre de données et plus en temps) pour là ou les ruches concernées

                                                Tu peux verifier chaque champ du dernier enregistrement puis afficher ou pas si y'a un champ nul

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  28 juin 2022 à 17:27:14

                                                  Ligne 125, dans ta requête SQL tu as un ,M.id_ruche un peu perdu.

                                                  GillesMangin-Voirin a écrit:

                                                  $limite = 10 on a 2 lignes d'affichée

                                                  et $limite =30 on a 6 lignes d'affichées

                                                  Attention, la requête retourne une ligne par ruche et par heure. Donc la valeur pour LIMIT est "divisée" par le nombre de ruche ... je pense que ta "déception" est due à cela, et les trous dans la dernière ligne aussi ...

                                                  Une approximation pour lutter contre ça serait de multiplier la limite par le nombre de ruches, mais c'est une approximation car pour chaque heure, il y aura potentiellement des ruches "absentes" (coupure de transmission par exemple).

                                                  Si je reprends ton compte en remettant un peu d'ordre (indentation notamment) et en reprenant les balises fermantes (encore et toujours :p ) :

                                                  <!DOCTYPE HTML>
                                                  <html lang="fr">
                                                  	<head>
                                                  		<title>Les ruches de Gilles</title>
                                                  		<meta charset="utf-8" />
                                                  		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
                                                  		<link rel="stylesheet" href="assets/css/main.css" />
                                                  		<link rel="stylesheet" href="assets/css/mon_css.css" />
                                                  		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
                                                  	</head>
                                                  	<body class="is-preload">
                                                  		<h1><CENTER>Les ruches de Gilles</CENTER></h1>
                                                  		<div id="wrapper">
                                                  			<div id="main">
                                                  				<div class="inner">
                                                   						<header id="header">
                                                  						<a href="indextest.php" class="logo"><strong>Recharger cette page</strong></a>
                                                  					</header>
                                                  					<section>
                                                  						<header class="main">
                                                  							<h4><strong>Nous sommes le <span id="heure_exacte"></span></strong></h4>
                                                  							<span class="image main"><img src="images/ruche.png" alt="" /></span>
                                                  						</header>
                                                  						<h1>Dernières données remontées test</h1>
                                                  						<script>
                                                  							window.onload = function() {
                                                  								setInterval("dateEtHeure()", 1000);
                                                  							};
                                                  						</script>
                                                  <?php
                                                  	error_reporting(E_ALL);
                                                  	ini_set('display_errors', TRUE);
                                                  	ini_set('display_startup_errors', TRUE);
                                                  	
                                                  	$sDatabase = 'ruches';
                                                  	$sHostIP = '127.0.0.1';
                                                  	$sUser = 'user';
                                                  	$sPwd = 'password';
                                                  	$sDSN = 'mysql:dbname='.$sDatabase.';host='.$sHostIP;
                                                  	
                                                  	// Connexion MySQL
                                                  	try {
                                                  		$bdd = new PDO($sDSN, $sUser, $sPwd);
                                                  		// Activation des erreurs PDO
                                                  		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                                  		// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                                  		$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                                  	}
                                                  	catch (PDOException $e) {
                                                  		echo 'Connexion échouée : ' . $e->getMessage();
                                                  	}
                                                  	
                                                  	// Liste de toutes les ruches
                                                  	$requete = $bdd->query('SELECT * FROM Liste_ruches');
                                                  	$ruches = $requete->fetchAll();
                                                  	$nbRuches = count( $ruches );
                                                  	
                                                  	// numéro de page (1 par défaut)
                                                  	$page = 1;
                                                  	if( !empty( $_GET['page'] ) ) {
                                                  		$page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                                                  	}
                                                  	// limite (30 par défaut)
                                                  	$limite = 30;
                                                  	if( !empty( $_GET['limite'] ) ) {
                                                  		$limite = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 30;
                                                  	}
                                                  	
                                                  	$requete = $bdd->prepare('
                                                  		SELECT
                                                  			DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,
                                                  			M.id_ruche,
                                                  			MH.temperature,
                                                  			ROUND(AVG(M.mas),2) AS poids
                                                  		FROM
                                                  			Telemesures_ruches M
                                                  				INNER JOIN (
                                                  						-- Moyennes temperature
                                                  						SELECT
                                                  							DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                  							ROUND(AVG(tex),1) AS temperature
                                                  						FROM Telemesures_ruches
                                                  						GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" )
                                                  				) AS MH
                                                  				ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                                  		GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                                  		ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC
                                                  		LIMIT :limit OFFSET :offset;'
                                                  	);
                                                  	$requete->bindValue('limit', ($limite * $nbRuches), PDO::PARAM_INT);
                                                  	$requete->bindValue('offset', ($limite * $nbRuches)*($page-1), PDO::PARAM_INT);
                                                  	$requete->execute();
                                                  	$mesures = $requete->fetchAll();
                                                  	
                                                  	// Si il y a des ruches et des mesures on affiche le tableau
                                                  	// Sinon on affiche un message "aucune données"
                                                  	if( count( $ruches ) && count( $mesures ) ) {
                                                  ?>
                                                  						<table>
                                                  							<thead>
                                                  								<tr>
                                                  									<th>Dates</th>
                                                  									<th>T° rucher</th>
                                                  <?php
                                                  		// Une entête de colonne par ruche
                                                  		foreach( $ruches as $ruche ) {
                                                  ?>
                                                  									<th><?= $ruche['nom']; ?></th>
                                                  <?php
                                                  		}
                                                  ?>
                                                  								</tr>
                                                  							</thead>
                                                  							<tbody>
                                                  <?php
                                                  		// On construit le tableau 2D
                                                  		$donnees = array();
                                                  		$moyennes = array();
                                                  		foreach( $mesures as $mesure ) {
                                                  			$moyennes[$mesure['horodatage']] = $mesure['temperature'];
                                                  			$donnees[$mesure['horodatage']][$mesure['id_ruche']] = $mesure['poids'];
                                                  		}
                                                  	
                                                  		// On boucle sur le 2D pour afficher les lignes
                                                  		foreach ( $donnees as $date => $mesures ) {
                                                  			$moyenne = $moyennes[$date];
                                                  ?>
                                                  								<tr>
                                                  									<td><?= $date; ?></td>
                                                  									<td><?= $moyenne.'°C'; ?></td>
                                                  <?php
                                                  			foreach( $ruches as $ruche ) {
                                                  ?>
                                                  									<td>
                                                  <?php
                                                  				foreach( $mesures as $id => $valeur ) {
                                                  					if( $id == $ruche['id_ruche'] ) echo $valeur.' Kg';
                                                  				}
                                                   
                                                  			}
                                                  ?>
                                                  									</td>
                                                  <?php
                                                  		}
                                                  ?>
                                                  								</tr>
                                                  							</tbody>
                                                  						</table>
                                                  						<div id="scrollUp">
                                                  							<a href="#top"><img src="images/to_top.png"/></a>
                                                  						</div>
                                                  <?php
                                                  	} else {
                                                  ?>
                                                  						<p>Aucune données à afficher.</p>
                                                  <?php
                                                  	}		   
                                                   	include "menutest.php";
                                                  ?>
                                                  					</section>
                                                  				</div>
                                                  			</div>
                                                  		</div>
                                                  		<script src="assets/js/mon_javascript.js"></script>
                                                  	</body>
                                                  </html>
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                    28 juin 2022 à 17:52:55

                                                    Oui pour le calcul un count sur le résultat, mais cela veut donc dire qu'il risque de varier à chaque interval de limite à offset... (comme avec le temps)

                                                    Il peut arriver de façon "normale" qu'une ruche n'ai pas de point horaire d'affiché , si celle-ci a été en panne durant toute l'heure à afficher,.

                                                    Mais là par contre des données existent, mais elles sont par exemple arrivées après ce que prend la requête pourtant il y a bien des points de stockés sur les ruches vides (1,2,4 et 5 dans l'image d'exemple) sur le créneau 17-16h c'est simplement parce que les heures d'arrivées des infos des ruches manquantes est arrivé un ou 2 points plus tard..

                                                    Par exemple avec actuellement $limite à 360 en dernière ligne je n'ai que la ruche 2, les autres sont vides!

                                                    Mais avec limite = 362 il ne manque que la ruche 4 et 5 et avec limite =364 j'ai des valeurs sur mes 5 ruches, sur le point de 16h et avec limite =366 je passe au point horaire de 16h avec uniquement des valeurs pour la ruche 1 et 4.

                                                    J'espère avoir été plus clair...

                                                    Merci

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      28 juin 2022 à 18:11:10

                                                      Je pense que mon message précédent est passé à la trappe :)

                                                      J'ai d'ailleurs oublié d'inclure dans le code proposé la gestion de la pagination (boutons et pages) :

                                                      <!DOCTYPE HTML>
                                                      <html lang="fr">
                                                      	<head>
                                                      		<title>Les ruches de Gilles</title>
                                                      		<meta charset="utf-8" />
                                                      		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
                                                      		<link rel="stylesheet" href="assets/css/main.css" />
                                                      		<link rel="stylesheet" href="assets/css/mon_css.css" />
                                                      		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
                                                      	</head>
                                                      	<body class="is-preload">
                                                      		<h1><CENTER>Les ruches de Gilles</CENTER></h1>
                                                      		<div id="wrapper">
                                                      			<div id="main">
                                                      				<div class="inner">
                                                      					   <header id="header">
                                                      						<a href="indextest.php" class="logo"><strong>Recharger cette page</strong></a>
                                                      					</header>
                                                      					<section>
                                                      						<header class="main">
                                                      							<h4><strong>Nous sommes le <span id="heure_exacte"></span></strong></h4>
                                                      							<span class="image main"><img src="images/ruche.png" alt="" /></span>
                                                      						</header>
                                                      						<h1>Dernières données remontées test</h1>
                                                      						<script>
                                                      							window.onload = function() {
                                                      								setInterval("dateEtHeure()", 1000);
                                                      							};
                                                      						</script>
                                                      <?php
                                                      	error_reporting(E_ALL);
                                                      	ini_set('display_errors', TRUE);
                                                      	ini_set('display_startup_errors', TRUE);
                                                      	 
                                                      	$sDatabase = 'ruches';
                                                      	$sHostIP = '127.0.0.1';
                                                      	$sUser = 'user';
                                                      	$sPwd = 'password';
                                                      	$sDSN = 'mysql:dbname='.$sDatabase.';host='.$sHostIP;
                                                      	 
                                                      	// Connexion MySQL
                                                      	try {
                                                      		$bdd = new PDO($sDSN, $sUser, $sPwd);
                                                      		// Activation des erreurs PDO
                                                      		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                                      		// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
                                                      		$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                                                      	}
                                                      	catch (PDOException $e) {
                                                      		echo 'Connexion échouée : ' . $e->getMessage();
                                                      	}
                                                      	 
                                                      	// Liste de toutes les ruches
                                                      	$requete = $bdd->query('SELECT * FROM Liste_ruches');
                                                      	$ruches = $requete->fetchAll();
                                                      	$nbRuches = count( $ruches );
                                                      	 
                                                      	// numéro de page (1 par défaut)
                                                      	$page = 1;
                                                      	if( !empty( $_GET['page'] ) ) {
                                                      		$page = $_GET['page'] > 0 ? intval( $_GET['page'] ) : 1;
                                                      	}
                                                      	// limite (30 par défaut)
                                                      	$limite = 30;
                                                      	if( !empty( $_GET['limite'] ) ) {
                                                      		$limite = $_GET['limite'] > 0 ? intval( $_GET['limite'] ) : 30;
                                                      	}
                                                      	
                                                      	$requete = $bdd->query('
                                                      		SELECT
                                                      			DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,
                                                      			M.id_ruche,
                                                      			MH.temperature,
                                                      			ROUND(AVG(M.mas),2) AS poids
                                                      		FROM
                                                      			Telemesures_ruches M
                                                      				INNER JOIN (
                                                      						-- Moyennes temperature
                                                      						SELECT
                                                      							DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                      							ROUND(AVG(tex),1) AS temperature
                                                      						FROM Telemesures_ruches
                                                      						GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" )
                                                      				) AS MH
                                                      				ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                                      		GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                                      		ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC;'
                                                      	);
                                                      	$mesures = $requete->fetchAll();
                                                      	$nbMesures = count( $mesures );
                                                      	$nbPages = ceil( $nbMesures / ( $limite * $nbRuches ) );
                                                      	 
                                                      	$requete = $bdd->prepare('
                                                      		SELECT
                                                      			DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,
                                                      			M.id_ruche,
                                                      			MH.temperature,
                                                      			ROUND(AVG(M.mas),2) AS poids
                                                      		FROM
                                                      			Telemesures_ruches M
                                                      				INNER JOIN (
                                                      						-- Moyennes temperature
                                                      						SELECT
                                                      							DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                      							ROUND(AVG(tex),1) AS temperature
                                                      						FROM Telemesures_ruches
                                                      						GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" )
                                                      				) AS MH
                                                      				ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                                      		GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                                      		ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC
                                                      		LIMIT :limit OFFSET :offset;'
                                                      	);
                                                      	$requete->bindValue('limit', $limite * $nbRuches, PDO::PARAM_INT);
                                                      	$requete->bindValue('offset', $limite * $nbRuches * ( $page - 1 ), PDO::PARAM_INT);
                                                      	$requete->execute();
                                                      	$mesures = $requete->fetchAll();
                                                      	 
                                                      	// Si il y a des ruches et des mesures on affiche le tableau
                                                      	// Sinon on affiche un message "aucune données"
                                                      	if( count( $ruches ) && count( $mesures ) ) {
                                                      ?>
                                                      						<table>
                                                      							<thead>
                                                      								<tr>
                                                      									<th>Dates</th>
                                                      									<th>T° rucher</th>
                                                      <?php
                                                      		// Une entête de colonne par ruche
                                                      		foreach( $ruches as $ruche ) {
                                                      ?>
                                                      									<th><?= $ruche['nom']; ?></th>
                                                      <?php
                                                      		}
                                                      ?>
                                                      								</tr>
                                                      							</thead>
                                                      							<tbody>
                                                      <?php
                                                      		// On construit le tableau 2D
                                                      		$donnees = array();
                                                      		$moyennes = array();
                                                      		foreach( $mesures as $mesure ) {
                                                      			$moyennes[$mesure['horodatage']] = $mesure['temperature'];
                                                      			$donnees[$mesure['horodatage']][$mesure['id_ruche']] = $mesure['poids'];
                                                      		}
                                                      	 
                                                      		// On boucle sur le 2D pour afficher les lignes
                                                      		foreach ( $donnees as $date => $mesures ) {
                                                      			$moyenne = $moyennes[$date];
                                                      ?>
                                                      								<tr>
                                                      									<td><?= $date; ?></td>
                                                      									<td><?= $moyenne.'°C'; ?></td>
                                                      <?php
                                                      			foreach( $ruches as $ruche ) {
                                                      ?>
                                                      									<td>
                                                      <?php
                                                      				foreach( $mesures as $id => $valeur ) {
                                                      					if( $id == $ruche['id_ruche'] ) echo $valeur.' Kg';
                                                      				}
                                                        
                                                      			}
                                                      ?>
                                                      									</td>
                                                      <?php
                                                      		}
                                                      ?>
                                                      								</tr>
                                                      							</tbody>
                                                      						</table>
                                                      						<div id="scrollUp">
                                                      							<a href="#top"><img src="images/to_top.png"/></a>
                                                      						</div>
                                                      						<p>Page <?= $page; ?> sur <?= $nbPages; ?></p>
                                                      <?php
                                                      		if( $page > 1 ) {
                                                      ?>
                                                      						<p style="float: left;">
                                                      							<a href="?ruche=<?= $ruche; ?>&page=<?= $page - 1; ?>&p=donneestest"><img src="images/fleche_gauche_rouge.png"/></a>
                                                      						</p>
                                                      <?php
                                                      		}
                                                      		if( $page < $nbPages ) {
                                                      ?>
                                                      						<p style="float: right;">
                                                      							<a href="?ruche=<?= $ruche; ?>&page=<?= $page + 1; ?>&p=donneestest"><img src="images/fleche_droite_rouge.png"/></a>
                                                      						</p>
                                                      <?php
                                                      		}
                                                      	} else {
                                                      ?>
                                                      						<p>Aucune données à afficher.</p>
                                                      <?php
                                                      	}	      
                                                         include "menutest.php";
                                                      ?>
                                                      					</section>
                                                      				</div>
                                                      			</div>
                                                      		</div>
                                                      		<script src="assets/js/mon_javascript.js"></script>
                                                      	</body>
                                                      </html>

                                                      -
                                                      Edité par Benzouye 28 juin 2022 à 18:11:39

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                        29 juin 2022 à 12:52:21

                                                        OUA ouh!

                                                        Super! merci.

                                                        J'ai testé et essayé de comprendre mais j'avoue que les requêtes avec jointures j'ai vraiment du mal...

                                                        j'ai juste supprimé des boutons flèches ceci : ruche=<?= $ruche; ?>&

                                                        Il y a le même disfonctionnement que moi sur la dernière (et parfois ici première) ligne d'affichage il manque des données sur certaines ruches :

                                                        exemple haut de page:

                                                        exemple bas de page précédente pour le créneau 29/04 20h00 on a parfois de chiffres ou non selon la page ou l'on est...

                                                        alors que j'ai bien des valeurs mais pas à 20h00..

                                                        J'avoue que j'ai du mal à cerner le problème vu de que je n'ai toujours pas complètement saisi le fonctionnement de ta requête, elle ne doit pas prendre la moyenne sur l'ensemble d'une heure non?

                                                        Merci

                                                        -
                                                        Edité par GillesMangin-Voirin 29 juin 2022 à 12:54:33

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          29 juin 2022 à 13:51:25

                                                          Pour comprendre pourquoi l'affichage est parfois incomplet pour une tranche horaire, il faut regarder ce que retourne la requête.

                                                          Met-toi sur PHPMyAdmin, et exécute la requête avec des valeurs forcées :

                                                                  SELECT
                                                                      DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) AS horodatage,
                                                                      M.id_ruche,
                                                                      MH.temperature,
                                                                      ROUND(AVG(M.mas),2) AS poids
                                                                  FROM
                                                                      Telemesures_ruches M
                                                                          INNER JOIN (
                                                                                  -- Moyennes temperature
                                                                                  SELECT
                                                                                      DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" ) AS point_horaire,
                                                                                      ROUND(AVG(tex),1) AS temperature
                                                                                  FROM Telemesures_ruches
                                                                                  GROUP BY DATE_FORMAT( horodatage, "%d-%m-%Y %H:00" )
                                                                          ) AS MH
                                                                          ON DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ) = MH.point_horaire
                                                                  GROUP BY DATE_FORMAT( M.horodatage, "%d-%m-%Y %H:00" ), M.id_ruche, MH.temperature
                                                                  ORDER BY DATE_FORMAT( M.horodatage, "%Y-%m-%d %H:00" ) DESC
                                                                  LIMIT 24 OFFSET 0;

                                                          Ici, je pars avec une limite de 24 (6 ruches pour 4 heures) et un offset de 0 (page 1).

                                                          Cette requête va donc retourner 24 lignes en partant de la première (0). Le code PHP va les regrouper sur 4 lignes (une par heure), ou plus ... si il y a des ruches absentes sur les 4 dernières heures, alors tu auras des trous dans les 4 premières lignes, mais tu auras une ligne pour la 5ème heure, avec quelques valeurs ...

                                                          Puis fais varier l'OFFSET avec des multiples de 24 :

                                                          // Page 1
                                                          LIMIT 24 OFFSET 0
                                                          // Page 2
                                                          LIMIT 24 OFFSET 24
                                                          // Page 3
                                                          LIMIT 24 OFFSET 48
                                                          // Page 4
                                                          LIMIT 24 OFFSET 72
                                                          // Page 5
                                                          LIMIT 24 OFFSET 96

                                                          Ce te permet de VOIR ce qui se passe derrière le code.

                                                          Pour ordonner les "trous" tu peux déjà rajouter id_ruche dans la clause ORDER BY, après l'horodatage.

                                                          Si cela te pose vraiment problème d'avoir des trous et des lignes incomplètes, alors il faut réfléchir à une tout autre requête, plus complexe encore, utilisant la fonction PIVOT ... mais cela n'est pas possible avec MySQL ...

                                                          -
                                                          Edité par Benzouye 29 juin 2022 à 14:00:42

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                                            29 juin 2022 à 15:43:45

                                                            Bon, alors voici ce que donne le requeteur en 39 secondes . (pour info actuellement il n' a que 5 ruches pas 6):

                                                            horodatage       id_ruche  temperature    poids
                                                            29-06-2022 14:00      3      28.7        42.42
                                                            29-06-2022 14:00      1      28.7        57.95
                                                            29-06-2022 14:00      5      28.7        64.72
                                                            29-06-2022 14:00      2      28.7        42.80
                                                            29-06-2022 14:00      4      28.7        36.71
                                                            29-06-2022 13:00      4      33.3        36.70
                                                            29-06-2022 13:00      5      33.3        64.76
                                                            29-06-2022 13:00      1      33.3        57.99
                                                            29-06-2022 13:00      3      33.3        42.49
                                                            29-06-2022 13:00      2      33.3        42.80
                                                            29-06-2022 12:00      3      32.5        42.50
                                                            29-06-2022 12:00      1      32.5        58.19
                                                            29-06-2022 12:00      2      32.5        42.80
                                                            29-06-2022 12:00      5      32.5        64.80
                                                            29-06-2022 12:00      4      32.5        36.71
                                                            29-06-2022 11:00      5      34.1        64.83
                                                            29-06-2022 11:00      2      34.1        42.80
                                                            29-06-2022 11:00      3      34.1        42.50
                                                            29-06-2022 11:00      4      34.1        36.70
                                                            29-06-2022 11:00      1      34.1        58.17
                                                            29-06-2022 10:00      2      32.2        42.74
                                                            29-06-2022 10:00      4      32.2        36.76
                                                            29-06-2022 10:00      5      32.2        65.00
                                                            29-06-2022 10:00      1      32.2        58.25
                                                            

                                                            De suite me revient aussi la question : quelle est la valeur prise sur la température moyenne pour la ruche 5 dont le capteur est en panne? la dernière valide? ou aucune si valeur NULL ?

                                                            Bon j'ai pas mal regardé ce que donne les résultats, je ne vais mettre que les observations qui me semblent les plus pertinentes.

                                                            Tout d'abord surprise pour moi, j'avais la page suivante : (je me suis dis maintenant il est 15h et peu de minutes si je réactualise la page je vais récupérer les télémesures manquantes du 25/06 alors qu'elle sont bien dans la table (je pensais que cela dépendait de l'heure du lancement de la requête..)

                                                            Résultat après rafraichissement :

                                                            Le poids moyen de la ruche 2 a disparu mais celui de la ruche 1 est apparu..

                                                            j'ai réactualisé une fois encore et je perdu le poids de la ruche 1, mais la ruche 2 est réapparue (jamais les 3,4 et 5)...

                                                            Côté requêteur j'ai trouvé les résultats de ces requêtes qui pourraient peut-être amener à un début d'explication en fin de requête on a parfois pas le résultats de toutes les ruches...

                                                            Ci dessus juste pour le point de 15 h la ruche 1

                                                            Ci dessous en fin de requête juste pour le point de 20h les ruches 4 et 5

                                                            Du coup je pense que les soucis d'affichage qui ce présente soit en début ou en fin sont du au fait que la requête est paramétrée sur un nombre fixe de données à afficher sans prendre en compte que chaque point ai au moins une valeur de  chaque ruche dans le créneau horaire...

                                                            J'espère que cela va te mettre sur une piste pour mon soucis...

                                                            Merci

                                                            -
                                                            Edité par GillesMangin-Voirin 29 juin 2022 à 15:48:29

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              29 juin 2022 à 18:08:54

                                                              GillesMangin-Voirin a écrit:

                                                              quelle est la valeur prise sur la température moyenne pour la ruche 5 dont le capteur est en panne?

                                                              La température moyenne est calculée par la sous-requête (dans le JOIN). C'est la moyenne pour toutes les mesures de tex (non NULL), toutes ruches confondues, pour la tranche horaire. Nous avions convenu cela ensemble il y quelques temps, où tu m'avais dis que de toute façon, les ruches étant proches les unes des autres, cette moyenne était acceptable. C'est pour cela que pour une heure donnée, toutes les ruches affichent la même moyenne de température.

                                                              GillesMangin-Voirin a écrit:

                                                              j'ai réactualisé une fois encore et je perdu le poids de la ruche 1, mais la ruche 2 est réapparue (jamais les 3,4 et 5)...

                                                              Oui, sans condition de tri (ORDER BY) claire, il est possible que les lignes remontent "aléatoirement" avec le LIMIT ... Comme je te le disais :

                                                              Benzouye a écrit:

                                                              Pour ordonner les "trous" tu peux déjà rajouter id_ruche dans la clause ORDER BY, après l'horodatage.

                                                              GillesMangin-Voirin a écrit:

                                                              je pense que les soucis d'affichage qui ce présente soit en début ou en fin sont du au fait que la requête est paramétrée sur un nombre fixe de données à afficher sans prendre en compte que chaque point ai au moins une valeur de chaque ruche dans le créneau horaire

                                                              Bah oui ... cela fais 3 messages que j'essaye de te l'expliquer :p

                                                              Soit tu veux un nombre de lignes fixes et tu peux paginer avec LIMIT et OFFSET, et tu pourras alors déterminer le nombre total de pages.

                                                              Soit tu veux un intervalle de temps précis et complet et tu pagineras avec des conditions sur horodatage, mais tu ne pourras pas déterminer le nombre total de pages.

                                                              Mais la combinaison des deux n'est pas possible.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                                                              Mise à jour requête suite à action utilisateur

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown