Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête compliquée + Script de pagination

Je ne sais pas dans quelle mesure cela vous aidera, mais

1.) Où est défini votre $uid ? Peut-être que c'était là et que je l'ai raté parce que vous aviez BEAUCOUP de code. S'il a été défini dans un contrôleur ou un autre type de fichier intermédiaire, alors peut-être que lorsque vous avez changé de page, l'uid n'a pas été défini ?

2.) Si vous utilisez plusieurs fois la même pagination, créez-la dans une fonction.

Je suppose que les résultats que vous avez obtenus étaient corrects en utilisant la requête que vous utilisiez, le seul problème était qu'il n'affichait pas les résultats corrects sur d'autres pages. Si tel est le cas, utilisez cette fonction que j'ai modifiée. (Vous devrez peut-être le modifier vous-même, par exemple votre page peut ne pas lire domain.com/pg=3 comme le mien)

function Pagination($list, $limit){

global $pagination;
global $total_pages;
global $pg;
global $offset;
global $page_limit;
$page_limit = $limit;
global $total_results;
$total_results = $list;

global $offset;

// number of rows to show per page
// find out total pages
$total_pages = ceil($list / $limit);

// get the current page or set a default
if ($pagination) {
   // cast var as int
   $pg = $pagination;
} else {
   // default page num
   $pg = 1;
} // end if

// if current page is greater than total pages...
if ($pg > $total_pages || $pg == "last") {
   // set current page to last page
   $pg = $total_pages;
} // end if
// if current page is less than first page...
if ($pg <= 1 || $pg == "first") {
   // set current page to first page
   $pg = 1;
} // end if

// the offset of the list, based on current page 
$offset = ($pg - 1) * $limit;

// get the info from the db 
}


function PaginationLinks($url, $tab){

global $pg;
global $total_pages;
global $total_results;
global $page_limit;
global $offset;


$displayed_results = ($total_results - $offset);

if($displayed_results >= $page_limit && $total_results > $page_limit){
$displayed_results = $page_limit;
}




/******  build the pagination links ******/
// range of num links to show
$range = 5;

if($tab){
$tab = "?$tab";
}

// if not on page 1, don't show back links
if ($pg > 1) {
   // show << link to go back to page 1
   echo "<li class='pagination'><a href='$url/pg=first$tab'><<</a></li>";
   // get previous page num
   $prevpage = $pg - 1;
   // show < link to go back to 1 page
   echo "<li class='pagination'><a href='$url/pg=$prevpage$tab'><</a></li>";
} // end if 

// loop to show links to range of pages around current page
for ($x = ($pg - $range); $x < (($pg + $range) + 1); $x++) {
   // if it's a valid page number...
   if (($x > 0) && ($x <= $total_pages)) {
      // if we're on current page...
      if ($x == $pg) {
         // 'highlight' it but don't make a link
         echo "<li class='current_page'>$x</li>";
      // if not current page...
      } else {
         // make it a link
         echo "<li class='pagination'><a href='$url/pg=$x$tab'>$x</a></li>";
      } // end else
   } // end if 
} // end for

// if not on last page, show forward and last page links        
if ($pg != $total_pages) {
   // get next page
   $nextpage = $pg + 1;
    // echo forward link for next page 
   echo "<li class='pagination'><a href='$url/pg=$nextpage$tab'>></a></li>";
   // echo forward link for lastpage
   echo "<li class='pagination'><a href='$url/pg=last$tab'>>></a></li>";
} // end if
/****** end build pagination links ******/

echo "<div style='float:right; align: right; margin-top: 10px'>Displaying <font class='f2'>$displayed_results</font> of <font class='f2'>$total_results</font> results</div>";
} // end pagination links function

Pour utiliser : (J'utilise la table "utilisateurs" de base car elle est simple)

Écrivez une requête pour obtenir le nombre total de lignes pour tout ce que vous recherchez. Exemple :

$getusers = mysql_query("SELECT * FROM users", $conn);
$total_users = mysql_num_rows($getusers)

$display_limit = "20" // display 20 users per page

puis utilisez la première fonction.

Pagination($total_users, $display_limit);

puis exécutez à nouveau la requête, mais définissez les limites cette fois-ci afin que seuls 20 utilisateurs s'affichent par page.

$getusers = mysql_query("SELECT * FROM users ORDER BY id DESC LIMIT $offset, $display_limit", $conn);

if($total_users == 0){
echo "There are no users at this time.";
}
else {

// for each user
while ($rowuserss = mysql_fetch_assoc($getusers)) {
   // echo data

$user_id = $rowusers['id'];
$username = $rowusers['username'];

// etc etc
}

Ensuite pour afficher les liens, utilisez la seconde requête

PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab);

Cela devrait fonctionner pour TOUTE requête, quelle que soit sa complexité, tant que votre requête est correcte au départ. Il me semblait que votre requête était correcte, seuls les résultats s'affichaient sur la deuxième page. Quoi qu'il en soit, si cette fonction ne fonctionne pas pour vous, vous devez toujours créer votre pagination dans sa propre fonction, c'est trop de code à écrire à plusieurs endroits.