PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 26-10-2017 14:32:20

LE CARROU
Membre
Inscription : 26-10-2017
Messages : 8

Affichage page par page

Bonjour

je débute en programmation et encore plus en PHP/MySQL.
je suis tombé sur le Tutoriel écrit par Flyingcow qui correspond à ce que je veux faire.
Le tutoriel date un peu et je l'ai adapté pour prendre en compte le PDO.
Malgré les explications pas à pas de Flyingcow, je n'obtient pas le résultat voulu (premier code sans les fonctions).

Je comprend globalement le code et le code ne plante (c'est déjà çà).
Mais il affiche constamment la première page avec les 5 premiers enregistrements.
Pourtant, dans la barre URL, je passe bien de http://localhost/tests/affichage_pages.php à http://localhost/tests/affichage_pages.php?limite=5.
Cependant, les valeurs des différentes variables ne changent pas :
$limite=5
$limitesuivante=5
$limiteprecedente=-5

J'ai essayé de lire le second code mais j'ai un peu de mal pour le moment avec les fonctions et surtout, j'aimerais comprendre le premier code avant d'attaquer le deuxième.

Si quelqu'un peut m'aider à comprendre ce code ce serait super !

Alors voici mon code modifié en PDO :


<html>
<body>
<?php
// information pour la connection à le DB
//$host = 'localhost';
//$user = 'root';
//$pass = '';
//$db = 'test';

// initialisation des variables
$nombre = 5;  // on va afficher 5 résultats par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois on met limite à 0.
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts['basename'];

echo 'nombre par page : ' . $nombre . '</br>';
echo 'limite : ' . $limite . '</br>';

// connection à la DB
//$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
//mysql_select_db($db) or die ('Erreur :'.mysql_error());

try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

// compte le nombre d'enregistrement total de la table
$select = 'SELECT count(id) FROM vaches';
//$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$result = $bdd->query($select);
$row = $result -> fetch();
$total = $row[0];

// requête SQL qui ne prend que le nombre d'enregistrements nécessaire à l'affichage.
$select = 'select prenom,surnom FROM vaches ORDER BY prenom ASC limit '.$limite.','.$nombre;
$result = $bdd->query($select);


// calcul des limites précédent/suivant
$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;

echo 'limite : ' . $limitesuivante . '</br>';
echo 'limite : ' . $limiteprecedente . '</br>';

// affichage du lien précédent si besoin
if($limite != 0) {
echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a>';
}


// affichage du lien suivant si besoin
if($limitesuivante < $total) {
    echo '<a href="'.$page.'?limite='.$limitesuivante.'">Page Suivante</a>';
}

// si on a récupéré un résultat on l'affiche.
if($total) {
    // début du tableau
    echo '<table bgcolor="#FFFFFF">'."\n";
        // première ligne on affiche les titres prénom et surnom dans 2 colonnes
        echo '<tr>';
        echo '<td bgcolor="#669999"><b><u>Prénom</u></b></td>';
        echo '<td bgcolor="#669999"><b><u>Surnom</u></b></td>';
        echo '</tr>'."\n";
    // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
    while($row = $result -> fetch()) {
        echo '<tr>';
        echo '<td bgcolor="#CCCCCC">'.$row['prenom'].'</td>';
        echo '<td bgcolor="#CCCCCC">'.$row['surnom'].'</td>';
        echo '</tr>'."\n";
    }
    echo '</table>'."\n";
    // fin du tableau.
}
else echo 'Pas d\'enregistrements dans cette table...';

// on libère le résultat
unset($result);

?>
</body>
</html>
 

Hors ligne

#2 26-10-2017 19:37:13

tof73
Membre
Inscription : 21-12-2014
Messages : 156
Site Web

Re : Affichage page par page

c'est
if (!isset($limite)) $limite = 0;
qui ne fonctionne plus depuis longtemps comme espéré. au début de php, pour accéder à une variable limite passée en méthode get, il suffisait de faire $limite. ce n'est plus le cas, il faut utiliser le tableau $_GET

Hors ligne

#3 27-10-2017 07:53:58

LE CARROU
Membre
Inscription : 26-10-2017
Messages : 8

Re : Affichage page par page

Bonjour et merci pour ta réponse.

En trainant sur les forums, j'ai trouvé nue solution apportée par Bouchon et qui confirme ce que tu dis.
La correction proposée (cf ci-dessous) est presque fonctionnelle sauf lorsque l'on arrive sur la première page ou j’obtiens le message d'erreur :

Notice: Undefined index: limite in C:\wamp64\www\tests\affichage_pages.php on line 25

ensuite, tout fonctionne normalement.
après quelque lecture sur les forums, j'ai essayé de remplacer :
$limite = trim($_REQUEST['limite']);
par
if (isset($_REQUEST['limite']))
{
    $limite = trim($_REQUEST['limite']);
}

mais çà ne change rien

une idée ?

*******************************************
correction par Bouchon
remplacer :
if (!isset($limite)) $limite = 0; //si premier acces a la page

par :
// On récupère l'argument "limite"
$limite = trim($_REQUEST['limite']);
   
// On vérifie qu'il s'agit bien d'un entier
if(ctype_digit($limite)==FALSE)
{
// Il ne s'agit pas d'un entier, ou il n'y a tout simplement pas de valeur
// ==> On utilise une valeur par défaut
$limite = 0;
}

Hors ligne

#4 10-11-2017 09:34:32

LE CARROU
Membre
Inscription : 26-10-2017
Messages : 8

Re : Affichage page par page

Bonjour,

avec beaucoup de retard, je post pcq j'ai trouvé une solution depuis (cf code ci-dessous) avec l'auteur du tuto qui m'a servi (Ymox sur Zeste de savoir).
merci à tof73 pour son aide


<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();

?>


<!DOCTYPE html>

<html>

    <head>

        <meta charset="utf-8" />
        <link rel="stylesheet" href="style.css" />
        <title>Mereva</title>

    </head>

    <body>
       
        <!--début du bloc page-->
        <div id="page">

            <!-- En-tête -->
            <div class="element_page">
                <?php include("entete.php"); ?>
            </div>

            <!-- Le corps -->
            <div class="element_page">
                <div id="corps">
                   
                    <?php include("menus.php"); ?>
                    <!--Tableau avec le contenu de la table GBD_DAT-->
                               
                    <div id='element_tableau'>
                      <div id="tableau">

              <?php

              //*******************************************************************
              //affichage page par page tutoriel Ymox sur le site Zeste de Savoir
              //https://zestedesavoir.com/tutoriels/351/paginer-avec-php-et-mysql/

              //*******************************************************************
             

              //*Connexion à la base de données
                        //*OpenCLassroom "Concevez votre site web avec php et MySql"  
                        try
              {
              // On se connecte à MySQL
              $bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
              }
              catch(Exception $e)
              {
              // En cas d'erreur, on affiche un message et on arrête tout
              die('Erreur : '.$e->getMessage());
              }

              $limite = 15;
              $page = (!empty($_GET['page']) ? $_GET['page'] : 1);
              $debut = ($page - 1) * $limite;


              // Partie "Requête"
              /* On calcule donc le numéro du premier enregistrement ; SQL_CALC_FOUND_ROWS compte le nombre d'enregistrements*/
              /*sans tenir compte du critère limit*/
              $sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM `gbd_dat` LIMIT :limite OFFSET :debut';
              $query = ($sql);
              /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
              $query = $bdd->prepare($query);
              /* 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. */
              $query->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
              );
              $query->bindValue(
              'debut',         // Le marqueur est nommé « début »
              $debut,         // Il doit prendre la valeur de la variable $debut
              PDO::PARAM_INT   // Cette valeur est de type entier
              );

              /* Maintenant qu'on a lié la valeur à la requête, on peut l'exécuter pour en récupérer le résultat */
              $resultSet = $query->execute();

              /* Ici on récupère le nombre d'éléments total. Comme c'est une requête, il ne
              * faut pas oublier qu'on ne récupère pas directement le nombre.
              * De plus, comme la requête ne contient aucune donnée client pour fonctionner,
              * on peut l'exécuter ainsi directement */
              $resultFoundRows = $bdd->query('SELECT found_rows()');
              /* On doit extraire le nombre du jeu de résultat */
              $nombredElementsTotal = $resultFoundRows->fetchColumn();

              // début du tableau
              echo '<table>'."\n";
              // première ligne on affiche les titres prénom et surnom dans 2 colonnes
              echo '<tr class="class01">';
              echo '<td class="ID">#ID</td>';
              echo '<td class="Patient">Patient</td>';
              echo '<td class="Fiche">Fiche</td>';
              echo '<td class="Question">Question</td>';
              echo '<td class="Description">Description</td>';
              echo '<td class="Details">Details</td>';
              echo '<td class="Correction">Corrections</td>';
              echo '<td class="NR">NR</td>';
              echo '<td class="Commentaires">Commentaires</td>';
              echo '</tr>'."\n";

              // Partie "Boucle"
              // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.    
              while($element= $query -> fetch()) {
              echo '<tr class="class02">';
              echo '<td class="ID">'.$element['id'].'</td>';
              echo '<td class="Patient">'.$element['pat'].'</td>';
              echo '<td class="Fiche">'.$element['fic'].'</td>';
              echo '<td class="Question">'.$element['que'].'</td>';
              echo '<td class="Description">'.$element['des'].'</td>';
              echo '<td class="Details">'.$element['det'].'</td>';
              echo '<td class="Correction">'.$element['cor'].'</td>';
              echo '<td class="NR">'.$element['non_rec'].'</td>';
              echo '<td class="Commentaires">'.$element['com'].'</td>';
              echo '</tr>'."\n";
              }
              echo '</table>'."\n";
              // fin du tableau.

              // on libère le résultat
              //unset($resultSet);
             
              ?>

            <!--fin du bloc tableau-->  
            </div>
                         
                      <?php
                      $query->closeCursor();
                      ?>

                    <!--fin du bloc element_tableau-->
                    </div>

                <!--fin du bloc corps-->
                </div>

            <!--fin du bloc element_page correspondant au CORPS-->
            </div>

            <div class="element_page">
              <!--// Partie "Filtres"-->
        <div id='filtres'>
            <form action="demande_de_corrections_page_filtres.php" method="get">
                    <select onselect="this.form.submit()" name="patient" id="patient">
                    <?php
                    $sql="SELECT DISTINCT pat, fic FROM gbd_dat ORDER BY pat";
                    $result = $bdd->query($sql);
                    while ($donnees = $result->fetch(PDO::FETCH_ASSOC))
                    {
                    ?>
                    <option value="<?php echo $donnees['pat'];?>"><?php echo $donnees['pat'];?></option>
                    <?php
                    }
                    ?>
                    </select>
                    <select onselect="this.form.submit()" name="fiche" id="fiche">
                    <?php
                    $sql="SELECT DISTINCT pat, fic FROM gbd_dat ORDER BY pat";
                    $result = $bdd->query($sql);
                    while ($donnees = $result->fetch(PDO::FETCH_ASSOC))
                    {
                    ?>
                    <option value="<?php echo $donnees['fic'];?>"><?php echo $donnees['fic'];?></option>
                    <?php
                    }
                    ?>
                    </select>
            <input type="submit" value="Valider" />                            
              </form>
          </div>

           <!--// Partie "Liens"-->
         
        <div id='liens'>

            <?php
          /* On calcule le nombre de pages */
          $nombreDePages = ceil($nombredElementsTotal / $limite);

          /* 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 l'afficher que si on est sur une autre
          * page que la première */
          if ($page > 1):
          ?><a href="?page=<?php echo $page - 1; ?>">Précédente</a> - <?php
          endif;

          /* On va effectuer une boucle autant de fois que l'on a de pages */
          for ($i = 1; $i <= $nombreDePages; $i++):
          ?><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a> <?php
          endfor;

          /* 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 < $nombreDePages):
          ?>- <a href="?page=<?php echo $page + 1; ?>">Suivante</a><?php
          endif;
          ?>        
            </div>
        </div>

            <!-- Le pied de page -->
            <div class="element_page">
            <div id="pied_de_page"/>
            <?php include("pied_de_page.php"); ?>
            </div>
            </div>

        <!--fin du bloc page-->
        </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <!-- jQuery est inclus ! -->
   <script>

        jQuery(document).ready(function(){
        // Du code en jQuery va pouvoir être tapé ici !
        console.log("jQuery est prêt !");
    });


   

   </script>
    </body>

</html>

Hors ligne

Pied de page des forums