begin process at 2012 05 27 20:20:23
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > FONCTION DE PAGINATION INVERSEE OU NON DEPUIS UNE BDD OU UN DOSSIER

FONCTION DE PAGINATION INVERSEE OU NON DEPUIS UNE BDD OU UN DOSSIER


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de données Classé sous :pagination, simple, invérsée, editable, google Niveau :Débutant Date de création :17/11/2007 Date de mise à jour :19/11/2007 13:01:53 Vu / téléchargé :6 273 / 313

Auteur : Asherah

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

 Description

Cliquez pour voir la capture en taille normale
Ceci est une fonction de pagination simple depuis une base de donnée ou un dossier, facilement configurable et intégrable avec le possibilité de la mettre en invérsée ou de la laisser normale.
plusieurs ZIP disponible:

BDD_ (pagination depuis un table SQL
-"mode complet" pour les novices
-"mode invérsé ou normal"
-"mode no_fonction" a integrer directement a la page

DOSSIER (pagination depuis un dossier)
-"mode complet" pour les novices
-"mode invérsé ou normal"
-"mode no_fonction" a integrer directement a la page



Source

  • //---------------------index.php--------------------------
  • <?php
  • $depuis = 'bdd';//pour paginer un dossier mettre 'folder'
  • $dossier= 'gallerie';//chemin du dossier a paginer si vous faite une pagination depuis un dossier, si ce n'est pas le cas laissez tel quel
  • if($depuis == 'bdd'){
  • ///////////vos identifiant de connection bdd\\\\\\\\\\\\\\\
  • $db = mysql_connect('localhost', 'login', 'password');
  • mysql_select_db('nom_de_la_base',$db);
  • ///////////////////////////////////////////////////////////
  • }
  • require ('fonction_pagination.php');
  • ///////////////////page///////////////////////////////////
  • $conteneur_bd_debut = '<table border="1"><tr><td bgcolor="red" width="300" height="300">';
  • $conteneur_bd_fin = '</tr></td></table>';
  • $conteneur_pg_debut = '<table border="1"><tr><td bgcolor="yellow" width="300">';
  • $conteneur_pg_fin = '</tr></td></table>';
  • /////////////////////a editer\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • //-------------------Général---------------------------\\
  • $inverse = 'non';//pour avoir la pagination invérsée (oui ou non)
  • $nbr_par_page = 1;//nombre d'éléments par pages
  • $nbr_liens = 5;//nombre de liens a afficher
  • //----------------------SQL-----------------------------\\
  • $champ = 'truc';// champ de la table a séléctionner (SELECT)
  • $table = 'test';//la table a séléctionner (FROM)
  • $where = 'id'; //a trier par... (par defaut id)
  • ////limite de recherche BDD (utile si la table a paginer est consequente)
  • $active = 'oui';// 'oui' pour activer cette fonction
  • $limite_debut = '0';//..trié les id entre...
  • $limite_fin ='100';//..et...
  • //-------------------------------------------------------\\
  • /////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • if(isset($_GET['page'])){
  • if(is_numeric($_GET['page']) && strlen($_GET['page']) < 5){
  • $page = addslashes($_GET['page']);
  • }
  • else{
  • echo 'Un problème est survenu';
  • exit();
  • }
  • }
  • //////////////////appel de la fonction\\\\\\\\\\\\\\\\\\\\\\\
  • pagination($depuis, $conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin, $dossier);
  • ?>
  • //-----------------fonction_pagination.php-----------------
  • <?php
  • function pagination($depuis, $conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin, $dossier){
  • if($depuis == 'bdd'){
  • if($active == 'oui'){
  • $sql = "SELECT $champ FROM $table WHERE $where BETWEEN $limite_debut AND $limite_fin";
  • }
  • else{
  • $sql = "SELECT $champ FROM $table ORDER BY $where";
  • }
  • $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
  • while($data1 = mysql_fetch_assoc($req))
  • {
  • $tableau[] = $data1[$champ];
  • }
  • }
  • else{
  • $tableau = array();
  • if(is_dir($dossier)) {
  • $dir = opendir($dossier) or die('Impossible d\'ouvrir le dossier');
  • while (false !== ($file = readdir($dir))) {
  • if ($file != '.' && $file != '..') {
  • $tableau[] = $file;
  • }
  • }
  • }
  • }
  • $total = count($tableau);
  • $nbr_pages = ceil($total/$nbr_par_page);
  • if(!isset($page)){
  • if($inverse == 'non'){
  • $page = '1';
  • }
  • else{
  • $page = $nbr_pages;
  • }
  • }
  • if($nbr_liens >= $nbr_pages){
  • $nbr_liens = $nbr_pages;
  • }
  • if($page >= $nbr_pages){
  • $page = $nbr_pages;
  • }
  • if($inverse == 'non'){
  • $liens = ceil($nbr_liens/2);
  • $pagination_debut = $page-$liens;
  • if($pagination_debut < '1'){
  • $pagination_debut = 1;
  • $pagination_fin = $nbr_liens;
  • }
  • if(!isset($pagination_fin)){
  • $pagination_fin = $page+$liens;
  • if($pagination_fin >= $nbr_pages){
  • $pagination_fin = $nbr_pages+1;
  • }
  • }
  • }
  • else{
  • $nbr_pages = ceil($total/$nbr_par_page);
  • if($nbr_liens >= $nbr_pages){
  • $nbr_liens = $nbr_pages;
  • }
  • if($page >= $nbr_pages){
  • $page = $nbr_pages;
  • }
  • $liens = ceil($nbr_liens/2);
  • $pagination_debut = $page-$liens;
  • if($pagination_debut <= '1'){
  • $pagination_debut = 0;
  • $pagination_fin = $nbr_liens;
  • }
  • if(!isset($pagination_fin)){
  • $pagination_fin = $page+$liens;
  • if($pagination_fin >= $nbr_pages){
  • $pagination_fin = $nbr_pages;
  • }
  • }
  • }
  • echo $conteneur_bd_debut;
  • $page_fin = $page*$nbr_par_page;
  • $page_debut = $page_fin-$nbr_par_page;
  • for ($a=$page_debut; $a<$page_fin; $a++){
  • if($depuis == 'bdd'){
  • echo $tableau[$a];
  • }
  • else{
  • echo '<img src="'.$dossier.'/'.$tableau[$a].'">';//affichage des images
  • }
  • }
  • echo $conteneur_bd_fin, $conteneur_pg_debut;
  • if($inverse == 'non'){
  • if($page > '1'){
  • $precedent = $page-1;
  • $acces_precedent = '<a href="index.php?page='.$precedent.'">< </a>';
  • }
  • else{
  • $acces_precedent = False;
  • }
  • if($pagination_debut > '1'){
  • $acces_debut = '<a href="index.php?page=1"><< </a>';
  • $rognage_precedent = '...';
  • }
  • else{
  • $acces_debut = False;
  • $rognage_precedent = False;
  • }
  • echo $acces_debut, $acces_precedent, $rognage_precedent;
  • }
  • else{
  • if($pagination_fin < $nbr_pages){
  • $rognage_suivant = '...';
  • $acces_fin = '<a href="index.php?page='.$nbr_pages.'"> <<</a>';
  • }
  • else{
  • $rognage_suivant = False;
  • $acces_page_fin = False;
  • $acces_fin = False;
  • }
  • if($page < $nbr_pages){
  • $suivant = $page+1;
  • $acces_suivant = '<a href="index.php?page='.$suivant.'"> <</a>';
  • }
  • else{
  • $acces_suivant = False;
  • }
  • echo $acces_fin, $acces_suivant, $rognage_suivant;
  • }
  • if($inverse == 'non'){
  • for ($b=$pagination_debut; $b<$pagination_fin; $b++){
  • $numero = $b;
  • $pointeur = str_replace($page,'<b><font size="4">'.$page.'</font></b>',$numero);
  • $chaine.= '<a href="index.php?page='.$b.'">'.$pointeur.'</a>|';
  • $pointeur = str_replace($chaine,'<b><font size="4">'.$page.'</font></b>',$chaine);
  • }
  • echo $chaine;
  • }
  • else{
  • for ($b=$pagination_fin; $b>$pagination_debut; $b--){
  • $numero = $b;
  • $pointeur = str_replace($page,'<b><font size="4">'.$page.'</font></b>',$numero);
  • $chaine.= '<a href="index.php?page='.$b.'">'.$pointeur.'</a>|';
  • $pointeur = str_replace($chaine,'<b><font size="4">'.$page.'</font></b>',$chaine);
  • }
  • echo $chaine;
  • }
  • if($inverse == 'non'){
  • if($pagination_fin < $nbr_pages){
  • $rognage_suivant = '...';
  • $acces_page_fin = '<a href="index.php?page='.$nbr_pages.'">'.$nbr_pages.'</a>';
  • $acces_fin = '<a href="index.php?page='.$nbr_pages.'"> >></a>';
  • }
  • else{
  • $rognage_suivant = False;
  • $acces_page_fin = False;
  • $acces_fin = False;
  • }
  • if($page < $nbr_pages){
  • $suivant = $page+1;
  • $acces_suivant = '<a href="index.php?page='.$suivant.'"> ></a>';
  • }
  • else{
  • $acces_suivant = False;
  • }
  • echo $rognage_suivant, $acces_page_fin, $acces_suivant, $acces_fin;
  • }
  • else{
  • if($page > '1'){
  • $precedent = $page-1;
  • $acces_precedent = '<a href="index.php?page='.$precedent.'">> </a>';
  • }
  • else{
  • $acces_precedent = False;
  • }
  • if($pagination_debut > '1'){
  • $acces_debut = '<a href="index.php?page=1">>> </a>';
  • $rognage_precedent = '...';
  • $acces_page_debut = '<a href="index.php?page=1">1</a>';
  • }
  • else{
  • $acces_debut = False;
  • $rognage_precedent = False;
  • }
  • echo $rognage_precedent, $acces_page_debut, $acces_precedent, $acces_debut;
  • }
  • echo $conteneur_pg_fin;
  • if($depuis == 'bdd'){
  • mysql_close();
  • }
  • exit();
  • }
  • ?>
  • //---------------------------SQL------------------------------
  • -- phpMyAdmin SQL Dump
  • -- version 2.11.0
  • -- http://www.phpmyadmin.net
  • --
  • -- Serveur: localhost
  • -- Généré le : Sam 17 Novembre 2007 à 00:16
  • -- Version du serveur: 5.0.45
  • -- Version de PHP: 5.2.4
  • -- --------------------------------------------------------
  • --
  • -- Structure de la table `test`
  • --
  • CREATE TABLE `test` (
  • `id` int(11) NOT NULL auto_increment,
  • `truc` varchar(50) NOT NULL,
  • PRIMARY KEY (`id`)
  • ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ;
  • --
  • -- Contenu de la table `test`
  • --
  • INSERT INTO `test` (`id`, `truc`) VALUES
  • (1, '1'),
  • (2, '2'),
  • (3, '3'),
  • (4, '4'),
  • (5, '5'),
  • (6, '6'),
  • (7, '7'),
  • (8, '8'),
  • (9, '9'),
  • (10, '10'),
  • (11, '11'),
  • (12, '12'),
  • (13, '13'),
  • (14, '14'),
  • (15, '15'),
  • (16, '16'),
  • (17, '17'),
  • (18, '18'),
  • (19, '19'),
  • (20, '20'),
  • (21, '21'),
  • (22, '22'),
  • (23, '23'),
  • (24, '24'),
  • (25, '25'),
  • (26, '26');
  • //----------------------------------------------------------------
//---------------------index.php--------------------------


<?php

$depuis = 'bdd';//pour paginer un dossier mettre 'folder'
$dossier= 'gallerie';//chemin du dossier a paginer si vous faite une pagination depuis un dossier, si ce n'est pas le cas laissez tel quel


if($depuis == 'bdd'){
///////////vos identifiant de connection bdd\\\\\\\\\\\\\\\
$db = mysql_connect('localhost', 'login', 'password');
mysql_select_db('nom_de_la_base',$db);
///////////////////////////////////////////////////////////
}
require ('fonction_pagination.php');


///////////////////page///////////////////////////////////

$conteneur_bd_debut = '<table border="1"><tr><td bgcolor="red" width="300" height="300">';
$conteneur_bd_fin = '</tr></td></table>';


$conteneur_pg_debut = '<table border="1"><tr><td bgcolor="yellow" width="300">';
$conteneur_pg_fin = '</tr></td></table>';



/////////////////////a editer\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//-------------------Général---------------------------\\

$inverse = 'non';//pour avoir la pagination invérsée (oui ou non)
$nbr_par_page = 1;//nombre d'éléments par pages
$nbr_liens = 5;//nombre de liens a afficher

//----------------------SQL-----------------------------\\


$champ = 'truc';// champ de la table a séléctionner (SELECT)
$table = 'test';//la table a séléctionner (FROM)
$where = 'id'; //a trier par... (par defaut id)


////limite de recherche BDD (utile si la table a paginer est consequente)
$active = 'oui';// 'oui' pour activer cette fonction


$limite_debut = '0';//..trié les id entre...
$limite_fin ='100';//..et... 

//-------------------------------------------------------\\
/////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
if(isset($_GET['page'])){
if(is_numeric($_GET['page']) && strlen($_GET['page']) < 5){
$page = addslashes($_GET['page']);
}
else{
echo 'Un problème est survenu';
exit();
}
}

//////////////////appel de la fonction\\\\\\\\\\\\\\\\\\\\\\\

pagination($depuis, $conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin, $dossier);
?>


//-----------------fonction_pagination.php-----------------


<?php
function pagination($depuis, $conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin, $dossier){
if($depuis == 'bdd'){
if($active == 'oui'){
$sql = "SELECT $champ FROM $table WHERE $where BETWEEN $limite_debut AND $limite_fin";
}
else{
$sql = "SELECT $champ FROM $table ORDER BY $where";
}
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
while($data1 = mysql_fetch_assoc($req))
{
$tableau[] = $data1[$champ];
}
}
else{
$tableau = array(); 
if(is_dir($dossier)) {
$dir = opendir($dossier) or die('Impossible d\'ouvrir le dossier');

while (false !== ($file = readdir($dir))) {
if ($file != '.' && $file != '..') {
$tableau[] = $file;
}
}
}
}
$total = count($tableau);
$nbr_pages = ceil($total/$nbr_par_page);
if(!isset($page)){
if($inverse == 'non'){
$page = '1';
}
else{
$page = $nbr_pages;
}
}
if($nbr_liens >= $nbr_pages){
$nbr_liens = $nbr_pages;
}
if($page >= $nbr_pages){
$page = $nbr_pages;
}
if($inverse == 'non'){
$liens = ceil($nbr_liens/2);
$pagination_debut = $page-$liens;
if($pagination_debut < '1'){
$pagination_debut = 1;
$pagination_fin = $nbr_liens;
}
if(!isset($pagination_fin)){
$pagination_fin = $page+$liens;
if($pagination_fin >= $nbr_pages){
$pagination_fin = $nbr_pages+1;
}
}
}
else{
$nbr_pages = ceil($total/$nbr_par_page);
if($nbr_liens >= $nbr_pages){
$nbr_liens = $nbr_pages;
}
if($page >= $nbr_pages){
$page = $nbr_pages;
}
$liens = ceil($nbr_liens/2);
$pagination_debut = $page-$liens;
if($pagination_debut <= '1'){
$pagination_debut = 0;
$pagination_fin = $nbr_liens;
}
if(!isset($pagination_fin)){
$pagination_fin = $page+$liens;
if($pagination_fin >= $nbr_pages){
$pagination_fin = $nbr_pages;
}
}
}
echo $conteneur_bd_debut;
$page_fin = $page*$nbr_par_page;
$page_debut = $page_fin-$nbr_par_page;
for ($a=$page_debut; $a<$page_fin; $a++){
if($depuis == 'bdd'){
echo $tableau[$a];
}
else{
echo '<img src="'.$dossier.'/'.$tableau[$a].'">';//affichage des images
}
}
echo $conteneur_bd_fin, $conteneur_pg_debut;
if($inverse == 'non'){
if($page > '1'){
$precedent = $page-1;
$acces_precedent = '<a href="index.php?page='.$precedent.'">< </a>';
}
else{
$acces_precedent = False;
}
if($pagination_debut > '1'){
$acces_debut = '<a href="index.php?page=1"><< </a>';
$rognage_precedent = '...';
}
else{
$acces_debut = False;
$rognage_precedent = False;
}
echo $acces_debut, $acces_precedent, $rognage_precedent;
}
else{
if($pagination_fin < $nbr_pages){
$rognage_suivant = '...';
$acces_fin = '<a href="index.php?page='.$nbr_pages.'"> <<</a>';
}
else{
$rognage_suivant = False;
$acces_page_fin = False;
$acces_fin = False;
}
if($page < $nbr_pages){
$suivant = $page+1;
$acces_suivant = '<a href="index.php?page='.$suivant.'"> <</a>';
}
else{
$acces_suivant = False;
}
echo   $acces_fin, $acces_suivant, $rognage_suivant;
}
if($inverse == 'non'){
for ($b=$pagination_debut; $b<$pagination_fin; $b++){
$numero = $b;
$pointeur = str_replace($page,'<b><font size="4">'.$page.'</font></b>',$numero);
$chaine.= '<a href="index.php?page='.$b.'">'.$pointeur.'</a>|';
$pointeur = str_replace($chaine,'<b><font size="4">'.$page.'</font></b>',$chaine);
}
echo $chaine;
}
else{
for ($b=$pagination_fin; $b>$pagination_debut; $b--){
$numero = $b;
$pointeur = str_replace($page,'<b><font size="4">'.$page.'</font></b>',$numero);
$chaine.= '<a href="index.php?page='.$b.'">'.$pointeur.'</a>|';
$pointeur = str_replace($chaine,'<b><font size="4">'.$page.'</font></b>',$chaine);
}
echo $chaine;
}
if($inverse == 'non'){
if($pagination_fin < $nbr_pages){
$rognage_suivant = '...';
$acces_page_fin = '<a href="index.php?page='.$nbr_pages.'">'.$nbr_pages.'</a>';
$acces_fin = '<a href="index.php?page='.$nbr_pages.'"> >></a>';
}
else{
$rognage_suivant = False;
$acces_page_fin = False;
$acces_fin = False;
}
if($page < $nbr_pages){
$suivant = $page+1;
$acces_suivant = '<a href="index.php?page='.$suivant.'"> ></a>';
}
else{
$acces_suivant = False;
}
echo $rognage_suivant, $acces_page_fin, $acces_suivant, $acces_fin;
}
else{
if($page > '1'){
$precedent = $page-1;
$acces_precedent = '<a href="index.php?page='.$precedent.'">> </a>';
}
else{
$acces_precedent = False;
}
if($pagination_debut > '1'){
$acces_debut = '<a href="index.php?page=1">>> </a>';
$rognage_precedent = '...';
$acces_page_debut = '<a href="index.php?page=1">1</a>';
}
else{
$acces_debut = False;
$rognage_precedent = False;
}
echo $rognage_precedent, $acces_page_debut, $acces_precedent, $acces_debut;
}
echo $conteneur_pg_fin;
if($depuis == 'bdd'){
mysql_close();
}
exit();
}
?>

//---------------------------SQL------------------------------


-- phpMyAdmin SQL Dump
-- version 2.11.0
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Sam 17 Novembre 2007 à 00:16
-- Version du serveur: 5.0.45
-- Version de PHP: 5.2.4

-- --------------------------------------------------------

--
-- Structure de la table `test`
--

CREATE TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  `truc` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ;

--
-- Contenu de la table `test`
--

INSERT INTO `test` (`id`, `truc`) VALUES
(1, '1'),
(2, '2'),
(3, '3'),
(4, '4'),
(5, '5'),
(6, '6'),
(7, '7'),
(8, '8'),
(9, '9'),
(10, '10'),
(11, '11'),
(12, '12'),
(13, '13'),
(14, '14'),
(15, '15'),
(16, '16'),
(17, '17'),
(18, '18'),
(19, '19'),
(20, '20'),
(21, '21'),
(22, '22'),
(23, '23'),
(24, '24'),
(25, '25'),
(26, '26');





//----------------------------------------------------------------


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • BDD_and_DOSSIER_GLOBAL.zipTélécharger ce fichier [Réservé aux membres club]19 721 octets
  • BDD_inverse.zipTélécharger ce fichier [Réservé aux membres club]2 507 octets
  • BDD_no_fonction_inverse.zipTélécharger ce fichier [Réservé aux membres club]1 874 octets
  • BDD_no_fonction_normal.zipTélécharger ce fichier [Réservé aux membres club]1 865 octets
  • BDD_normal.zipTélécharger ce fichier [Réservé aux membres club]2 498 octets
  • DOSSIER_inverse.zipTélécharger ce fichier [Réservé aux membres club]16 836 octets
  • DOSSIER_no_fonction_inverse.zipTélécharger ce fichier [Réservé aux membres club]17 026 octets
  • DOSSIER_no_fonction_normal.zipTélécharger ce fichier [Réservé aux membres club]16 968 octets
  • DOSSIER_normal.zipTélécharger ce fichier [Réservé aux membres club]16 776 octets

Télécharger le zip


 Historique

17 novembre 2007 14:59:39 :
modif' de presentation
17 novembre 2007 17:48:13 :
re-modif'
18 novembre 2007 18:31:05 :
Mega update!
18 novembre 2007 18:42:15 :
modif du titre
18 novembre 2007 21:00:36 :
modif' presentation
18 novembre 2007 21:32:15 :
modif'
18 novembre 2007 21:38:07 :
re modif'
19 novembre 2007 00:35:35 :
possibilité de paginer un dossier
19 novembre 2007 01:03:21 :
re
19 novembre 2007 01:04:07 :
re
19 novembre 2007 13:01:53 :
ajout d'un dossier

 Sources de la même categorie

Source avec Zip ORM : DAO, ACTIVERECORD ET DBLIST par Reldan
Source avec une capture CET EXTRAIT PERMET D'AJOUTER DANS UN TABLEAU UNE AGRÉGATION ... par Denis007
EXPORT DE BASE AU FORMAT CSV par remib74
Source avec Zip RECHERCHE DES DOUBLONS DANS UNE TABLE MYSQL EN SÉLECTIONNANT... par aladec2007
[CRON] INSERT ON DUPLICATE KEY UPDATE par pierreSabatier

 Sources en rapport avec celle ci

AFFICHÉ SUR UN TABLEAU AVEC PAGINATION ET BASE DE DONNÉES par stormxp
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
COMPTEUR DE VISITE - FICHIER TXT - CODE MINIMAL par SuperChouquette
Source avec Zip Source avec une capture MOTEUR DE RECHERCHE SUR BASE MYSQL FULLTEXT ET BOOLEAN AVEC ... par cod57
Source avec une capture PAGINATION EN PHP par Orangina

Commentaires et avis

Commentaire de Asherah le 17/11/2007 17:10:36

La présentation graphique est dépouillée a son maximum,
uniquement pour que vous puissiez facilement l'intégrer a votre site avec une mise en forme CSS ou autre.

N'hésitez pas à laisser vos commentaires et pourquoi pas mettre une note^^.

Commentaire de Asherah le 18/11/2007 18:38:24

Voili! un gros update!

-possibilité d'avoir la pagination invérsée.
-possibilité de restreindre la recherche SQL grace a BETWEEN.

La source est maintenant livrée avec 4 zip.

A savoir la source de base facilement configurable depuis l'index avec la gestion invérsée ou pas pour les novices.

Les versions "allégées" uniquement invérsée ou normal.

Et les version sans l'index, a configurer depuis le script lui meme, pour ceux a qui ca ne fait pas peur. ^^


Voili, et bon paginage^^

Commentaire de neigedhiver le 18/11/2007 19:23:56

Salut,

J'ai du mal à comprendre l'intérêt de spécifier en argument les limites inférieure et supérieure des enregistrements à retourner, si ensuite le script recalcule le nombre de pages...

Il m'aurait semble plus rationnel de laisser le script calculer les limites inf. et sup. en fonction de la page demandée et du nombre de pages.

En fait, utiliser BETWEEN pour une pagination n'a de sens que si aucun enregistrement n'a été supprimé.

Si ta table comprends 20 engistrements, que le premier a été supprimé et un autre au milieu, alors les index ont des valeurs allant de 2 à 21. Et pas de 1 à 20. Du coup, le 5ème enregistrement, par exemple, porte l'index 6.
Il faut un autre index, différent de la clé primaire, que tu gères toi-même dans ton script, pour t'assurer qu'aucun ne manque.
Ainsi, lorsque l'on supprime l'enregistrement 5, on décrémente tous les suivants de 1, pour qu'il n'y ait pas de trou. On peut alors utiliser BETWEEN en toute sérénité.

Autre optimisation : tu parcours le résultat et stockes tous les enregistrements dans un tableau associatif, quitte à n'en utiliser qu'une partie ensuite. C'est un peu lourd.
Le plus malin serait de se positionner directement sur le premier enregistrement que l'on souhaite avec mysql_data_seek(), et de boucler autant de fois qu'on veut d'enregistrements. On évite d'avoir un tableau avec plein de trucs inutiles.

Le plus rusé, encore, serait de savoir à l'avance combien d'enregistrements il y a dans la table. Un simple SELECT COUNT(id) FROM table; le dit. Puisqu'on compte un nombre de clés primaires, la requête ne prend pas beaucoup de ressources : mysql est optimisé pour ce genre de requête.
On peut alors tranquillement calculer les premier et dernier enregistrements que l'on souhaite récupérer. La requête ne retournera alors que des enregistrements qui seront utilisés. On n'a alors plus besoin de boucler 2 fois sur le tableau (1 remplissage, 1 lecture). On boucle directement sur le résultat, directement en lecture pour l'afficher.

Trois petites choses encore :
- je déplore que ta fonction demande autant de paramètres
- dommage qu'il n'y ait pas plus de commentaires, parce qu'on a du mal à savoir à quoi sert chaque ligne
- il est fort regrettable que l'affichage html et le traitement des données soient mélangés... On s'y perd, et pour personnaliser le code HTML de sortie, c'est pas évident.

Commentaire de Asherah le 18/11/2007 21:10:19

Salut^^

merci pour tes commentaires.

en fait a la base je n'ai pas fait ce script pour etre une fonction en soit, c'est pour cela qu'il y a en effet beaucoups de parametres, mais je n'ai pas voulus en postant cette source ici qu'elle se limite aux initiés du php, mais je voulais quelle soit accessible meme aux plus novices...
J'ai mis un zip "no_fonction" qui justement, permet de l'exploiter sans ces parametres...

sinon, pour ce qui est du between, tu as raison je vais optimisé la chose ^^.

merci encore^^

Commentaire de kylekatarnls le 18/11/2007 22:33:35 5/10

Je trouve le code un peu long et lourd pour une simple pagination, j'ai déjà fait des paginations plus complexes qui prennent beaucoup moins de lignes de code, de plus toute pagination n'est pas liée à une BDD.

L'idée est bonne mais je pense qu'on peut faire mieux.

Commentaire de Asherah le 18/11/2007 23:09:33

Salut Kylekatarnls.

Sache que ma pagination n'est pas faite uniquement pour la BDD,  elle est aussi concue pour lire et paginé un dossier tu a juste a remplacé


------------------fonction_pagination.php----------------------

"# function pagination($conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin){
# if($active == 'oui'){
# $sql = "SELECT $champ FROM $table WHERE $where BETWEEN $limite_debut AND $limite_fin";
# }
# else{
# $sql = "SELECT $champ FROM $table ORDER BY $where";
# }
# $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
# while($data1 = mysql_fetch_assoc($req))
# {
# $tableau[] = $data1[$champ];
# }
# $total = count($tableau); "
-------------------------------------------------------

par:

-------------------------------------------------------
$dossier = 'ton_dossier';
$tableau = array();
if(is_dir($dossier)) {
$dir = opendir($dossier) or die('Impossible d\'ouvrir le dossier');

while (false !== ($file = readdir($dir))) {
if ($file != '.' && $file != '..') {
$tableau[] = $file;
}
}
}
-----------------------------------------------------------

et tu pagine un dossier.

Maintenant si tu a fait plus complexe en beaucoup moins de ligne, je veut bien voir^^.

Et si tu pouvais developpé un peu plus, aussi je suis preneuse.

Commentaire de Asherah le 18/11/2007 23:13:44

erff il ne faut pas enlever le "# $total = count($tableau); "
je corrige:


"------------------fonction_pagination.php----------------------

"# function pagination($conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin){
# if($active == 'oui'){
# $sql = "SELECT $champ FROM $table WHERE $where BETWEEN $limite_debut AND $limite_fin";
# }
# else{
# $sql = "SELECT $champ FROM $table ORDER BY $where";
# }
# $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
# while($data1 = mysql_fetch_assoc($req))
# {
# $tableau[] = $data1[$champ];
# }

--------------------------------------------------------

par:

-------------------------------------------------------
$dossier = 'ton_dossier';
$tableau = array();
if(is_dir($dossier)) {
$dir = opendir($dossier) or die('Impossible d\'ouvrir le dossier');

while (false !== ($file = readdir($dir))) {
if ($file != '.' && $file != '..') {
$tableau[] = $file;
}
}
}
-----------------------------------------------------------

Commentaire de Asherah le 18/11/2007 23:22:18

il ne faut pas enlever la fonction en haut non plus.

Commentaire de Asherah le 18/11/2007 23:27:53

Mais je vais rajouter l'option demain.

Je metterais aussi comme pour la pagination bdd les formats invérsé ou non et no_fonction .

Commentaire de neigedhiver le 18/11/2007 23:29:10

Non mais si tu veux vraiment optimiser comme ça, le mieux, c'est encore d'utiliser des itérateurs.
Pour le coup, tu gagnerais non seulement en nombre de lignes, mais aussi en performances, en lisibilité et en facilité de maintenance...
Un peu de lecture : http://www.php.net/~helly/php/ext/spl/

^^

Commentaire de Asherah le 19/11/2007 00:45:26

^^
c'est quoi un itérateur? Oo
excuse moi, mais la je suis un peu dans le brouillard.

Et puis tu parle pour moi si je veut faire une pagination?
parceque la, je propose un pagination pour les autres,
et surtout pour les tonnes de petit noobs comme moi qui savent pas ce que c'est un itérateur. +_O

Mais par contre je suis curieuse de savoir, alors si t avais la meme chose en francais.

(oui,j ai pas eu le temp d'apprendre l'anglais a l'ecole :/)

chui preneuse^^

Commentaire de neigedhiver le 19/11/2007 01:11:09

Ouaip, pardon...

Euh donc je disais ça par spécifiquement pour toi, mais pour ta source. Je donne une piste d'optimisation.

Un itérateur, c'est un objet (instance d'une classe) qui a certaines méthodes (fonctions) définies pour réagir aux fonctions php suivantes :
- current()
- next()
- valid()
- rewind()
- key()

Typiquement, un itérateur est utilisé dans une boucle foreach. La boucle foreach est particulièrement pratique puisqu'elle exécute toute seule ces fonctions sur la variable qui est passée en paramètre.
Lors de l'exécution de cette boucle :
foreach ($aTableau as $sLigne) {
  echo $sLigne;
}
foreach effectue tout seul les instructions suivantes :
Initialisation de la boucle :
- rewind($aTableau)
- valid($aTableau)
Une boucle (1 élément) :
- current($aTableau)
- key($aTableau)
- next($aTableau)
- valid($aTableau)
A la fin d'une boucle, si valid() renvoie TRUE, une nouvelle boucle est faite. Sinon, foreach s'arrête.

Un itérateur permet donc de contrôler comment on parcourt quelque chose (un objet, un tableau, n'importe quoi).

Le parcours d'un répertoire peut se faire en 3 lignes. Le parcours récursif d'un répertoire (le répertoire ainsi que tous ses sous-répertoires) idem.
En sacrifiant une ligne supplémentaire de code on peut filtrer les répertoires que l'on affiche (ne pas afficher "." et "..", ne pas afficher les fichiers cachés, ou uniquement ceux qui se terminent par ".truc.php").

Bon là, je commence à rentrer dans le tuto... Alors qu'il en existe déjà : http://www.phpcs.com/tutoriaux/UTILISER-ITERATEURS-PHP5_640.aspx

Concrètement, pour ton cas, un itérateur permettrait de ne parcourir que quelques enregistrements du résultat d'une requête SQL, ou que quelques fichiers d'un répertoire, etc.
Quelques classes permettraient de spécialiser certaines tâches, comme la récupération de ce qu'il faut paginer, et l'affichage de ce quelque chose à paginer. Cela permet d'avoir autant de classes qu'on le souhaite, pour paginer un résultat de requete, des fichiers, le contenu d'un tableau, etc. Sans avoir jamais à modifier le code de l'affichage de la page.

Enfin voilà... Je sais pas si c'était vraiment le meilleur endroit pour tout ça, mais bon...
Si t'y vois pas plus clair, n'hésite pas à poser des questions. J'aime bien les gens curieux, l'étant moi-même : c'est comme ça qu'on progresse.

Commentaire de Asherah le 19/11/2007 01:14:10

Super!!

j'vais m'intérésser a tout ca, et je vais essayer de l'adapter a la pagination.^^

merci beaucoup^^

Commentaire de malalam le 19/11/2007 08:23:48 administrateur CS

L'année dernière, j'ai justement fait un package dont les classes peuvent s'utiliser séparément, pour ces traitements, et évidemment, il utilise les itérateurs ;-)
Ca peut te servir de base :
http://www.phpcs.com/codes/PHP5-LIMIT-PACKAGE-LIMITATION-GENERIQUE-JEU-RESULTAT-ITERATEURS_40545.aspx

Commentaire de Asherah le 19/11/2007 12:33:50

En tout cas elle à l'air genial ta source ^^,
Je vais m'en inspirer si je calle un peu, mais je vais quand meme essayer de faire mon propre itérateur, uniquement dans un but d'apprentissage (si je ne fait pas, je ne saurait pas^^), mais avec tout ca, je crois que je vais decouvrir une nouvelle dimension du php^^.
Merci beaucoup a tous^^.

Commentaire de neigedhiver le 19/11/2007 12:41:40

Asherah : "avec tout ca, je crois que je vais decouvrir une nouvelle dimension du php^^."

@malalam : Mission accomplie ^^

Commentaire de malalam le 19/11/2007 13:20:26 administrateur CS

Ouaip :-) On est bons ;-)

