8768 sujets

Développement web côté serveur, CMS

Bonjour à tous...

J'ai créé pour un gîte une page "tourisme.php" qui affiche les activités à faire dans la région. La partie qui affiche les données en provenance d'une base de données fonctionne parfaitement, y compris le filtre par type d'activité...

Si je post ici c'est que je ne sais pas comment m'y prendre pour n'afficher que 4 activités par page et afficher en bas de page un index qui ressemble à << 1 2 3 >> selon le nombre de pages nécessaires...

Si je pars sur une boucle FOR avec une variable globale en guise de compteur, j'ai bon ?
Ça me semble pas être la bonne méthode !

Voici déjà en tout cas mon bout de code qui fonctionne :

<?php                            
while ($data=$req->fetch(PDO::FETCH_OBJ)) { ?>
<img src="gestion/photos/<?= $data->photo ;?>" alt="" title="" width="244" height="196" />
<div>
    <?= $data->type ;?>  |  <?= $data->kms ;?> / <?= $data->temps ;?>
</div>
<h2>
    <?= $data->titre ;?>
</h2>
<p style="text-align:justify;">
    <?= $data->infos ;?>
</p>
<?php
} 
?>




<ul class="pagination">
     <!--<li class="first"><a href="#">Newer posts</a></li>-->
     <li class="active"><a href="#">1</a></li>
     <li><a href="#">2</a></li>
     <li><a href="#">3</a></li>
     <li><a href="#">4</a></li>
     <li><a href="#">5</a></li>
     <li><a href="#">6</a></li>
     <li><a href="#">7</a></li>
     <li><a href="#">8</a></li>
     <li class="last"><a href="#">Anciens messages</a></li>
</ul>

MERCI d'avance pour vos conseils
Modifié par etienne69 (03 Mar 2015 - 23:34)
J'suis parti sur un truc comme ça :

$sql = 'SELECT * FROM tourisme ORDER BY titre';
// Exécution :
$req = $DB->query($sql);
$count = $req->rowCount();
$nombreDePages = ceil($count/4);


et pour le bas de page :
<?php
if($nombreDePages > 1) {
     echo '<ul class="pagination">'; 
     for ($i = 1 ; $i <= $nombreDePages ; $i++) {
          echo '<li><a href="tourisme.php?page=' . $i . '">' . $i . '</a></li>';
     }
     echo '</ul>'; 
}?>


Me reste plus que :
- le while et ma requête SQL (+ fonction LIMIT) en fonction de la page sur laquelle se
trouve l'utilisateur... Smiley sweatdrop
- La gestion du CSS pour le lien "page active" ! Smiley langue
Modifié par etienne69 (01 Mar 2015 - 20:03)
Modérateur
Bonjour c'est un peu le principe de base en PHP, oui.

Sinon pour le compte:


$count = $DB->query('select count(*) from tourisme')->fetchColumn();

C'est plus optimisé car cela évite de ramener * (toutes les colonnes) dans la query alors qu'on ne les utilise pas.
Merci Kustolovic pour ton aide, j'va essayer ta méthode de comptage....


Entre temps, j'ai bossé ! ! ! Presque tout fonctionne...
Je me suis aidé d'un tuto trouvé sur Internet pour un livre d'or, il était en Php/Sql "classique",
je l'ai adapté à mon PDO...

J'ai encore un truc qui cloche :
Mon affichage dans la partie filtrée sur les catégories ne tient pas compte de 4 articles par page,
et pour cause, je ne sais pas écrire la syntaxe LIMIT car trop de ' ou de " et pas assez de \ (mais sais pas
ou les mettre).....

Voici mon code, si cela pouvait inspirer quelqu'un !

require ('gestion/connexion.php');

if (isset($_GET['cat'])){
    $categorie = $_GET['cat'];
    // Calcul du nombre d'enregistrements dans la table pour une catégorie donnée : 
    $requete1 = $DB->query("SELECT COUNT(*) AS total FROM tourisme WHERE type = '$categorie'");
    $reponse1 = $requete1->fetch();
    $total = $reponse1['total'];

    // Calcul du nombre de pages à créer pour 4 articles par page : 
    $nombredepages = ceil($total/4);

    // On récupère le n° de la page actuelle 
    if (isset($_GET['page'])){
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse
    }
    else { // La variable n'existe pas, c'est la première fois qu'on charge la page
        $page = 1; // On se met sur la page 1 (par défaut)
    }
    // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
    $premierMessageAafficher = ($page - 1) * 4;
    // Récupération des enregistrements correspondant à la catégorie :
    $requete2 = $DB->query("SELECT * FROM tourisme WHERE type = '$categorie' ORDER BY titre");
}
else {
    //Calcul du nombre total d'enregistrements dans la table : 
    $requete1 = $DB->query('SELECT COUNT(*) AS total FROM tourisme');
    $reponse1 = $requete1->fetch();
    $total = $reponse1['total'];

    // Calcul du nombre de pages à créer pour 4 articles par page : 
    $nombredepages = ceil($total/4);

    // On récupère le n° de la page actuelle 
    if (isset($_GET['page'])){
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse
    }
    else { // La variable n'existe pas, c'est la première fois qu'on charge la page
        $page = 1; // On se met sur la page 1 (par défaut)
    }

    // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
    $premierMessageAafficher = ($page - 1) * 4;
    $requete2 = $DB->query('SELECT * FROM tourisme ORDER BY titre LIMIT ' . $premierMessageAafficher . ', ' . '4');
}
Modérateur

