Mysql
 sql >> Database >  >> RDS >> Mysql

Query complicata + script di impaginazione

Non sono sicuro di quanto questo ti aiuterà, ma

1.) Dove è definito il tuo $uid? Forse era lì e me lo sono perso perché avevi MOLTO codice. Se è stato definito in un controller o in un altro tipo di file intermediario, forse quando hai cambiato pagina l'uid non è stato impostato?

2.) Se utilizzi la stessa paginazione più di una volta, creala in una funzione.

Presumo che i risultati che hai ottenuto fossero corretti utilizzando la query che stavi utilizzando, l'unico problema era che non mostrava i risultati corretti su altre pagine. Se questo è il caso, usa questa funzione che ho ottimizzato. (Potrebbe essere necessario modificarlo da solo, ad esempio la tua pagina potrebbe non leggere domain.com/pg=3 come fa la mia)

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

Utilizzare: (Sto usando la tabella "utenti" di base perché è semplice)

Scrivi una query per ottenere il numero totale di righe per quello che stai cercando. Esempio:

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

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

quindi usa la prima funzione.

Pagination($total_users, $display_limit);

quindi esegui di nuovo la query, ma questa volta imposta i limiti in modo che vengano visualizzati solo 20 utenti per pagina.

$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
}

Quindi per visualizzare i collegamenti, utilizza la seconda query

PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab);

Questo dovrebbe funzionare per QUALSIASI query, non importa quanto complicata, purché la query sia corretta per cominciare. Mi sembrava che la tua richiesta fosse corretta, solo i risultati venivano visualizzati nella seconda pagina. In ogni caso, se quella funzione non funziona per te, dovresti comunque creare la tua impaginazione nella sua funzione, è troppo codice per essere scritto in più di una posizione.