Commentaire de hamidmx le 19/11/2007 15:41:55

c'est super, surtout après les modifs ...

Commentaire de Asherah le 19/11/2007 17:05:32

merci^^
Ca va etre encore mieu lorsque j'aurais fait l'itérateur.^^ patience dans quelques jours ca va froler le codage extraterestre^^

Commentaire de kylekatarnls le 19/11/2007 20:48:01

Alors la méthode que j'utilise en supposant que l'on est récupéré un contenu SQL ou un dossier dans un array ce qui je pense du coup peut s'adapter à tout :
<?php
$array=array(/*Le contenu à paginer*/);
$nepp=12;//Le nombre d'élément par page
$nbdp=7;//Le nomnbre de numéro de la pagination (impaire plus grand que 3)
if(count($array)>$nepp) //on ne pagine que si c'est nécessaire
{
  $array=array_chunk($array,$nepp,true);
  $pmax=count($array);
  $page=$_GET['souspage']*1;//Sous-page évite d'avoir tout à récoder si on utilise déjà une get page
  if(!isset($_GET['souspage']) || !is_int($page) || $page<1 || $page>$pmax)
    $page=1;
  $array=$array[$page-1];
  // On a prélevé le contenu, maintenant on construit la barre des pages
  $inter=' ';
  if($pmax<=$nbdp)
  {
    for($i=1;$i<=$pmax;$i++)
      if($i==$page)
        $inter.='-<b>'.$i.'</b>- ';
      else
        $inter.='<a href="?souspage='.$i.'" title="Page n°'.$i.'">['.$i.']</a> ';
  }
  else
  {
    $coun=1;
    for($i=min($pmax+1-$nbdp,max(1,ceil($page-(($nbdp-1)/2))));
        $i<=min($pmax,max(7,ceil($page+(($nbdp-1)/2))));
        $i++) {
      if(($i!=1 && $coun==1) || ($i!=$pmax && $coun==$nbdp))
        $inter.='... ';
      elseif($i==$page)
        $inter.='-<b>'.$i.'</b>- ';
      else
        $inter.='<a href="?souspage='.$i.'" title="Page n°'.$i.'">['.$i.']</a> ';
      $coun++;
    }
    $inter=' <a href="?souspage='.max(1,$page-7).'" title="Page n°'.max(1,$page-7).'">&lt;&lt;</a> <a href="?souspage='.max(1,$page-1).'" title="Page n°'.max(1,$page-1).'">&lt;</a>'.$inter.'<a href="?souspage='.min($pmax,$page+-1).'" title="Page n°'.min(1,$page+1).'">&gt;</a> <a href="?souspage='.min($pmax,$page+7).'" title="Page n°'.min($pmax,$page+7).'">&gt;&gt;</a> ';
  }
}
echo $inter.'<br />'; // On affiche la pagination au dessus
foreach($array as $key=>$value)
{
  //ici on exploite, par exemple on affiche :
  echo $value['titre'].'<br />'.$value['message'].'<hr />';
}
echo $inter.'<br />'; // On affiche la pagination en dessous
?>
Voilà ça ne prend qu'une petite page c'est totalement paramètrable, qu'y a-t-il besoin de plus ?

