AFFICHER LE RÉSULTAT D'UNE REQUÊTE SQL SUR PLUSIEURS PAGE

djmmix Messages postés 152 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 29 avril 2009 - 18 juin 2009 à 17:16
shakiboy Messages postés 2 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 25 juillet 2013 - 20 juil. 2009 à 20:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50193-afficher-le-resultat-d-une-requete-sql-sur-plusieurs-page

shakiboy Messages postés 2 Date d'inscription lundi 27 février 2006 Statut Membre Dernière intervention 25 juillet 2013
20 juil. 2009 à 20:50
Hello tout le monde.
Super script !
Je cherchais un truc comme ca justement... J'ai essayé de l'adapté a mon besoin qui est d'afficher une photo à la fois (les photos sont rangées dans une table)...
J'ai plus ou moins 126 lignes de photos. J'ai essayé le script en le modifiant et tout marchait bien, à la 126eme, il affichait le lien précédent, mais pas le suivant. Ce qui est normal.
Mais petit soucis... Je voudrais seulement afficher les photos où le champs "selection"="oui" (il y en a 39/126).
J'ai donc modifier cette ligne :

$sql="select * from photos LIMIT $debut,$limite";
qui est devenue :
$sql="select * from photos WHERE selection='oui' LIMIT $debut,$limite";

Et quand je change ce code, et bien les photos s'affichent bien mais à la 39ème, le lien "suivant" reste. Alors qu'il n'y a plus de photo...
Comment faire pour que ce lien disparaisse apres la sélection. Parce que j'ai cliqué sur suivant pour voir jsuqu'où il s'affichait, et arrivé à la 126eme, le lien disparait enfin...
Donc, avec ou sans la clause WHERE, le lien suivant s'enlève seulement à la page 126...
Comment puis-je faire..?

Je vous remercie,

Eric.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
25 juin 2009 à 11:42
douggyfresh tu ne peux pas stocker des ressources en session et il serait totalement inutile de la cloner une ressource est une référence vers une ressource externe, généralement un socket de connexion tu ne peux pas cloner ce genre de données... tu peux par contre utiliser, comme la dit Master Nico, le cache requête de mysql et la clause LIMIT ira à ravir à ce type de requête... de toute façon il vaut mieux attendre 5s à chaque page plutôt que 30s à la première page... .. .

select * from

Vire le joker et met le nom des champs tu gagnera une peu de temps d'execution... .. .

Pour le reste post sur le forum si tu veux de l'aide... .. .

@ tchaOo°
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 10:41
C BIEN COMPRIS Mr MASTERNICO
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
25 juin 2009 à 08:28
Ma réaction fait suite à plusieurs constatations:
1)Il a été dit qu'il ne fallait pas utiliser les sessions pour stocker des tableaux MySQL. Il faut utiliser le cache des requettes au niveau du moteur. Résultat, on se retrouve avec un nouveau post qui nous montre fièrement une nouvelle aproche du problème... en utilisant les sessions.
2)Il a été dit que puisque tu débutes (ce qui en soit n'est pas un mal) il faudrait que tu mettes ta source au niveau 'debutant' et non pas 'initié'. Résultat, c'est toujours en initié.
3)Il a été dit que les modifications que tu apportes à ton script doivent être directement mises dans le source et non pas dans un post. Résultat, le code original est toujours là.
4)Il a été dit que cette section du site est réservée au code fonctionnel qui font avancer le shmilblic et non pas à ceux qui veulent proposer de nouvelles idées en pseudo code. Il y a le Forum pour ça. Résultat, Mr Haiti boy qui nous balance son code direct dans un post.

Conclusion, je ne doute pas que vous cherchiez à vous améliorer et qu'avant tout, c'est votre désir de partager avec la communauté qui vous a poussé à venir ici. Mais alors, SVP, écoutez ce qu'on vous dit...
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
25 juin 2009 à 08:14
Bonjour Masternico

je comprend pas ta réaction

merci d'étre un peu claire stp
en fin de compte même si tu trouve mon code nul, sache bien que j'ai commencé avec php y a seulement 3 mois , donc si je suis ici c pour connaitre mieux ce language

:):) merci en tout cas
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
25 juin 2009 à 01:27
<?php
function je_me_tire_une_balle($cote_de_la_tête,$arme)
{
echo 'blammmmmm';
}

