sql >> Database >  >> RDS >> Mysql

Ingewikkelde query + pagineringscript

Ik weet niet zeker hoeveel dit je zal helpen, maar

1.) Waar wordt uw $uid gedefinieerd? Misschien was het daar en heb ik het gemist omdat je VEEL code had. Als het werd gedefinieerd in een controller- of ander type tussenpersoonbestand, werd de uid misschien uitgeschakeld toen u van pagina veranderde?

2.) Als je dezelfde paginering meer dan eens gebruikt, maak er dan een functie aan.

Ik neem aan dat de resultaten die je kreeg correct waren met de zoekopdracht die je gebruikte, het enige probleem was dat het niet de juiste resultaten op andere pagina's weergaf. Als dat het geval is, gebruik dan deze functie die ik heb aangepast. (Misschien moet je het zelf aanpassen, je pagina leest bijvoorbeeld misschien niet domain.com/pg=3 zoals de mijne doet)

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

Te gebruiken: (Ik gebruik de standaard "gebruikers"-tabel omdat deze eenvoudig is)

Schrijf één zoekopdracht om het totale aantal rijen te krijgen voor wat u zoekt. Voorbeeld:

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

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

gebruik dan de eerste functie.

Pagination($total_users, $display_limit);

voer vervolgens de zoekopdracht opnieuw uit, maar stel de limieten deze keer zo in dat er slechts 20 gebruikers per pagina worden weergegeven.

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

Gebruik vervolgens de tweede zoekopdracht om de links weer te geven

PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab);

Dit zou moeten werken voor ELKE vraag, hoe ingewikkeld ook, zolang uw vraag maar correct is om mee te beginnen. Het klonk voor mij alsof je vraag correct was, alleen de resultaten werden weergegeven op de tweede pagina. Hoe dan ook, als die functie niet voor u werkt, moet u toch uw paginering in zijn eigen functie maken, dat is te veel code om op meer dan één locatie te hebben geschreven.




  1. MySQL-limiet met veel-op-veel-relatie

  2. Dynamisch databaseverbinding wijzigen in cakephp 3

  3. hoe te controleren of een string er willekeurig uitziet, of door mensen gegenereerd en uitspreekbaar is?

  4. Een Oracle-audit overleven