$categorie = $_GET['cat'];
 // Calcul du nombre d'enregistrements dans la table pour une catégorie donnée : 
$requete1 = $DB->query("SELECT COUNT(*) AS total FROM tourisme WHERE type = '$categorie'");

ALERTE INJECTION SQL !

Ne jamais, non jamais utiliser ainsi un paramètre modifiable par le visiteur dans une requête SQL.
Et PDO a tout ce qu'il faut pour éviter cela:


$stmt = $DB->prepare("SELECT COUNT(*) AS total FROM tourisme WHERE type = :categorie");
$stmt->execute(array(':categorie' => $_GET['cat']));
Merci ! J'ai corrigé...


Cette ligne semble faire double emploi, pourtant si je la retire ça ne fonctionne plus :
$categorie = $_GET['cat'];
ET
array(':categorie' => $_GET['cat'])


Mes autres requêtes présentent elles aussi des risques ?
// Récupération des enregistrements correspondant à la catégorie :
    $premierMessageAafficher = ($page - 1) * 4;    
    $requete2 = $DB->query("SELECT * FROM tourisme WHERE type = '$categorie' ORDER BY titre LIMIT ".$premierMessageAafficher . ", 4");

Modifié par etienne69 (03 Mar 2015 - 08:08)
Après pas mal de reflexion et un peu d'aide sur un autre forum, je post ici mon code fonctionnel en espérant qu'il aide quelqu'un....

<?php
require ('gestion/connexion.php');
$message = ''; // Création de la variable pour afficher un message si aucun résultat trouvé
if (isset($_GET['cat'])){      //Sommes nous sur un affichage d'une catégorie particulière ?
    $categorie = $_GET['cat'];
    // Calcul du nombre d'enregistrements dans la table pour une catégorie donnée :     
    $requete1 = $DB->prepare("SELECT COUNT(*) AS total FROM tourisme WHERE type = :categorie");
    $requete1->execute(array(':categorie' => $_GET['cat']));
    $reponse1 = $requete1->fetch();
    $total = $reponse1['total'];
    if ($total==0) {
        $message ='Aucun article trouvé pour cette catégorie, désolé !';
    }

    // Calcul du nombre de pages à créer pour 4 articles par page : 
    $nombredepages = ceil($total/4);

    // On récupère le n° de la page actuelle 
    if (isset($_GET['page'])){
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse
    }
    else { // La variable n'existe pas, c'est la première fois qu'on charge la page        
        $page = 1; // On se met sur la page 1 (par défaut)
    }

    // Récupération des enregistrements correspondant à la catégorie :
    $premierMessageAafficher = ($page - 1) * 4;    
    $requete2 = $DB->query("SELECT * FROM tourisme WHERE type = '$categorie' ORDER BY titre LIMIT ".$premierMessageAafficher . ", 4");
}
else {  //aucune catégorie selectionnée, on affiche tout à raison de 4 articles par page
    //Calcul du nombre total d'enregistrements dans la table : 
    $requete1 = $DB->query('SELECT COUNT(*) AS total FROM tourisme');
    $reponse1 = $requete1->fetch();
    $total = $reponse1['total'];

    // Calcul du nombre de pages à créer pour 4 articles par page : 
    $nombredepages = ceil($total/4);

    // On récupère le n° de la page actuelle 
    if (isset($_GET['page'])){
        $page = $_GET['page']; // On récupère le numéro de la page indiqué dans l'adresse
    }
    else { // La variable n'existe pas, c'est la première fois qu'on charge la page
        $page = 1; // On se met sur la page 1 (par défaut)
    }

    // On calcule le numéro du premier message qu'on prend pour le LIMIT de MySQL
    $premierMessageAafficher = ($page - 1) * 4;
    $requete2 = $DB->query('SELECT * FROM tourisme ORDER BY titre LIMIT ' . $premierMessageAafficher . ', 4');
}

?>




<?php 
// Affichage des données : 
     echo '<h2>' . $message . '</h2>';
     while ($data=$requete2->fetch(PDO::FETCH_OBJ)) { ?>
          <div class="media">
               <div class="media-image pull-left">
                    <img src="gestion/photos/<?= $data->photo ;?>" alt="" title="" class="media-object"  width="244" height="196" />
               </div>
               <div class="media-body">
                    <h2 class="media-heading"><?= $data->titre ;?></h2>
                    <div class="green"><?= $data->type ;?>  |  <?= $data->kms ;?> / <?= $data->temps ;?> </div>
                    <p style="text-align:justify;"><?= $data->infos ;?></p>
               </div>
               </div>
               <?php
} ?>




Et pour la pagination :



<?php

if($nombredepages > 1) {                // Si + d'une page : pagination, sinon on affiche rien !                    
     echo '<ul class="pagination">'; 
     for ($i = 1 ; $i <= $nombredepages ; $i++) {
          if (isset($_GET['page']) && $i ==$_GET['page']||$page==1 && $i ==1) {
               echo '<li class="active"><a href="#">' . $i . '</a></li>';
          }
          else {
               if (isset($categorie)){  // Pour renseigner la requête si on filtre sur une catégorie
                    echo "<li><a href='tourisme.php?page=$i&cat=$categorie'>$i</a></li>";
               }
               else { // sinon on est sur un affichage de toute la base
                    echo "<li><a href='tourisme.php?page=$i'>$i</a></li>";
                }
           }
      }
     echo '</ul>'; 
}?>





Smiley langue