begin process at 2012 05 27 19:05:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

SQL

 > LISTAGE D'UNE REQUÊTE SUR PLUSIEURS PAGES

LISTAGE D'UNE REQUÊTE SUR PLUSIEURS PAGES


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :SQL Niveau :Initié Date de création :31/08/2004 Date de mise à jour :20/09/2004 20:08:47 Vu / téléchargé :11 159 / 1 140

Auteur : rekam

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Cette classe permet de lister les résultats d'une requête SQL sur plusieurs pages. Par exemple,
si on veut visionner tous les membres d'un site, et qu'on en a environ 250, on aimerait bien,
pour que la lisibilité soit plus clair, en avoir que 15 par page. Pour ça, il suffit d'utiliser
cette classe en lui passant les bons paramètres.
Dans le zip, il y a également la documentation de la classe, créée via PhpDocumentor.

Source

  • <?php
  • /**
  • * On inclut les fichiers de connection à la bd et la classe GestionResultSQL.
  • * On peut aussi utiliser require_once() pour être sûr qu'on inclut qu'une fois
  • * ces fichiers.
  • */
  • include("connect.inc.php");
  • include("gestionResultSQL.class.php");
  • /**
  • * On dit :
  • * - 1 : combien on veut de résultats (instances) par page
  • * - 2 : l'allure de l'affichage de la page courante dans l'affichage des pages (Page 1|2|3...)
  • * - 3 : l'allure de l'affichage des autres pages (Page <a href="#">5</a>)
  • */
  • $nbInstances = 12;
  • $formatPageCourante = "#p##t#| ";
  • $formatPageAutre = "<a href=\"exemple1.php?page=#p#\">#p#</a>#t#| ";
  • /**
  • * S'il existe, on récupère la valeur de la page courante. Sinon on lui donne une valeur par
  • * défaut, qui est 1 (la première page, donc).
  • */
  • if (isset($_GET["page"])){
  • $pageCourante = $_GET["page"];
  • }else{
  • $pageCourante = 1;
  • }
  • /**
  • * On instancie l'objet GestionResultSQL. Avec retourneSQLStrRch(), on envoie :
  • * - Le nombre de résultats (instances) à afficher par page
  • * - La page courante
  • * - Les champs à récupérer (si on veut spécifier lesquels, on mettra array("champ1", "champs2")
  • * - Les tables où il y a les champs à récupérer (si on veut spécifier, on fera comme ci-dessus)
  • * - La clause WHERE, s'il y en a une
  • * - La ou les clauses qui suivent le WHERE (genre, ORDER BY, GROUP BY, etc.)
  • *
  • * IMPORTANT : Pas besoin de spécifier de LIMIT. C'est l'objet GestionResultSQL qui s'en occupe.
  • */
  • $rch = new GestionResultSQL();
  • $sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("persos"), "", "");
  • /**
  • * On récupère la string des pages avec formatteAffichagePages(). On lui passe le format de la page
  • * courante et des autres pages, ainsi que la page courante. Avec les données des lignes 18 et 19
  • * cette fonction retournera une string comme ceci :
  • *
  • * Exemple : La page courante est la numéro 3
  • * $strPages = <a href="exemple1.php?page=1">1</a>|<a href="exemple1.php?page=2">2</a>|3|<a href="exemple1.php?page=4">4</a>
  • *
  • * On constate la présence de lien sur toutes les pages sauf la page courante. On remarque également
  • * que la barre verticale "|" n'est pas présente après la page 4 (qui, dans cet exemple, est la
  • * dernière page). Ceci grâce à l'instruction #t#. (voir la doc pour plus de précisions).
  • */
  • $strPages = $rch->formatteAffichagePages($formatPageCourante, $formatPageAutre, $pageCourante);
  • ?>
  • <html>
  • <head>
  • <title>Exemple 1 : Utilisation de classe sans mot-clé</title>
  • <style>
  • table tr.c1 {
  • background-color: #FFEEEE;
  • }
  • table tr.c2 {
  • background-color: #EEFFEE;
  • }
  • </style>
  • </head>
  • <body>
  • <ul>
  • <li><a href="exemple1.php">Exemple 1</a></li>
  • <li><a href="exemple2.php">Exemple 2</a></li>
  • <li><a href="exemple3.php">Exemple 3</a></li>
  • </ul>
  • <p>Recherche sans mots-clé</p>
  • <table>
  • <tr>
  • <th width="50%">Nom</th>
  • <th width="50%">Prenom</th>
  • </tr>
  • <?php
  • $cx = 0;
  • /**
  • * On va créer un tableau contenant les
  • */
  • $choix = array(1, 2);
  • $rq = mysql_query($sql);
  • while ($ln = mysql_fetch_array($rq)){
  • /**
  • * Ici, on va alterner la couleur des tr grâce à la méthode affichageAlterne(). On lui balance
  • * simplement la couleur précédente (ou le nom de la classe CSS ou n'importe quoi d'autre)
  • * ainsi que le tableau contenant tous les choix de couleurs différents.
  • */
  • $cx = $rch->affichageAlterne($cx, $choix);
  • ?>
  • <tr class="c<?php echo $cx; ?>">
  • <td><?php echo $ln["nom"]; ?></td>
  • <td><?php echo $ln["prenom"]; ?></td>
  • </tr>
  • <?php
  • }
  • ?>
  • </table>
  • <p id="pages">Page <?php echo $strPages; ?></p>
  • </body>
  • </html>