Commentaire de neigedhiver le 19/11/2007 20:56:30

Salut,

@kylekatarnls : J'ai pas regardé ton code en détails, mais si on récupère ce qu'on veut paginer dans un array, excuse moi, mais niveau performances, c'est pas top... Inutile de récupérer TOUTES les données qui sont affichées sur plusieurs pages alors qu'on n'en affiche qu'une partie par page, et qu'on ne peut pas en afficher plus d'une page à chaque fois...
L'itérateur permet de n'itérer que sur une partie, sans surcharger le traitement et la mémoire. En plus, c'est plus joli et plus clair que plein de code avec du html perdu dedans et que personne n'a envie de chercher à décrypter...

Commentaire de Asherah le 19/11/2007 21:52:26

Tu ne fait aucunes verifications sur tes transmissions de variable par get, j'aimerais pas l'avoir sur mon site.

Et c'est bete qu'il ne marche pas, car je suis sur que j'aurais pu trouver pleins de trucs du genre. si tu passe a la page 9 alors qu'il n y a que 6 pages tu retrouve dans le vide intersidérale de la bdd.

et puis beaucoup moins de lignes oui, mais sans possibilité de faire un pagination invérsée.

bref, j'aimerais que tu post cette source, voir ce que les autres en pense.

Ils y  en a ici qui prennent du temp a faire des reponses constructive.
Et je les remercis beaucoup,et peut etre devrait tu prendre exemple sur eux.

