Un navigateur de résultats en PHP
URL de référence : http://www.apachefrance.com/Articles/2/
Préambule
Dans une architecture utilisant PHP et MySQL, lorsqu'on présente le résultat d'une requête sur la base de données, il est pratique de ne pas afficher tout sur une seule page, mais plutôt de répartir l'affichage sur plusieurs pages virtuelles. Cela se présente généralement sous la forme de liens en bas de page du type "Précédent 1 2 3 4 5 6 7 8 Suivant", les moteurs de recherche étant typiquement les sites sur lesquels on rencontre ce procédé de navigation. Cependant, le champ d'application d'un tel navigateur est bien plus vaste que le simple moteur de recherche, et peut être utilisé dans n'importe quel site-application Web, d'autant que sa mise en oeuvre est aisée.
C'est ce que nous allons étudier dans cet article.
Les ingrédients
Les hypothèses de départ sont les suivantes :
un serveur HTTP avec PHP et MySQL est installé,
vous avez les connaissances de base sur l'interaction PHP/MySQL
une base de données basetest a été créée
dans MySQL,
une table tabletest a été créée et contient
une série d'enregistrements. 3 champs sont définis : code, nom,
email.
Pour créer une structure de données, copiez le script compris entre
les deux lignes de tirets et collez-le dans un fichier creation.sql.
#
# Creation de la base 'basetest'
#
DROP DATABASE IF EXISTS basetest;
CREATE DATABASE basetest;
USE basetest;
#
# Structure de la table 'tabletest'
#
DROP TABLE IF EXISTS tabletest;
CREATE TABLE tabletest (
code int(10) unsigned NOT NULL auto_increment,
nom varchar(50) NOT NULL,
email varchar(50) NOT NULL,
PRIMARY KEY (code),
UNIQUE code (code),
KEY code_2 (code)
);
#
# Contenu de la table 'tabletest'
#
INSERT INTO tabletest VALUES ( '1', 'Luke Skywalker', 'lskywalker@toto.com');
INSERT INTO tabletest VALUES ( '2', 'Han Solo', 'hsolo@toto.com');
INSERT INTO tabletest VALUES ( '3', 'Chewbacca', 'chewbacca@toto.com');
INSERT INTO tabletest VALUES ( '4', 'Leia Organa', 'lorgana@toto.com');
INSERT INTO tabletest VALUES ( '5', 'Dark Vador', 'dvador@toto.com');
INSERT INTO tabletest VALUES ( '6', 'Boba Fett', 'bfett@toto.com');
INSERT INTO tabletest VALUES ( '7', 'Amiral Thrawn', 'thrawn@toto.com');
INSERT INTO tabletest VALUES ( '8', 'R2D2', 'r2d2@toto.com');
INSERT INTO tabletest VALUES ( '9', 'Z6PO', 'z6po@toto.com');
INSERT INTO tabletest VALUES ( '10', 'Jabba le Hutt', 'jabba@toto.com');
INSERT INTO tabletest VALUES ( '11', 'Amiral Piett', 'piett@toto.com');
INSERT INTO tabletest VALUES ( '12', 'Obi-wan Kenobi', 'obiwan@toto.com');
INSERT INTO tabletest VALUES ( '13', 'Yoda', 'yoda@toto.com');
INSERT INTO tabletest VALUES ( '14', 'Biggs Darklighter', 'biggs@toto.com');
Ensuite, il suffit de demander à MySQL d'exécuter les commandes
contenues dans ce fichier :
C:\>mysql -u root -p mysql
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 239 to server version: 3.23.33
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql> source chemin\creation.sql;
Principe de fonctionnement
PHP présente un avantage indéniable : toutes les couples variable=valeur
passées comme paramètres dans une URL sont directement disponibles
sous forme de variables.
Ainsi, si l'URL courante est index.php?nom=toto, une variable $nom contenant
"toto" sera automatiquement créée par PHP.
Maintenant, imaginons qu'au lieu de disposer d'un parametre nom, nous
disposons d'un paramètre debut indiquant où commencer l'affichage
d'une série d'enregistrements provenant d'une base de données.
Vous voyez où je veux en venir ?
Notre navigateur va nécessiter deux variables. La première, à
savoir le nombre d'enregistrements à afficher par page, sera fixée
à l'avance. Nous l'appelerons limite. La deuxième, correspondant
à la position où commencer l'affichage, sera passée en
paramètre selon la méthode présentée au paragraphe
précédent. Nous utiliserons le nom debut.
Afin de disposer d'un code lisible, nous allons reporter la création
et l'affichage du navigateur dans une fonction.
Celle-ci sera appelée depuis une page standard
Voici l'algorithme de création du navigateur :
Si la variable $debut n'existe pas alors
$debut=0
compter le nombre d'enregistrements dans la table tabletest
Si le nombre d'enregistrements est supérieur à 0 {
sélectionner $limite enregistrements
en commençant à l'enregistrement $debut
afficher la sélection d'enregistrements
afficher le navigateur
}
Pour un affichage plus sympa, vous pouvez charger les deux images suivantes
et partant du répertoire où vous mettez vos pages Web, placez-les
dans un sous-répertoire nommé images.
Ensuite, il suffit de créer les fichiers navig.php et exemple.php à
partir du code source fourni un peu plus loin.
Code source du navigateur
Fichier navig.php
Il correspond à l'implémentation en PHP de l'algorithme présenté
auparavant.
<?php
#########################################
# Affichage du navigateur en bas de page
#########################################
function navigateur($nblignes,$debut,$limite) {
// Calcule le nombre devant posseder un lien d'accès
$pages=intval($nblignes/$limite);
// $pages contient la partie entière du résultat de la division...
// ...s'il y a un reste on ajoute une page
if ($nblignes%$limite) $pages++;
if ($pages > 1) {
?>
<tr>
<td>
<?php
// Creation des liens vers les pages virtuelles contenant les autres resultats
if ($debut>=$limite) { // On ne cree pas de lien "PRECEDENT" si debut vaut 0
$precdebut=$debut-$limite;
print "<A href=\"$PHP_SELF?debut=$precdebut\">
<img src=\"images/suitegauche.gif\" border=0></A>\n";
}
for ($i=1;$i<=$pages;$i++) { // affichage des liens numerotes
$nouvdebut=$limite*($i-1);
if ($nouvdebut == $debut) { // numero sans lien
print "<b>$i</b> \n";
} else {
// numero avec lien
print "<a href=\"$PHP_SELF?debut=$nouvdebut\">$i</a> \n";
}
}
// verification si nous sommes a la derniere page
if ($debut!=$limite*($pages-1)) {
// nous ne sommes pas a la derniere page donc il faut creer un lien "SUIVANT"
$nouvdebut = $debut+$limite;
print "<A href=\"$PHP_SELF?debut=$nouvdebut\">
<img src=\"images/suitedroite.gif\" border=0></A>\n";
}
?>
</td>
</tr>
<?php
}
}
Code source de l'appel au navigateur
Fichier exemple.php
Ce fichier est fourni comme un exemple d'utilisation du navigateur, et devrait
constituer une bonne base pour vos applications/sites.
Il comprend plusieurs sections que nous allons détailler :
Tout d'abord, l'intégration du code de la fonction "navigateur"
par l'emploi de la primitive require.
Ensuite, la définition des paramètres de connexion à
la base de données et et la connexion.
L'étape suivante consiste à fixer le nombre maximal d'éléments
affichés par page (variable $limite) et le point de départ pour
le traitement des enregistrements (variable $debut).
Calcul du nombre d'enregistrements dans la liste à afficher. S'il
est supérieur à 0, obtentions de la liste des enregistrements
à afficher et traitement pour l'affichage.
Enfin, appel à la fonction navigateur.
<?php
require('navig.php');
$host = "mysql.local";
$user = "usertest";
$pass = "usertest";
$bdd = "basetest";
mysql_connect($host,$user,$pass) or die("Can't connect to server");
mysql_select_db($bdd) or die ("Can't connect to database");
?>
<table width="100%" border=0>
<tr vAlign=top>
<td>
<table>
<?php
// La variable "limite" fixe le
nombre maximum d'éléments affichés par page
$limite = 5;
// La variable "debut" permet
de déterminer le point de départ de l'affichage des enregistrements
if (empty($debut)) $debut=0;
// Recuperation nombre de lignes
$query = "SELECT Count(*) FROM tabletest";
$numresultat = mysql_query($query);
$numrow = mysql_fetch_row($numresultat);
$nblignes = $numrow[0];
if ($nblignes > 0) {
// Recuperation liste des enregistrements
$query = "SELECT * FROM tabletest";
$query .= " ORDER BY nom";
$query .= " LIMIT $debut,$limite";
$resultats = mysql_query($query);
// Boucle sur les
enregistrements pour leur affichage
while($row = mysql_fetch_array($resultats)) {
?>
<tr>
<td><font face=Arial color=#000080 size=2>
<?php print "$row[nom]"; ?>
</font></td>
<td><font face=Arial color=#000080 size=2>
<?php print "$row[email]"; ?>
</font></td>
</tr>
<?php
echo "\n";
}
?>
</table>
</td>
</tr>
<?php
// Affichage du
navigateur
navigateur($nblignes,$debut,$limite);
mysql_free_result($resultats);
?>
</table>
<?php
} else print("Aucun enregistrement, désolé !\n");
?>
Conclusion
Maintenant, ouvrez la page exemple.php dans votre navigateur préféré
et vous devriez voir la première série de 5 enregistrements apparaître.
|
Amiral Piett |
piett@toto.com |
|
Amiral Thrawn |
thrawn@toto.com |
|
Biggs Darklighter |
biggs@toto.com |
|
Boba Fett |
bfett@toto.com |
|
Chewbacca |
chewbacca@toto.com |
|
1 2 3
|
S'il reste des points obscurs, ou pour toute remarque, n'hésitez pas à
m'envoyer un email !
|