Complicated Query + Pagination Script

不羁的心 提交于 2020-01-14 03:18:27

问题


Problem 1: Pagination on my script is not working. After 20 entries, it only shows the most recent 20 entries and doesn't split them into different pages. Code is below:

Problem 2: I am using the same pagination script for something else and over there it splits correctly but on the next page it shows the same results from page 1. I am using the same script except for the second script the:

       $query = "SELECT COUNT(*) as num FROM table where id = 
      '$uid' ORDER BY id DESC"; 

and the SQL for that is:

       $sql="SELECT table_one.field_id, table_constant.field_name,
      table_one.field_2, table_one.field_3 FROM table_one LEFT 
      JOIN table_constant ON table_one.common_field 
      = table_constant.common_field WHERE table_constant.u_id = '$uid'"; 

Code:

 <?php

$tbl_name="";       //not using this since i am doing a union

$adjacents = 3;

$query = "SELECT COUNT(*) as num
    from table_one LEFT JOIN table_constant on table_one.c_id 
    = table_constant.c_id 
    where table_constant.user_id = '$uid'
    UNION
    SELECT COUNT(*) as num
    from table_two LEFT JOIN table_constant on table_two.c_id 
    = table_constant.c_id 
    where table_two.added_by = '$uid'
    UNION
    SELECT COUNT(*) as num
    from table_three LEFT JOIN table_constant ON table_three.c_id 
    = table_constant.c_id
    where table_constant.user_id = '$uid'
    UNION
    SELECT COUNT(*) as num
    from table_four LEFT JOIN table_constant ON table_four.c_id 
    = table_constant.c_id
    where table_constant.user_id = '$uid'
    ORDER BY date_time_added DESC";
$total_pages = mysql_fetch_array(mysql_query($query));
$total_pages = $total_pages[num];

$targetpage = "page.php"; 
$limit = 20;                                
$page = $_GET['page'];
if($page) 
    $start = ($page - 1) * $limit; //first item to display on this page
else
    $start = 0; //if no page var is given, set start to 0

$sql = "select table_one.field1, table_constant.field1, 
    table_one.field2, table_one.field3, table_one.field4, 
    table_one.field5, table_constant.c_id
    from table_one LEFT JOIN table_constant on table_one.field1 
    = table_constant.c_id 
    where table_constant.user_id = '$uid'
    UNION
    select table_two.field1, table_constant.field1, table_two.field2, 
    table_two.field3,    table_two.field4, table_two.field5, table_constant.c_id
    from table_two LEFT JOIN table_constant on table_two.c_id 
    = table_constant.c_id 
    where table_two.added_by = '$uid'
    UNION 
    select table_three.field1, table_constant.field1, table_three.field2, 
    table_three.field3, table_three.field4, table_three.field5,
    table_constant.c_id
    from table_three LEFT JOIN table_constant ON table_three.c_id 
    = table_constant.c_id
    where table_constant.user_id = '$uid'
    UNION
    select table_four.field1, table_constant.field1, table_four.field2, 
    table_four.field3, table_four.field4, table_four.field5, 
    table_constant.c_id
    from table_four LEFT JOIN table_constant ON table_four.c_id 
    = table_constant.c_id
    where table_constant.user_id = '$uid'
    ORDER BY date DESC LIMIT $start, $limit";
$result = mysql_query($sql);

    $query = mysql_query($sql) or die ("Error: ".mysql_error());

    $result = mysql_query($sql);

    if ($result == "")
    {
    echo "";
    }
    echo "";


    $rows = mysql_num_rows($result);

    if($rows == 0)
    {
    print("");

     }
     elseif($rows > 0)
      {
      while($row = mysql_fetch_array($query))
      {

      $fields = $row['field'];  //Table one Field 1
     $fields2 = $row['field']; //Table Constant Field 1
     $fields3 = $row['field'];// Table One field 4
     $fields4 = $row['field'];//Table Constant Field 2


    print("$fields<br>$fields2<br>$fields3<br>$fields4");
    }

    }


    if(mysql_num_rows($result) < 1) {
    echo "";
    }