<?php

/**
 * On inclut les fichiers de connection à la bd et la classe GestionResultSQL.
 * On peut aussi utiliser require_once() pour être sûr qu'on inclut qu'une fois
 * ces fichiers.
 */
include("connect.inc.php");
include("gestionResultSQL.class.php");

/**
 * On dit :
 *    - 1 : combien on veut de résultats (instances) par page
 *    - 2 : l'allure de l'affichage de la page courante dans l'affichage des pages (Page 1|2|3...)
 *    - 3 : l'allure de l'affichage des autres pages (Page <a href="#">5</a>)
 */
$nbInstances = 12;
$formatPageCourante = "#p##t#| ";
$formatPageAutre = "<a href=\"exemple1.php?page=#p#\">#p#</a>#t#| ";

/**
 * S'il existe, on récupère la valeur de la page courante. Sinon on lui donne une valeur par
 * défaut, qui est 1 (la première page, donc).
 */
if (isset($_GET["page"])){
  $pageCourante = $_GET["page"];
}else{
  $pageCourante = 1;
}

/**
 * On instancie l'objet GestionResultSQL. Avec retourneSQLStrRch(), on envoie :
 *    - Le nombre de résultats (instances) à afficher par page
 *    - La page courante
 *    - Les champs à récupérer (si on veut spécifier lesquels, on mettra array("champ1", "champs2")
 *    - Les tables où il y a les champs à récupérer (si on veut spécifier, on fera comme ci-dessus)
 *    - La clause WHERE, s'il y en a une
 *    - La ou les clauses qui suivent le WHERE (genre, ORDER BY, GROUP BY, etc.)
 *
 * IMPORTANT : Pas besoin de spécifier de LIMIT. C'est l'objet GestionResultSQL qui s'en occupe.
 */
$rch = new GestionResultSQL();
$sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("persos"), "", "");

/**
 * On récupère la string des pages avec formatteAffichagePages(). On lui passe le format de la page
 * courante et des autres pages, ainsi que la page courante. Avec les données des lignes 18 et 19
 * cette fonction retournera une string comme ceci :
 *
 * Exemple : La page courante est la numéro 3
 * $strPages = <a href="exemple1.php?page=1">1</a>|<a href="exemple1.php?page=2">2</a>|3|<a href="exemple1.php?page=4">4</a>
 *
 * On constate la présence de lien sur toutes les pages sauf la page courante. On remarque également
 * que la barre verticale "|" n'est pas présente après la page 4 (qui, dans cet exemple, est la
 * dernière page). Ceci grâce à l'instruction #t#. (voir la doc pour plus de précisions).
 */
$strPages = $rch->formatteAffichagePages($formatPageCourante, $formatPageAutre, $pageCourante);

?>
<html>
<head>
    <title>Exemple 1 : Utilisation de classe sans mot-clé</title>
    <style>
        table tr.c1 {
            background-color: #FFEEEE;
        }

        table tr.c2 {
            background-color: #EEFFEE;
        }
    </style>
</head>
<body>

<ul>
    <li><a href="exemple1.php">Exemple 1</a></li>
    <li><a href="exemple2.php">Exemple 2</a></li>
    <li><a href="exemple3.php">Exemple 3</a></li>
</ul>

<p>Recherche sans mots-clé</p>
<table>
    <tr>
        <th width="50%">Nom</th>
        <th width="50%">Prenom</th>
    </tr>
<?php
$cx = 0;
/**
 * On va créer un tableau contenant les
 */