Bon allé sur ce, je n'ajouterais rien, je viens ici pour partager et apprendre.




Commentaire de neigedhiver le 20/11/2007 00:28:17

J'aurais effectivement pu prendre 10 secondes pour lire le code...

if(count($array)>$nepp) //on ne pagine que si c'est nécessaire

C'est bien ce qui me semblait : on stocke dans le tableau TOUT ce qui doit être paginé, même si ça ne doit pas être affiché.
En plus, en faisant comme ça, ça implique une première lecture du résultat mysql, puis une seconde du tableau... Deux boucles sur les mêmes données pour ne les afficher qu'une seule fois... C'est dommage et un vrai gâchi de performances,alors qu'un itérateur permet de ne parcourir qu'une seule fois les données, et uniquement celles que l'on souhaite afficher... Franchement, moins de lignes, c'est un mauvais argument... En plus, pour parcourir un répertoire, là où il faut 10 lignes en procédural, il en faut 3 avec un itérateur (et je ne parle même pas de récursivité, où le nombre de lignes et la charge mémoire augmente de façon phénoménale en procédural, sans bouger augmenter exagérément avec un itérateur).

"$page=$_GET['souspage']*1;//Sous-page évite d'avoir tout à récoder si on utilise déjà une get page"

Mais ça oblige à tout recoder si on utiliser déjà $_GET['souspage']