je_me_tire_une_balle(DROIT,'magnum 45');
?>
douggyfresh Messages postés 21 Date d'inscription lundi 24 mai 2004 Statut Membre Dernière intervention 25 mai 2005
25 juin 2009 à 00:55
C tres bien de ta part Karimmass de partager avec nous ta facon de coder cette affaire de pagination dont tous developpeurs font face lorsqu'il s'agit de projets requerant l'affichage de donnees volumineuses. L'idee de la pagination quant les donnees proviennent d'une base est codee souvent dans ta maniere. La solution salvatrice est d'interroger tous les donnees avec notre requete(Premiere execution de la requete), et encore, extraire la partie qui nous interesse grace a LIMIT(Une deuxieme execution de la meme requete). C'est Bien. Mais, c'est pas du tout optimal.
Car j'ai affaire actuellement a une solution de ce genre dans un projet d'entreprise sous php. La table contenait deja plus de 800 milles Lignes d'enregistrement. Imagine toi d'appliquer la pagination a une telle table, et que vous devriez joindre le resultat a d'autres tables pour trouver d'autres informations. L'utilisateur final perdrait patience, car l'affichage des donnees prendrait trop de temps. Donc, J'ai pas regarde tous vos codes, mais , il n'est pas different du mien en ce qui attrait a ta facon de coder la pagination. Mais, la seule gigue de ton code c'est qu'il execute la meme requete de fois. Disons qu'une requete complexe prend 30s secondes pour executer, Dans ton cas, il mettrait presqu'environ une minute avant que php prenne la main.