$choix = array(1, 2);
$rq = mysql_query($sql);
while ($ln = mysql_fetch_array($rq)){
    /**
     * Ici, on va alterner la couleur des tr grâce à la méthode affichageAlterne(). On lui balance
     * simplement la couleur précédente (ou le nom de la classe CSS ou n'importe quoi d'autre)
     * ainsi que le tableau contenant tous les choix de couleurs différents.
     */
    $cx = $rch->affichageAlterne($cx, $choix);
?>
    <tr class="c<?php echo $cx; ?>">
        <td><?php echo $ln["nom"]; ?></td>
        <td><?php echo $ln["prenom"]; ?></td>
    </tr>
<?php
}
?>
</table>
<p id="pages">Page <?php echo $strPages; ?></p>

</body>
</html>

 Conclusion

En théorie, ça marche nickel. Normalement, on peut arriver à tout faire pour structurer la navigation entre les pages. ça fonctionne avec n'importe quelle BDD, n'importe quels champs et n'importe quelles tables. Si vous avez des questions, je tâcherai d'y répondre ici.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

31 août 2004 21:53:55 :
Ajout de la doc de la classepar phpDocumentor
20 septembre 2004 20:08:49 :
Quelques commentaires en plus

 Sources du même auteur

Source avec Zip Source avec une capture GÉNÉRATION DE DOCUMENT OPENOFFICE 2.0 SPREADSHEET
Source avec Zip Source avec une capture GESTION DE TOURNOIS VIA LE WEB
Source avec Zip RÉCUPÉRATION D'UN BOUT DE STRING EN FONCTION DU NOMBRE DE MO...
Source avec Zip Source avec une capture MAILING LISTE TOUTE SIMPLE SANS PRÉTENTIONS
Source avec Zip Source avec une capture SAISIE DE DATES VIA CALENDRIER

 Sources de la même categorie

Source avec Zip CLASS PHP :: REQUÊTES MYSQL par devgoneti
Source avec Zip Source avec une capture CONVERTIR BASE FIREBIRD EN MYSQL par castelfrederic29
Source avec une capture SQL/EXE EXECUTEUR DE REQUETTES SQL par enokbyreal
Source avec Zip ESPACE MEMBRE BASIQUE par bonhommecrea
Source avec Zip Source avec une capture MODIFICATEUR DE DONNEES DANS UNE BASE SQL AVEC LISTING DES T... par cram121

Commentaires et avis

Commentaire de rekam le 10/09/2004 01:31:41

Euh...merci pour la note, mais en fait, j'aurais bien voulu savoir s'il y avait des choses à améliorer ou à changer.

Genre, pour la liste des pages, on peut l'afficher comme ceci :
Page 1|2|3|4|5
ou comme ceci
Résultats 1 à 15 / 16 à 30 / 31 à 42

Y'a peut-être d'autres moyens d'afficher les pages que cette classe ne prend pas en compte. Chai pas, celles et ceusses qui affichent des listes, vous faites comment quand vous avez plusieurs pages ?

Commentaire de sampiero le 17/06/2005 18:24:39

Bonjour,

J'ai vraiment apprécié votre code. Mais je suis débutant en programmation, je n'ai pas trouvé le moyen de choisir la table ni les noms des champs.

Merci de venir à mon secours.

Commentaire de rekam le 17/06/2005 22:28:02

Salut,
Regarde bien l'exemple que je fourni plus haut. Tu trouveras cette ligne :

$sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("persos"), "", "");