Bref... Avec un peu de bonne volonté, on peut parvenir à faire du joli code performant... C'est pas difficile, et c'est pas non plus réservé à une élite.

Commentaire de kylekatarnls le 20/11/2007 17:43:33

La sécurité de ma GET est à 100%, si ce n'est pas un int supérieur à 0, alors elle ne donne rien. De plus le "html perdu" et bien c'est les liens, je vais aps les coder en javascript. Et je ne crois pas que tes 325 lignes non indentées et tes 12 zip soit plus aisés à décrypter.

Je t'ai dit ce que je pensais de ton code (que j'ai noté 5 et pas 0 quand même). Je n'ai présenté cette version que parce que tu me l'a demandé, elle a peut-être l'inconvéniant de prendre une seconde de plus lorsqu'on a 600 pages de 30 entrée BDD, tout comme elle a les avantages de prendre moins de place, de s'adpter à tous les contenus. Je prétends pas que ça vale mieux juste que je préfère utiliser ce code, et j'ai déjà expliqué pourquoi.

PS: Il serait judicieux de remplacer <<, <, >, >> dans les liens par &lt; et &gt; pour éviter des les erreurs de W3C.

Commentaire de neigedhiver le 20/11/2007 18:01:17

kylekatarnls : "La sécurité de ma GET est à 100%, si ce n'est pas un int supérieur à 0, alors elle ne donne rien. De plus le "html perdu" et bien c'est les liens, je vais aps les coder en javascript."