/* Setup page vars for display. */
if ($page == 0) $page = 1;  //if no page var is given, default to 1.
                    //next page is page + 1
$lastpage = ceil($total_pages/$limit);  
   //lastpage is = total pages / items per page, 
   rounded up.
$lpm1 = $lastpage - 1;  //last page minus 1

/* 
Now we apply our rules and draw the pagination object. 
We're actually saving the code to a variable in case we 
    want to draw it more than once.
*/
$pagination = "";
if($lastpage > 1)
{   
    $pagination .= "<div class=\"pagination\"></div>";
    //previous button
    if ($page > 1) 
        $pagination.= "";
    else
        $pagination.= "";   

    //pages 
    if ($lastpage < 7 + ($adjacents * 2))   
           //not enough pages to bother breaking it up
    {   
        for ($counter = 1; $counter <= $lastpage; $counter++)
        {
            if ($counter == $page)

         $pagination.= "<span class=\"current\">$counter &nbsp</span>";
            else
                $pagination.= "<a id=\"numberhighlighter\" href=\"$targetpage?page=$counter\">$counter &nbsp</a>";                  
        }
    }
    elseif($lastpage > 5 + ($adjacents * 2))    //enough pages to hide some
    {
        //close to beginning; only hide later pages
        if($page < 1 + ($adjacents * 2))        
        {
            for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class=\"current\">$counter &nbsp</span>";
                else
                    $pagination.= "<a href=\"$targetpage?page=$counter\">$counter &nbsp </a>";                  
            }
            $pagination.= "...";
            $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>";
            $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";       
        }
        //in middle; hide some front and some back
        elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
        {
            $pagination.= "<a href=\"$targetpage?page=1\">1</a>";
            $pagination.= "<a href=\"$targetpage?page=2\">2</a>";
            $pagination.= "...";
            for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class=\"current\">$counter</span>";
                else
                    $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";                 
            }
            $pagination.= "...";
            $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>";
            $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";       
        }
        //close to end; only hide early pages
        else
        {
            $pagination.= "<a href=\"$targetpage?page=1\">1</a>";
            $pagination.= "&nbsp &nbsp &nbsp<a href=\"$targetpage?page=2\">2&</a>";
            $pagination.= "...";
            for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
            {
                if ($counter == $page)
                    $pagination.= "<span class=\"current\">$counter</span>";
                else
                    $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";                 
            }
        }
    }

    //next button
    if ($page < $counter - 1) 
        $pagination.= "";
    else
        $pagination.= "";       
}
              ?>
           <div id="page">
            <?php 

           print("$pagination");

              ?>

Thanks!


回答1:


I'm not sure how much this will help you, but

1.) Where is your $uid defined at? Perhaps it was there and I missed it because you had ALOT of code. If it was defined in a controller or other type of middleman file, then perhaps when you changed pages the uid got unset?

2.) If you are using the same pagination more than once then create it into a function.

I'm assuming the results you got were correct using the query you were using, the only issue with it was it didn't display the correct results on other pages. If that is the case then use this function I tweaked. (You may have to tweak it yourself, for example your page may not read domain.com/pg=3 like mine does)

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

To use: (I'm using the basic "users" table because it is simple)

Write one query to get the total number of rows for whatever you are looking for. Example:

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

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

then use the first function.

Pagination($total_users, $display_limit);

then run the query again but set the limits this time so that only 20 users display per 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
}

Then to display the links, use the second query

PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab);

This should work for ANY query no matter how complicated as long as your query is correct to begin with. It sounded to me like your query was correct, just the results were displaying on the second page. Any ways, if that function doesn't work for you, you should still create your pagination into it's own function, that's too much code to have written out in more than one location.



来源:https://stackoverflow.com/questions/6482025/complicated-query-pagination-script

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!