Voici la solution que j'ai envisage, mais, faute de temps, je ne peux m'y mettre maintenant.
La fonction $resource=mysql_query('select * from ..... where ....... ') nous retourne deja une Ressource.
Donc, je pense qu'on pourrait maintenir cote serveur dans la memoire cette ressource dans une variable session.
Et a chaque requete utilisateur, on clone cette variable(Je ne sais si le clonage de variable de type ressource existe en php comme le clonage d'objet en java, G pas encore fait de recherche la dessus) de sorte que mysql_fetch_array() ne puisse modifier notre pointeur d'interrogation sur la base(par consequent Notre variable ressource stockee en session se pointera toujours dans la premiere ligne de la table ).

Disons en pseudo code notre code ressemblera a ceci:

// On cree une variable session pour ne pas re-executer la requete. S'il existe on execute la requete, on stocke la variable ressource dans une variable session
define('MAX_ELEM_PAR_PAGE',20)//nombre d'element par page
if(!isset($_SESSION['sql_execute']))
{
$notre_requete="select * from .... where .....";
$ressource=mysql_query($notre_requete);
$quantite_ligne=mysql_num_rows($ressource);
//puis on stocke $ressource dans une variable session
$_SESSION['ressource']=$ressource;
//on positionne notre variable drapeau
$_SESSION['sql_execute']=true;
//On clone notre variable $ressource( je ne sais pas si le clonage existe) avec une fonction du genre //clone()
$clone=clone($ressource);
//on positionne notre compteur de ligne a 1 pour arreter lorsqu'on arrete au nombre maximum d'element
//par page
$i=1;
while(($clone_data=mysql_fetch_array($clone))!=null)
{
if($i>MAX_ELEM_PAR_PAGE)
break;
//On ecrit les codes php de creation des lignes de la table avec les donnees
$i++;
}
//puis on utilise la variable $quantite_ligne pour construire dynamiquement les liens de types 1..2..3 //pour la pagination selon le nombre d'element par page. Donc toute l'idee est la, elle sera utile
//a la condition else lors de la mise en correspondance des donnees lues a la table.

}
else// Ici on repond aux requetes de pages sans executer la requete
{

//nous supposons que les numeros de pages nous proviennent d'une variable $_GET['page']
$numero_page=$_GET['page'];
//on clone la variable session
$clone=clone($_SESSION['ressource']);
//on va sauter les lignes non voulues
while()
{
$i=1;
while(($clone_data=mysql_fetch_array($clone))!=null)
{
if($i correspond au rangee de notre page )
{
on affiche les donnees $clone_data[''];
//On ecrit les codes php de creation des lignes de la table avec les donnees pour cette page
}
else if($i est en dehors des rangees de notre page )
break;//on sort de la boucle pour ne pas extraire des donnees non voulues

}

}

}

C'est fini. En gros, Vous verrez que j'ai interroge la base une seule fois. Et que j'ai fait mes lectures
sur la variable ressource. Donc, la lecture devient plus rapide. Moins de surcharge pour le SGBD en ce qui attrait aux requetes SQL qui peuvent prendre du temps. Donc, on aura qu'a faire un fetch des donnees. On exploite seulement le cache de mysql ici. Donc, Developpeurs de tout genre. Dis moi ce que vous pensez de mes idees. Et vous qui avez du temps, Reseigne moi aussi sur la possibilite de clonage d'objet ou de variable Ressource ( Type mysql ou socket).

C'etait Lefruy James Douglass.
Developpeur
Port-au-Prince, Haiti
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
24 juin 2009 à 23:57
Slt... c'est imbuvable de poster le code comme ça...

-1- met à jour ta source avec ton nouveau code
-2- met le code en débutant et non en initié car ça n'en est pas un mais bon ça m'étonnerai que le code reste encore longtemps
-3- c'est un repository ici pas un forum si tu veux poster une source pour avoir des correction/améliorations/avis sur un code qui n'est pas fini poste le dans le forum et non pas ici la section code c'est pour des codes fonctionnel

@ tchaOo°
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
24 juin 2009 à 21:30
Concernant le premier code
j'ai oublié de supprimer la ligne où se trouve la variable $_session['pageencour'] puisque j'ai pas utilisé cette variable
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
24 juin 2009 à 21:23
aller j'attends vos conseils
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
24 juin 2009 à 21:15
Salut

merci bien pour ces commentaires
c vrai je suis pas très initié en php vu que j'ai commencé avec ce langage il y 'a seulement 3 mois mais je pense que je pourrais m'en sortir peu à peu "je bosse pas comme développeur"

en faites j'ai tenté d'utiliser les variable session dans le code, est ça bien marché mais franchement je pense que je resterai sur l'utilisation des requêtes sql vu que c'est pas logique de sauvegarder tout le contenue de la base dans une table

voici donc le nouveau code

*** nouvelle Base ****
CREATE TABLE IF NOT EXISTS `contact` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`firstname` varchar(30) NOT NULL,
`lastname` varchar(30) NOT NULL,
`country` varchar(30) NOT NULL,
`langue` varchar(30) NOT NULL,
`organization` varchar(30) NOT NULL,
`title` varchar(30) NOT NULL,
`address` text NOT NULL,
`mail` varchar(40) NOT NULL,
`phone` varchar(20) NOT NULL,
`fax` varchar(20) NOT NULL,
`directline` varchar(20) NOT NULL,
`mobile` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

*** Index ****
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
<style type="text/css">
<!--
body {
background-color: #999999;
}
-->
</style></head>
<?php
mysql_connect('localhost','root');
mysql_select_db('b_contact');
session_start();
if (isset($_POST['new']))
{
$fname="";
$lname="";
$country="";
$langue="";
$org="";
$title="";
$add="";
$mail="";
$phone="";
$fax="";
$directl="";
$mobile="";

}
if (isset($_POST['bt_modif']))
{
$_SESSION['id'] = $_POST['id'];
$id=$_SESSION['id'];
$sql="select * from contact where `id`=$id";
$req=mysql_query($sql);
$res=mysql_fetch_array($req);
$fname=$res['firstname'];
$lname=$res['lastname'];
$country=$res['country'];
$langue=$res['langue'];
$org=$res['organization'];
$title=$res['title'];
$add=$res['address'];
$mail=$res['mail'];
$phone=$res['phone'];
$fax=$res['fax'];
$directl=$res['directline'];
$_SESSION['modif']=1;
}
if (isset($_POST['save']))
{
$fname=$_POST['fname'];
$lname=$_POST['lname'];
$country=$_POST['country'];
$langue=$_POST['langue'];
$org=$_POST['org'];
$title=$_POST['title'];
$add=$_POST['add'];
$mail=$_POST['mail'];
$phone=$_POST['phone'];
$fax=$_POST['fax'];
$directl=$_POST['directl'];
$mobile=$_POST['mobile'];
}

?>

[liste.php?page=1&firstload=1&affall LISTE]





<form name=\"fcontact\" action=\"index.php\" method=\"post\">
----

,

----

<label for="fname">First Name :</label>,
" />,

----

<label for="lname">Last Name :</label>,
<label>
" />
</label>,

----

<label for="country">Country :</label>,
<label>
" />
</label>,

----

<label for="langue">Langue :</label>,
<label>
" />
</label>,

----

<label for="org">Organisation :</label>,
<label>
" />
</label>,

----

<label for="title">Title :</label>,
<label>
"/>
</label>,

----

<label for="add">Address :</label>,
<label>
"></textarea>
</label>,

----

<label for="mail">E-Mail :</label>,
<label>
"/>
</label>,

----

<label for="phone">Phone :</label>,
<label>
"/>
</label>,

----

<label for="fax">Fax :</label>,
<label>
"/>
</label>,

----

<label for="directl">Direct Line :</label>,
<label>
"/>
</label>,

----

<label for="mobile">Mobile :</label>,
<label>
" />
</label>,

----

<label>

</label> <label>

</label>,

</form>

<?php
if (isset($_POST['save']))
{
if (isset($_SESSION['modif']))
{
$id=$_SESSION['id'];
echo $id;
$sql="update contact set `firstname`='$fname', `lastname`='$lname', `country`='$country', `langue`='$langue', `organization`='$org', `title`='$title', `address`='$add', `mail`='$mail', `phone`='$phone', `fax`='$fax', `directline`='$directl', `mobile`='$mobile' where `id`=$id";
$req=mysql_query($sql);
}
else
{
mysql_connect("localhost","root") or die("error when connecting to server");
mysql_select_db('b_contact') or die("error when connecting to data base");

$sql= "insert into contact (`firstname`,`lastname`,`country`,`langue`, `organization`,`title`,`address`,`mail`,`phone`,`fax`,`directline`,`mobile`) values('$fname','$lname','$country','$langue','$org','$title','$add','$mail','$phone','$fax','$directl','$mobile')";

$req=mysql_query($requete);
}
}
?>


</html>
***************************

******Liste.php************
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
<style type="text/css">
<!--
.Style1 {
color: #FFFFFF;
font-size:14px;

}
.Style2 {
color: #000000;
font-size:14px;

}
body {
background-color: #999999;
}
-->
</style>
</head>
<?php
function affichmenu($page,$nbpage)
{
if (($page==1) && ($nbpage > 1)) // si on est à la premiére page et que le nb de pages pour afficher les enregistrement est supérieure à 1 on affiche seulemlent le lien "suivant >>" qui peut étre un bouton
{
$next=$page+1;
echo '';
echo '----
';
echo \", \";
echo \"\";
//echo \"SUIVANT >>\";
//$_SESSION['pageencour']=2;
}
else
{
if ($page < $nbpage ) // si $page est inférieur au nb totale des page donc on affiche suivant>> et <';
echo '----
';
echo \", \";
echo \", \";
echo \", \";
echo \", \";
echo \"\";
// echo \"<< precédent \";
//echo \" SUIVANT >>\";
}
else
{
if (($page >= $nbpage) && ($nbpage > 1))// si on n'est à la dérniére page et que le nb totale de page est sup à on affiche seulement <';
echo '----
';
echo \", \";
echo \"\";
}
}

}

}