Mouais, ben non... Mais séparer leur affichage du traitement, c'est pas réservé à une élite, c'est à la portée du premier venu et ça simplifie ENORMEMENT la tache du premier gus qui voudra modifier la mise en page. Parce que des liens construits sur plusieurs lignes à partir de morceaux de balises mélangés à des variables php avec des apostrophes, des guillemets échappés qu'on ne sait même plus lequel on doit fermer, excuse moi, mais c'est vraiment pas génial.
Y'a une fonciton toute bête de PHP qui permet de commencer à séparer l'affichage du traitement, c'est la base ; et cette fonction c'est sprintf, qui permet d'y voir quand même sacrément plus clair quand on balance une tripotée de variables dans une chaine.

Et puis tu parles d'une seconde pour 600 pages de 30 entrées... Moi je te parle aussi de charge mémoire et d'optimisation, d'une manière générale.
Essaie de voir un peu plus loin que le bout de ta souris... Quand on utilise une fonction de pagination pour mettre en page les résultats d'un moteur de recherche, ça peut être plusieurs utilisateurs, voire même plusieurs dizaines en même temps. 1 seconde de plus pour chaque personne, je te laisse imaginer la différence que ça fait pour le serveur. C'est pas négligeable. C'est même énorme.

Alors si tu dois charger les 15000 résultats d'une recherche dans une pauvre variable alors que tu vas n'en afficher que 30, je trouve déplorable un tel gâchis de RAM, alors qu'elle pourrait servir à autre chose (comme par exemple stocker plusieurs fois 30 résultats à afficher).