Le premier array() contient le/les champs, le 2e array() contient la/les tables (voir les commentaires correspondants dans l'exemple). En esperant que ça ait pu t'aider un peu. Ah oui, et au tout debut, tu as un include('connect.inc.php'); Ceci signinfie que tu dois avoir un fichier qui s'appelle connect.inc.php et qui contient les donnees de connection a la bd, genre :
<?php
$dbhost = "localhost";
$dblogin = "root";
$dbpassword = "";
$dbname = "le-nom-de-ta-bd";

$connect = mysql_connect($dbhost,$dblogin,$dbpassword);
$db = mysql_select_db($dbname);
?>

Au plaisir

Commentaire de sampiero le 18/06/2005 08:18:12

Bonjour,

merci pour cette réponse ultra rapide.

Commentaire de airben le 06/08/2005 16:21:30

Bonjour

Pouvez-vous me dire s'il vous plait si cette requete peu marché avec votre srcipt.
Si non qu'est ce que je doid modifié pour que sa marche avec votre script .MERCI bien


$requete = "SELECT *
FROM cv WHERE 1 = 1 AND";


if (!empty($recherche)) {
    $requete .= " MATCH ( ref, titre, nom, code, ville, fonction, region1, nom_entr1, prec_ent, nom_entr2 )
AGAINST ( '$recherche' IN BOOLEAN MODE )";
}

if (!empty($fonction)) {
    $requete .= " AND fonction = '".$fonction."'";
}

if (!empty($ann_exp)) {
    $requete .= " AND ann_exp = '".$ann_exp."'";
}


if (!empty($niveau)) {
    $requete .= " AND niveau = '".$niveau."'";
}

if (!empty($region1)) {
    $requete .= " AND region1 = '".$region1."'";
}


if (!empty($mobil)) {
    $requete .= " AND mobil = '".$mobil."'";
}

if (!empty($critere)) {
    $requete .= " AND critere = '".$critere."'";
}




Commentaire de rekam le 08/08/2005 08:41:21

Salut
A priori, ça devrait être jouable. J'ai pas testé mais essaie ça. Prend l'exemple 1 fourni avec la source et remplace cette ligne:

$sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("persos"), "", "");

par ceci :

$sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("cv"), "1=1", $suite);

où $suite correspond UNIQUEMENT à ce qui suit la clause WHERE.

Normalement, ça te sortira la même chose en gérant les LIMIT et le nombre de pages et tout. Maintenant, est-ce que $recherche vient d'un champ dans lequel on insère un mot ? Si oui, y'a peut-être encore une autre solution mais celle-là peut fonctionner.

Voilà, a+

Commentaire de thebinch le 28/10/2005 14:20:07

Bonjour,

la classe fonctionne bien, dommage qu'au changement de page on re-interroge la base. Son interet est donc limite a la gestion de la pagination. Je vais m'orienter pour mes dev vers un systeme de cache

Merci/a+

http://www.bozonnet.com

Commentaire de rekam le 28/10/2005 14:24:05

salut,

bonne idée le cache. Dans mon cas, c'est vrai que j'en avais pas besoin, vu que la bd est très (très très) souvent modifiée et que par conséquent, ça vaut la peine d'avoir une liste qui se rafraichit tout le temps. Là où j'ai fait une erreur, c'est que je n'aurais pas du utiliser LIMIT mais plutot BETWEEN. Il paraît que ce dernier est plus performant.

Mais bref, au plaisir :)

Commentaire de thebinch le 28/10/2005 14:25:24

Ah oui j'oubliais, si quelqu'un connait une classe qui gere ma problematique de cache, je suis prenneur...

a+

Commentaire de rekam le 28/10/2005 14:27:22

si tu connais Smarty (une librairie de génération de template pour php), tu y trouveras qqpart ton bonheur, puisque je sais qu'il utilise le cache. Par contre , je ne sais pas comment :P ....

Sinon, tu peux utiliser les $_SESSION . C'est un peu la magouille, mais en fait, même pas vraiment. Enfin bref, bonne chance, quoi ;)

Commentaire de alexNunes le 05/01/2006 21:20:52

Bonjour,
j'ai quelques difficulté à configurer la clause WHERE dans votre code,en fait ça ne fonctionne pas, je n'ai peux-être pas la bonne syntaxe?
pouvez-vous m'aider la dessus.

voici ce que j'ai écrit:
$sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("membres"),  "WHERE cat=equipe", "ORDER BY nom ASC");

merci

Alex

Commentaire de rekam le 22/08/2006 10:19:06

Salut,

essaie sans mettre le WHERE, soit :
$sql = $rch->retourneSQLStrRch($nbInstances, $pageCourante, array("*"), array("membres"),  "cat=equipe", "ORDER BY nom ASC");

ça devrait fonctionner!
A+

Commentaire de darth vador le 26/06/2008 22:00:21

bonjour et merci pour ce script ;)
voila j'ai fait comme vous avez dit mais j'ai comme alexNunes des difficultés avec WHERE.
j'ai une erreur
mysql_num_rows(): supplied argument is not a valid MySQL result resource in E:\www\SiteBeatrice\gestionResultSQL.class.php on line 576

mysql_fetch_array(): supplied argument is not a valid MySQL result resource in E:\www\SiteBeatrice\Catalogue.php on line 62

la ligne 62 du catalogue est while ($ln = mysql_fetch_array($rq))

j'ai testé de metre avec et sans where pour $sql = $rch->retourneSQLStrRch mais toujours la meme erreur.

avez vous une idée?

merci d'avance.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales