Pagination et trie de résultats

Résolu
space_dwarf Messages postés 14 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 10 juin 2010 - 26 mars 2010 à 16:46
space_dwarf Messages postés 14 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 10 juin 2010 - 10 avril 2010 à 18:53
Bonjour à tous,

Voilà je me présente, je suis étudiant en archéologie et je suis en train de réaliser un site internet pour pouvoir accéder facilement, et surtout de n'importe où, à mes données de Master.

Bref, mon site est déjà relativement bien avancé mais j'ai maintenant un problème. J'arrive sans problème à afficher tous les enregistrements de ma base avec une pagination n'affichant qu'un enregistrement à la fois et permettant de naviguer entre les autres.

Le problème, c'est qu'il me faudrait pouvoir trier les résultats (environ 200 objets dans ma base, ça fait un peu trop pour s'y retrouver ).
Je voudrai donc pouvoir cliquer sur un bouton pour afficher chaque type d'objet. Exemple : en cliquant sur "Rasoir", ça n'afficherai que les rasoirs.

Je pense que pour vous, c'est un jeu d'enfant, mais pour moi... C'est plutôt la galère (ça serai quand même pas mal qu'on ai quelques cours d'informatique en archéo...)

Voilà ma page, en espérant qu'une bonne âme me dépanne.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<?php require_once('connexion2.php'); ?><?php session_start(); // On relaye la session

if (session_is_registered("authentification")){ // vérification sur la session authentification (la session est elle enregistrée ?)
$login = $_SESSION['login'];

}

else {

header("Location:index.php?erreur=intru"); // redirection en cas d'echec

}

?>
  
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title>Accessoires de toilette en contexte funéraire dans le sud de
la France au premier âge du Fer</title>

  
  
  <link rel="stylesheet" type="text/css" href="style.css" />

</head>




Accessoires de toilette en contexte funéraire dans le sud de la
France au premier âge du Fer


Sujet d'étude de Master 1









  <li>[index.php Accueil]</li>
  <li id="active">[base4.php Base de données]</li>
  <li>[# Bibliographie]</li>
  <li>[# Contact]</li>












<li>[base4.php Afficher tout]</li>
<li>[base4.php?selection=rasoirs Rasoirs]</li>
<li>[base4.php?selection=scalptoria Scalptoria]</li>
<li>[base4.php?selection=pinces Pinces à épiler]</li>
<li>[base4.php?selection=curettes Curettes]</li>
<li>[base4.php?selection=trousses Trousses]</li>
<li>[# Recherche]</li>







<?php 

/*** AFFICHAGE CONDITIONNEL OU REDIRECTION EN FONCTION DU PRIVILEGE ***/

  // si l'utilisateur est connecté comme admin ...

  if($_SESSION['privilege'] == "admin") { ?>
<?php } // fin de l'affichage conditionnel?>

<?php // si l'utilisateur est connecté comme simple utilisateur ...

  if($_SESSION['privilege'] == "utilisateur") { 

mysql_select_db($database_dbprotect, $dbprotect);
$limit	= 1;
$offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
$sql_str = sprintf('SELECT SQL_CALC_FOUND_ROWS * FROM Accessoires_de_toilette LIMIT '.$offset.', '.$limit.' ');

$result = mysql_query($sql_str, $dbprotect) or die(mysql_error());
while ($data = mysql_fetch_assoc($result)) { ?>

Type d'objet :,
<?php echo''.$data['Type_objet'].''; ?>,

----

Lieu de découverte :,
<?php echo ''.$data['Lieu_de_decouverte'].''; ?>,

----

Matière :,
<?php echo ''.$data['Matiere'].''; ?>



<?php
}


$result	= mysql_query('SELECT FOUND_ROWS() AS total');
$data	= mysql_fetch_assoc($result);

function paging($page, $total_rows, $limit, $offset, $preserved_params = null){

$query = '';
$str_hidden = '';		
if (is_array($preserved_params)) {			
foreach ($preserved_params as $k=>$v) {
if ($k != 'offset') {
$query .= $k.'='.urlencode($v).'&amp;';
$str_hidden .= '';
}
}			
}

if (strpos($page, '?') !== false) {
$page = substr($page, 0, strpos($page, '?'));
}

$nb_pages = ceil($total_rows / $limit);		
$i = 0;
$j = 0;
$idx_page = 0;
while ($i < $total_rows) {
$tab_pages[$j]['id']	= $i;
$tab_pages[$j]['text']	= ($j + 1).' / '.$nb_pages;
if ((int)$offset >= $i) {
$idx_page = $j;
}
$i += $limit;
$j++;
}

$reponse = '<form class="barre-navigation-pages" action="'.$page.'">';
$page .= '?'.$query;
$page_actuelle = $offset + 1;				

if (($offset > 0) && !($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1]))) {
$reponse .= '['.$page.'&amp;offset='.($offset - $limit).' Précédent] [ '.$page_actuelle.' / '.$total_rows.' ] 

 ';
}		

else if (($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) && !($offset > 0)) {
$reponse .= ' [ '.$page_actuelle.' / '.$total_rows.' ] ['.$page.'offset='.$tab_pages[$idx_page + 1]['id'].' Suivant]

';
}

else if (($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) && ($offset > 0)) {
$reponse .= '['.$page.'&amp;offset='.($offset - $limit).' Précédent] [ '.$page_actuelle.' / '.$total_rows.' ] ['.$page.'offset='.$tab_pages[$idx_page + 1]['id'].' Suivant]

';
}

$reponse .= '</form>';
return $reponse;
}

echo paging('base4.php', $data['total'], $limit, $offset);

} // fin de l'affichage conditionnel?>


[index.php?erreur=logout Déconnexion]









</html>



PS : si vous voyez d'autres soucis dans mon code, surtout n'hésitez pas à le dire, je suis là pour apprendre

PPS : il y a une partie administrateur qui n'est pas encore utilisée, c'est tout à fait normal. J'attends déjà de réussir à tout afficher correctement avant d'essayer de modifier les enregistrements.
De même, la partie recherche n'a pas encore été codée (d'ailleurs il y a de fortes chances pour que je revienne dans les parage à ce moment là)

4 réponses

Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
2 avril 2010 à 19:31
J'avais pas bien lu ta fonction de pagination :
[b]/**
* Affiche la pagination
*
* @param string $page
* @param integer $total_rows
* @param integer $limit
* @param integer $offset
* @param array $preserved_params, permet de spécifier des paramètres supplémentaires
* à transmettre entre les pages array('param1'=>'valeur', 'param2'=>'valeur', [...])
* @return string
*//b
Moi j'avais passé les arguments direct dans la partie $page...

En fait tu peux changer ca :&
<?php
// START Gestion des sélections
$select = '';
if(isset($_GET['selection']))
{
$select = "?selection=".mysql_real_escape_string($_GET['selection']);
}
echo paging('base4.php'.$select, $data['total'], $limit, $offset);
// END Gestion des sélections
?>

Par
<?php
// START Gestion des sélections
$preserved_params = null;
if(isset($_GET['selection']))
{
$preserved_params = array('selection'=>mysql_real_escape_string($_GET['selection']));
}
echo paging('base4.php', $data['total'], $limit, $offset, $preserved_params);
// END Gestion des sélections
?>




_________________________________
Min iPomme
3
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
29 mars 2010 à 11:14
Hello,

J'ai pas vraiment le temps de commenter ce que j'ai fais mais pose moi des questions si tu comprends pas quelque-chose :

Ce que j'ai modifié se trouve entre

// START Gestion des sélections

et

// END Gestion des sélections

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php require_once('connexion2.php');
session_start(); // On relaye la session
if (session_is_registered("authentification"))
{
// vérification sur la session authentification (la session est elle enregistrée ?)
$login = $_SESSION['login'];
}
else
{
header("Location:index.php?erreur=intru"); // redirection en cas d'echec
}

?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Accessoires de toilette en contexte funéraire dans le sud de
la France au premier âge du Fer</title>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>





Accessoires de toilette en contexte funéraire dans le sud de la France au premier âge du Fer

Sujet d'étude de Master 1








  <li>[index.php Accueil]</li>
  <li id="active">[base4.php Base de données]</li>
  <li>[# Bibliographie]</li>
  <li>[# Contact]</li>










<li>[base4.php Afficher tout]</li>
<li>[base4.php?selection=rasoirs Rasoirs]</li>
<li>[base4.php?selection=scalptoria Scalptoria]</li>
<li>[base4.php?selection=pinces Pinces à épiler]</li>
<li>[base4.php?selection=curettes Curettes]</li>
<li>[base4.php?selection=trousses Trousses]</li>
<li>[# Recherche]</li>





<?php 
/*** AFFICHAGE CONDITIONNEL OU REDIRECTION EN FONCTION DU PRIVILEGE ***/
// si l'utilisateur est connecté comme admin ...
if($_SESSION['privilege'] == "admin")
{
}
// fin de l'affichage conditionnel?

// si l'utilisateur est connecté comme simple utilisateur ...
if($_SESSION['privilege'] == "utilisateur")
{ 
// START Gestion des sélections
$where = '';
if(isset($_GET['selection']))
{
$where " WHERE Type_objet '".mysql_real_escape_string($_GET['selection'])."' ";
}
// END Gestion des sélections

mysql_select_db($database_dbprotect, $dbprotect);
$limit	= 1;
$offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
// START Gestion des sélections
$sql_str = sprintf('SELECT SQL_CALC_FOUND_ROWS * FROM Accessoires_de_toilette '.$where.' LIMIT '.$offset.', '.$limit.' ');
// END Gestion des sélections

$result = mysql_query($sql_str, $dbprotect) or die(mysql_error());
while ($data = mysql_fetch_assoc($result))
{ ?>
Type d'objet :,
<?php echo''.$data['Type_objet'].''; ?>,

----

Lieu de découverte :,
<?php echo ''.$data['Lieu_de_decouverte'].''; ?>,

----

Matière :,
<?php echo ''.$data['Matiere'].''; ?>

<?php
}
$result	= mysql_query('SELECT FOUND_ROWS() AS total');
$data	= mysql_fetch_assoc($result);

function paging($page, $total_rows, $limit, $offset, $preserved_params = null){
$query = '';
$str_hidden = '';		
if (is_array($preserved_params)) {			
foreach ($preserved_params as $k=>$v) {
if ($k != 'offset') {
$query .= $k.'='.urlencode($v).'&amp;';
$str_hidden .= '';
}
}			
}

if (strpos($page, '?') !== false) {
$page = substr($page, 0, strpos($page, '?'));
}

$nb_pages = ceil($total_rows / $limit);		
$i = 0;
$j = 0;
$idx_page = 0;
while ($i < $total_rows) {
$tab_pages[$j]['id']	= $i;
$tab_pages[$j]['text']	= ($j + 1).' / '.$nb_pages;
if ((int)$offset >= $i) {
$idx_page = $j;
}
$i += $limit;
$j++;
}

$reponse = '<form class="barre-navigation-pages" action="'.$page.'">';
$page .= '?'.$query;
$page_actuelle = $offset + 1;				

if (($offset > 0) && !($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1]))) {
$reponse .= '['.$page.'&amp;offset='.($offset - $limit).' Précédent] [ '.$page_actuelle.' / '.$total_rows.' ] 

 ';
}		

else if (($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) && !($offset > 0)) {
$reponse .= ' [ '.$page_actuelle.' / '.$total_rows.' ] ['.$page.'offset='.$tab_pages[$idx_page + 1]['id'].' Suivant]

';
}

else if (($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) && ($offset > 0)) {
$reponse .= '['.$page.'&amp;offset='.($offset - $limit).' Précédent] [ '.$page_actuelle.' / '.$total_rows.' ] ['.$page.'offset='.$tab_pages[$idx_page + 1]['id'].' Suivant]

';
}

$reponse .= '</form>';
return $reponse;
}
// START Gestion des sélections
$select = '';
if(isset($_GET['selection']))
{
$select = "?selection=".mysql_real_escape_string($_GET['selection']);
}
echo paging('base4.php'.$select, $data['total'], $limit, $offset);
// END Gestion des sélections
} // fin de l'affichage conditionnel
?>


[index.php?erreur=logout Déconnexion]









</html>



_________________________________
Min iPomme
0
space_dwarf Messages postés 14 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 10 juin 2010
2 avril 2010 à 19:03
Merci beaucoup ! Ça marche nickel pour afficher les données en fonction de certains critères comme je le souhaitais.

Par contre nouveau problème que je n'arrive pas à surmonter malgré de nombreux bidouillage du code .

Lorsque je clique sur un des boutons pour m'afficher par exemple les pinces, il m'affiche bien le premier enregistrement puis la barre de navigation en bas, avec le nombre de pinces et le bouton suivant. Cependant, quand je clique sur suivant, je retourne dans l'affichage normal sans trie. Il m'affiche donc à nouveau tous les enregistrements.
Je sais à quoi c'est dû, mais pas comment y remédier. Vous allez me dire, c'est déjà un début :p

Bref, lorsque je trie mes résultats, j'ai ma sélection qui s'inscrit dans la suite du nom de ma page web.
Par exemple quand je clique sur rasoir, la page : base4.php?selection=rasoir se lance.
Le problème, c'est qu'à partir du moment où je navigue dans les enregistrements, cette sélection disparaît, d'où le retour à l'affichage sans trie.
Une nouvelle page se charge simplement avec : base4.php?offset=1

Je pensais que la ligne suivante :

$page .= '?'.$query;


permettait de transmettre la sélection, mais ce n'est pas le cas :(

Bref, après un bon moment de galère, nouvel appel à l'aide :)

En tout cas, merci beaucoup Tonio_35 ;)
0
space_dwarf Messages postés 14 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 10 juin 2010
10 avril 2010 à 18:53
Impeccable, cette fois-ci ça marche !

Hum... par contre j'hésite à demander une dernière chose... Je trouve que j'en ai déjà demandé un paquet depuis le début.
Bref, j'ai un dernier (léger) problème. Dans ma sélection, j'ai le terme "pince". Or, dans ma base, le type d'objet est "pince à épiler" (bah oui, mon master porte quand même sur la toilette...).
Donc voilà, comment faire pour lui faire rechercher les enregistrements qui comportent le terme pince suivi de quelques chose ?

J'ai bien tenté avec % mais soit je le met pas où il faut, soit ça n'est pas fait pour mon cas...

Mon essai :

// START Gestion des sélections
$where = '';
if(isset($_GET['selection']))
{
$where = " WHERE Type_objet LIKE '".mysql_real_escape_string($_GET['selection'])."%' ";
}
// END Gestion des sélections


J'ai alors comme erreur :

Warning: sprintf() [function.sprintf]: Too few arguments in /home/a4792629/public_html/base3.php on line 74
Query was empty

Une fois de plus, j'ai essayé de chercher un moment tout seul avant de demander à nouveau à l'aide, mais soit je cherche au mauvais endroit, soit c'est un problème un peu épineux pour un débutant...

Encore merci pour tout
0
Rejoignez-nous