Maintenant si t'as pas du tout envie d'optimiser tes codes et préfères te contenter de piètres performances qui te suffisent, libre à toi. Si tu utilises tes codes pour un site perso avec maxi 3 utilisateurs simultanés, c'est un fait. Mais quand on publie une source, il est normal d'essayer d'optimiser le plus possible. Parce que sinon, la source ne sert à rien.

Maintenant, si tu lis un peu plus attentivement les remarques que j'ai soumises à Asherah et que tu compares sa réaction à la tienne, tu verras qu'il y a une différence.
Elle a reconnu que sa source n'était pas optimisée et elle se penche depuis sur une version orientée objet de sa source. Elle cherche à optimiser et n'a jamais prétendu que sa source était plus performante que la tienne.

Pfffffffffff

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

pagination+mail de confirmation [ par algantilla ] Bonsoir à tous!! j'aimerai bien faire une simple pagination pour bien ordonner les résultats d'une recherche mutlicritères en php!! j'ai déjà trouvé Php, listing de recherche google [ par goth666 ] Bonsoir, est-il possible de créer un .php qui ira chercher les liens des résultats trouvé par google?Je m'explique, je voudrais stocker des adresses t créer un site dynamique simple [ par smed79 ] bonjourje veux créer un site dynamique avec ou sans base de données,que je peux ensuit envoyer des message vers des tutorielssur le web.exemple: <img Comment créer un compteur de temps simple? [ par karasdono ] Cela peut paraître idiot mais je n'arrive tous simplement pas à créer un compteur de temps avec les minutes et les secondes qui défilent. Je suis Aide sur API Google nxgooglemapsapi.php [ par koestel ] Bonjour,J'utilise la classe ''nxgooglemapsapi.php" pour mieux gèrer l'api google pour une applicationcela fonctionne mais j'aimerai pouvoir :Rajouter lien dans un input [ par Neme6 ] Bonjour à tous,voilà mon soucis:soit,&lt;?phpecho'&lt;a href="'.$url[$i].'" onclick="fonction_php()"&gt;'.$title[$i].'&lt;/a&gt;&lt;form action="trait ouverture fichiers PHP [ par hmeidatt ] hmeidatt J' ai besoin d'aide, je prie tout le monde de me renseigner sur astuces simple ou programmes simple pour ouvrir fichiers avec extension PHP.m Recherche script de forum très simple et pas encore trouvée [ par m54 ] Bonjour,J'ai tester plus de 40 scripts sur divers sites de scripts et il me faut un forum qui :- Est très simple (multi forum quand même)- Possède une api google map [ par debogger ] existe t'il une api google map ecrit en php pour interagir sur une carte en fonction des coordonnées présente dans une base mysql Barre de progression upload fichier SIMPLE [ par pukekey ] Bonjour, Voila vous allez surement me dire que je suis un boulet mais je me lance : J'ai chercher pendant des heures un moyen de faire une barre de


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,499 sec (4)

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