?>

<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">
----



<form name=\"fsearch\" action=\"liste.php?page=1&affsearch\" method=\"post\" id=\"fsearch\">
----

<label>

Country

Organization

E-Mail

</label>,
,

----

Recherche :,
<label>

</label>,
<label>

</label>,

</form>



<?php
mysql_connect('localhost','root');
mysql_select_db('b_contact');
session_start();

if (isset($_POST['affall']))
{
$url='location:liste.php?page=1&firstload=1&affall';
header($url);
}

if ((isset($_GET['firstload'])) or (isset($_POST['bt_cherche'])))
{
//la requéte que j'ai choisi va selectionner tout le contenue de la base

if (isset($_GET['firstload']))
{
$sql1="select * from contact";
}
elseif (isset($_POST['bt_cherche']))
{
if (!(empty($_POST['strcherche'])))
{
$strcherche=$_POST['strcherche'];
$choix=$_POST['choix'];
$sql1="select * from `contact` where `".$choix."`='$strcherche'";
}
else
{
$msgerr="vous devez noter quelque chose dans le champ de recherche avant de lancher une recherche";
}
}

if (!(isset($msgerr)))
{
$req1=mysql_query($sql1);
$_SESSION['nbtotal']=mysql_num_rows($req1);

if ($_SESSION['nbtotal']==0)
{
if (isset($_GET['firstload']))
{
echo "Pas d'enregisrement vous devez saissir au moin un enregistrement";
echo " RETOUR ";
}
elseif (isset($_POST['bt_cherche']))
{
echo "pas de résultat";
echo " RETOUR ";
}
}
else
{
$_SESSION['allreg']=array();
$_SESSION['allreg']['fname']=array();
$_SESSION['allreg']['lname']=array();
$_SESSION['allreg']['country']=array();
$_SESSION['allreg']['langue']=array();
$_SESSION['allreg']['organization']=array();
$_SESSION['allreg']['title']=array();
$_SESSION['allreg']['address']=array();
$_SESSION['allreg']['mail']=array();
$_SESSION['allreg']['phone']=array();
$_SESSION['allreg']['fax']=array();
$_SESSION['allreg']['directline']=array();
$_SESSION['allreg']['mobile']=array();
$_SESSION['allreg']['id']=array();
$i=0;

while($data=mysql_fetch_array($req1)) // parcourir le résultat de la requéte
{
$_SESSION['allreg']['fname'][$i]=$data['firstname'];
$_SESSION['allreg']['lname'][$i]=$data['lastname'];
$_SESSION['allreg']['country'][$i]=$data['country'];
$_SESSION['allreg']['langue'][$i]=$data['langue'];
$_SESSION['allreg']['organization'][$i]=$data['organization'];
$_SESSION['allreg']['title'][$i]=$data['title'];
$_SESSION['allreg']['address'][$i]=$data['address'];
$_SESSION['allreg']['mail'][$i]=$data['mail'];
$_SESSION['allreg']['phone'][$i]=$data['phone'];
$_SESSION['allreg']['fax'][$i]=$data['fax'];
$_SESSION['allreg']['directline'][$i]=$data['directline'];
$_SESSION['allreg']['mobile'][$i]=$data['mobile'];
$_SESSION['allreg']['id'][$i]=$data['id'];
$i++;
}
}
}
}

if (isset($_GET['affall']))
{

// Afficher le résultat d'une requéte sql sur plusieures page
//$limite est le nb d'enregistrement par page ,
$limite=4;
$page=$_GET['page']; //$_get['page'] est une variable qui passera dans le lien , elle commence à 1 donc pour accéder par exemple à lapage liste.php il faut ajouter au lien ?page=1
$j=($page-1)*$limite;
?>
Nom,
Prenom,
Country,
Langue,
Organization,
Title,
Adresse,
Mail,
Phone,
Fax,
Direct_l,
Mobile,
Action 1,
Action 2,

<?php
$bgcolor=\"#cccccc\";
for($j;$j<($page*$limite);$j++) // parcourir le résultat de la requéte
{
?>
----
\" align=\"center\" valign=\"middle\">
<?php echo $_SESSION['allreg']['fname'][$j] ?>,
<?php echo $_SESSION['allreg']['lname'][$j] ?>,
<?php echo $_SESSION['allreg']['country'][$j] ?>,
<?php echo $_SESSION['allreg']['langue'][$j] ?>,
<?php echo $_SESSION['allreg']['organization'][$j] ?>,
<?php echo $_SESSION['allreg']['title'][$j] ?>,
<?php echo $_SESSION['allreg']['address'][$j] ?>,
<?php echo $_SESSION['allreg']['mail'][$j] ?>,
<?php echo $_SESSION['allreg']['phone'][$j] ?>,
<?php echo $_SESSION['allreg']['fax'][$j] ?>,
<?php echo $_SESSION['allreg']['directline'][$j] ?>,
<?php echo $_SESSION['allreg']['mobile'][$j] ?>,

<form name="modif" action="index.php?modif" method="post">

" />
</form>,
<form name="delete" action="" method="post">

" />
</form>,

<?php
if (($j+1)==$_SESSION['nbtotal']) {$j=$page*$limite;} //si on atteind le nombre totale d'enregistrement on doit donc quitter la boucle
//changement du couleur des cellule
if ($bgcolor==\"#cccccc\") {$bgcolor=\"#FFFFFF\";}
else {$bgcolor=\"#cccccc\";}

}
echo "
";
$nbpage=$_SESSION['nbtotal']/$limite; //calcule de nombre de page
$_SESSION['affichage']="affall";
affichmenu($page,$nbpage);

}

elseif (isset($_GET['affsearch']))
{
if (isset($msgerr))
{
echo $msgerr ;
}
else
{
if ($_SESSION['nbtotal']!=0)
{
$limite=3;
$page=$_GET['page']; //$_get['page'] est une variable qui passera dans le lien , elle commence à 1 donc pour accéder par exemple à lapage liste.php il faut ajouter au lien ?page=1
$j=($page-1)*$limite;
?>
Nom,
Prenom,
Adresse,
Phone,
E-Mail,
Action 1,
Action 2,

<?php
$bgcolor=\"#cccccc\";
for($j;$j<($page*$limite);$j++) // parcourir le résultat de la requéte
{
?>
----
\">
<?php echo $_SESSION['allreg']['nom'][$j] ?>,
<?php echo $_SESSION['allreg']['prenom'][$j] ?>,
<?php echo $_SESSION['allreg']['adresse'][$j] ?>,
<?php echo $_SESSION['allreg']['phone'][$j] ?>,
<?php echo $_SESSION['allreg']['email'][$j] ?>,
,
,

<?php

if (($j+1)==$_SESSION['nbtotal']) {$j=$page*$limite;} //si on atteind le nombre totale d'enregistrement on doit donc quitter la boucle
if ($bgcolor==\"#cccccc\") {$bgcolor=\"#FFFFFF\";}
else {$bgcolor=\"#cccccc\";}

}

$nbpage=$_SESSION['nbtotal']/$limite; //calcule de nombre de page
$_SESSION['affichage']=\"affsearch\";
affichmenu($page,$nbpage);
}
}

}
?>

<table width=\"200\" border=\"1\">





</html>
************************
zeroug Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 21 avril 2009
24 juin 2009 à 15:40
ne pas tenir compte de ces lignes :
//permet de lister les contact en fonction du statut du demandeur
mysql_select_db($database_affectation, $affectation);
zeroug Messages postés 5 Date d'inscription mercredi 19 février 2003 Statut Membre Dernière intervention 21 avril 2009
24 juin 2009 à 15:13
Excusez mais ça ça irais aussi bien non ?

<?php
mysql_connect('localhost','root');
mysql_select_db('agenda');


$currentPage = $_SERVER["PHP_SELF"];

$maxRows_contact = 20;
$pageNum_contact = 0;
if (isset($_GET['pageNum_contact'])) {
$pageNum_contact = $_GET['pageNum_contact'];
}
$startRow_contact = $pageNum_contact * $maxRows_contact;

//permet de lister les contact en fonction du statut du demandeur
mysql_select_db($database_affectation, $affectation);
$query_contact = "SELECT * FROM contact";
$query_limit_contact = sprintf("%s LIMIT %d, %d", $query_contact, $startRow_contact, $maxRows_contact);
$contact = mysql_query($query_limit_contact, $affectation) or die(mysql_error());
$row_contact = mysql_fetch_assoc($contact);

if (isset($_GET['totalRows_contact'])) {
$totalRows_contact = $_GET['totalRows_contact'];
} else {
$all_contact = mysql_query($query_contact);
$totalRows_contact = mysql_num_rows($all_contact);
}
$totalPages_contact = ceil($totalRows_contact/$maxRows_contact)-1;

$queryString_contact = "";
if (!empty($_SERVER['QUERY_STRING'])) {
$params = explode("&", $_SERVER['QUERY_STRING']);
$newParams = array();
foreach ($params as $param) {
if (stristr($param, "pageNum_contact") == false &&
stristr($param, "totalRows_contact") == false) {
array_push($newParams, $param);
}
}
if (count($newParams) != 0) {
$queryString_contact = "&" . htmlentities(implode("&", $newParams));
}
}
$queryString_contact = sprintf("&totalRows_contact=%d%s", $totalRows_contact, $queryString_contact);
?>


Nom,
Prénom,
Adresse,
Phone,
Email,

<?php do { ?>
----

<?php echo $row_contact['nom']; ?>,
<?php echo $row_contact['prenom']; ?>,
<?php echo $row_contact['adresse']; ?>,
<?php echo $row_contact['phone']; ?>,
<?php echo $row_contact['email']; ?>

<?php if ($pageNum_contact > 0) { // Show if not first page ?>
">
<?php } // Show if not first page ?>,
<?php if ($pageNum_contact > 0) { // Show if not first page ?>
">
<?php } // Show if not first page ?>,
<?php if ($pageNum_contact < $totalPages_contact) { // Show if not last page ?>
">
<?php } // Show if not last page ?>,
<?php if ($pageNum_contact < $totalPages_contact) { // Show if not last page ?>
">
<?php } // Show if not last page ?>


</html>
<?php
mysql_free_result($contact);
?>
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
24 juin 2009 à 00:56
Il faut savoir progresser doucement? certes, mais que fait cette source dans la catégorie 'inicié' alors?
Sans vouloir être méchant, ce genre d'algo, c'est ce que l'on apprend en classe.

En plus, la gestion du suivant, précédent est surchargée. Comme on peut le voir, le numéro de la page en cour est stockée en session. Donc celà ne sert à rien de recalculer la valeur de next et prev à chaque appel. Il suffit de mettre :

//impératif : s'assurer de la validité de ses variables...
// d'abord on vérifie que l'on a bien plusieurs pages
if($nbpage==0)
{
die('pas de résultats');
}
elseif($nbpage==1)
{
//si une seule page, page en cour est forcément la première quelque soit sa valeur
//actuelle
$_SESSION['pageencour'] = 0; // hé oui, les listes commencent à 0 il faut s'y faire... progressivement
}
//ensuite on vérifie que le pointeur de la session n'est pas erroné,
//ou bien que la liste à afficher n'a pas évoluée entre temps (suppression d'enregistrements...)
if($_SESSION['pageencour'] >= $nbpage)
{
$_SESSION['pageencour'] = ($nbpage-1); // on se recale sur la dernière page
}

// arrivé là, on sait que tout va bien
// donc on peut commencer

// si on est pas sur la première page (c'est donc qu'il y en a d'autre)
if(($_SESSION['pageencour'] != 0)
{
echo "<< precedent ";
}
// si on est pas sur la dernière page
if(($_SESSION['pageencour'] != ($nbpage-1))
{
echo ">> suivant ";
}

////////////////////////////////////////////////////////
////////////////////////////////////////////////////////

Ensuite, il faut éviter de commencer les liste à partir de '1' car si on regarde les deux instructions suivantes tirées du source:
# $page=$_GET['page']; //$_get['page'] est une variable qui passera dans le lien , elle commence à 1 donc pour accéder par exemple à la page liste.php il faut ajouter au lien ?page=1

# $debut=($page-1)*$limite; // $debut à partir de quel enregistrement commence la selection dans notre cas si $page=1 $debut=0 / si $page=2 $debut=(2-1)*3 = 3

on se rend compte que si la liste commençait à '0', il n'y aurait pas besoin de faire ($page-1)

Bon je m'arrête là.
Tout ça pour répondre que : oui, il est important de s'améliorer... progressivement, mais il faut aussi reconnaitre son niveau et classer ses sources dans la bonne catégorie et surtout ne pas utiliser les sessions pour stocker les résultat de requêtes mysql...

Tout aussi cordialement
neo1602brice Messages postés 77 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 10 juillet 2009
23 juin 2009 à 23:56
Bonjour,

Je viens de voir les commentaires posés depuis mon dernier, et oui effectivement, l'idéal serait de passer par des classes voir même par le design pattern iterator, mais je trouve que pour une 1ere source de karimmass c'est bon un début... il faut savoir progressé doucement mais surement sans trop pressé non plus....

Cordialement,
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
23 juin 2009 à 22:53
Salut,

J'ai eu un peu la même réaction que Morpheus... J'ai commencé par avoir peur, voir rouge, la pression montait comme une cocotte minute, pis pfffffffiiiiouuu, MasterNico a enlevé la soupape.

Euh donc... Pour faire de la pagination, ce code est beaucoup trop spécifique à un cas. L'idéal serait une classe qui itère sur un itérateur (par exemple un LimitIterator : http://php.net/limititerator ).
Le code s'en trouverait allégé, serait plus clair, plus facile à maintenir, etc.

Là, dans cette soruce on a la connexion au serveur MySQL, dont on n'a rien à faire pour de la pagination. On a la structure d'une table, idem, on s'en cogne royal.
Le titre de la source est "généraliste", la source elle-même ne l'est absolument pas.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
23 juin 2009 à 04:01
Sinon pour le code... portions de code redondant notament la phase de connection au serveur mysql... c'est inutile de mettre se code dans chaque page il faut externaliser certaine routine tu gagnera de la place et surtout du temps pour la maintenance (imagine tu change de mdp de connexion à ta bdd et tu a 150 pages à modifier)...

Multiple echo inutile... un avis perso que tout le monde ne partagera pas (eternel débat lol) met tes cahine de caractères entre simple quote et utilise la concaténation ( echo 'blabla '.$mavar.' blabla'; ) tu y gagnera en lisibilité...

Pas de gestion d'erreur notament en ce qui concerne ta routine de connexion et ton requetage... ça c'est bien en local mais pas au delà si ton serveur plante ou si ta requete foire c'est woualou... .. .

if(($req1 = mysql_query($sql1)) !== false)
// pas d'erreur

et

if(($nbtotal = mysql_num_rows($req1)) > 0)
// on a des résultats

Pour ta boucle...

while($data=mysql_fetch_array($req))

>>

while(($data = mysql_fetch_array($req)) !== false)

Sauf cas particulier évite d'utiliser le joker * dans tes requetes sql si tu connais les champs dont tu as besoin...

SELECT nom,prenom,adresse,phone,email FROM ...

ca fera un poil de boulot en plus pour toi mais bien moins pour le serveur sql...

Echappe tes entités html pour l'affichage...

< : <
> : >

Sinon tu risque d'avoir des surprises un de ces 4... .. .

Voili voilou en gros ce qui me saute aux yeux d'un premier abord... .. .

@ tchaOo°
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
23 juin 2009 à 03:47
++

Je rajouterais que l'on ne peux passer des données d'une page à l'autre via les globales ces dernières étant globale au script en cours, et uniquement au script en cours, elle sont comme toutes les autres variables détruite en fin d'exécution l'utilisation des globales n'est pas à proprement parlé déprécié c'est l'utilisation de certaines globale notament les $HTTP_*_VARS qui l'est... $_SESSION n'est rien de plus qu'une globale... .. . ;o)

l'appel de serialize/unserialize sur la variable de session est inutile php le fait avant de transmettre les données au serveur http et à l'ouverture de session... .. .

@ tchaOo°
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
22 juin 2009 à 20:13
Salut,

Heureusement que j'ai vu le dernier commentaire de MASTERNICO parce que franchement mettre tout les résultats d'un requête SQL dans une session ne me semble pas du tout une bonne idée.
Aux arguments cités précedemment, j'ajouterais que la taille de la session par utilisateur est limitée. Donc plus tu vas faire enregistrer des résultats dans ta session plus la taille de celle ci va augmenter et risquer d'atteindre sa limite.

De plus, quand tu regardes le fonctionnement de certains CMS (Joomla ou autres), il y a au moins 15 requêtes lancées pour afficher une page... et tout cela marche très bien.
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
22 juin 2009 à 08:00
Salut,
je ne suis pas tout à fait d'accord avec la solution de stocker le résultat du tableau dans la session.

La première raison est que si le résultat tien sur plusieurs millier d'enregistrement, cela occupe de la place en mémoire coté serveur. Et cet emplacement mémoire occupé se multiplie par autant de personnes affichant le résultat. Cela peut entrainer une surcharge de la mémoire en un rien de temps.

La deuxième raison est que le moteur mysql peut générer des milliers de requêtes en un rien de temps. Donc l'utilisation des sessions pour économiser le moteur ne me semble pas justifiée. Si vraiment vous avez peur de surcharger le moteur mysql, il suffit de mettre en place le cache des requêtes. Cela permet de maintenir le résultat d'une requête en mémoire, résultat qui pourra être resservi instantanément au client suivant sans occasionner une surcharge du moteur.

Vous me demanderez certainement quelles différences il y a entre maintenir le résultat de la requête en mémoire cache ou en mémoire session? Les deux sont en mémoire mais la variable session est persistante. Tant que la session n'est pas détruite, les variables stockées restent accessibles (une session mal paramétrée peut durer ad vidam eternam). Alors que si on utilise le cache mysql, le résultat de la requête n'occupe qu'un emplacement mémoire (cache requête). Et comme les variables php sont volatiles, elles sont détruites à la fin de l'exécution du script, ce qui n'entraine pas de surcharge de la mémoire.

Donc, et pour faire d'une histoire longue une histoire courte, il faut privilégier le cache des requêtes au niveau mysql et ne garder les variables de sessions que pour stocker des informations propre à l'utilisateur en cour (comme on peut le faire avec un cookie)
Vonscott Messages postés 61 Date d'inscription vendredi 6 janvier 2006 Statut Membre Dernière intervention 19 septembre 2011
19 juin 2009 à 10:36
Salut,

Pour les variables session array, n'oublie pas serialize() et unserialize()

Bonne journée
neo1602brice Messages postés 77 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 10 juillet 2009
18 juin 2009 à 22:48
Bonjour,

Il n'y a pas de quoi karimass. Une variable de session se considère comme une variable standard.
Heureux de t'avoir aidé.

Cordialement,
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
18 juin 2009 à 22:44
merci bien neo1602brice
je connais presque bien les variable session qui passe d'une page à une autre
mais je savais pas qu'il est possible de déclarer une variable session comme tableau
merci bien donc pour ton idée
je vais donc essayer de modifier le code :) :)
neo1602brice Messages postés 77 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 10 juillet 2009
18 juin 2009 à 22:08
Bonjour,

Oui je suis bien d'accord avec toi TropNul, j'ai déjà une source du même style que j'ai appliqué sur un site de production qui est encapsulé dans une classe évidemment.

Cordialement,

Néo1602Brice
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
18 juin 2009 à 20:35
Bonjour,

C'est de la pagination en somme. En l'état, le code source est assez difficile à intégrer sur un site de production. Il serait donc plus judicieux d'encapsuler tout cela dans une classe.

Cordialement

nb : fais une recherche sur "pagination php" pour d'autres exemples
neo1602brice Messages postés 77 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 10 juillet 2009
18 juin 2009 à 20:09
Bonjour,

Alors tout d'abord tu fais un session_start() au début de ton fichier
puis après tu appel tes variables comme ca $_SESSION['result']=array() par exemple, je te conseil d'aller faire un tour sur le site de fr.php.net via le lien suivant pour en savoir plus sur les session http://fr.php.net/manual/fr/book.session.php
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
18 juin 2009 à 19:46
en faites comment declaré une variable session comme étant tableau
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
18 juin 2009 à 19:44
merci encore pour cette conseille
je vais essayer d'y appiliquer
neo1602brice Messages postés 77 Date d'inscription dimanche 27 avril 2003 Statut Membre Dernière intervention 10 juillet 2009
18 juin 2009 à 18:40
Bonjour,

Je ne trouve pas ta solution très intéressante pour une raison particulière:
1. A chaque changememt de page, tu refais une requête, ce qui au final pourrait entrainer une surchage au niveau de ton serveur mysql...

Une solution qui pourrait être plus pratique, serait que tu fasses une seule fois ta requête, que tu stockes le résultat par exemple en session(préfable) ou en global(déprécié). Ensuite tu paramètres une variable pour afficher le nombre de résultat par page et à chaque changement de pages, tu parcours uniquement ton tableau session ou globales en prenant en compte le paramètre pour le nombre de résultat..

Cordialement,

Néo1602Brice
karimmass Messages postés 9 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 25 juin 2009
18 juin 2009 à 17:36
merci bien DJMMIX pour tes conseille
djmmix Messages postés 152 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 29 avril 2009
18 juin 2009 à 17:16
salut,
je vois pas trop ce que cette source apporte mais bon.

ici: 87.$sql="insert into contact (`nom`,`prenom`,`adresse`,`phone`,`email`) values('$nom','$prenom','$adresse','$tel','$email')"; dans values test variable précèdent les avec la fonction mysql_real_escape_string() pour evité les injections SQL et pourquoi déclaré des variables alors que tu aurai pu mettre directement dans values : values(mysql_real_escape_string($_POST['nom']), etc...)
plus rapide et moins de traitement php (même si il est infime)^^

ha et uniformise tes Minuscule/Majuscule pas genre :"SUIVANT précédent"

@++
Rejoignez-nous