2011-06-26 56 views
1

問題1:我的腳本分頁不起作用。在20個條目之後,它僅顯示最近的20個條目並且不將它們分成不同的頁面。代碼如下:複雜的查詢+分頁腳本

問題2:我正在使用相同的分頁腳本進行其他操作,並在那裏正確分割,但在下一頁它顯示了與第1頁相同的結果。我使用的腳本除外第二腳本:

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

和該SQL是:

 $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'"; 

代碼:

<?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"); 

       ?> 

謝謝!

回答

1

我不知道有多少,這將幫助你,但

1)凡在規定的$ UID?也許它在那裏,我錯過了,因爲你有很多代碼。如果它是在控制器或其他類型的中間文件中定義的,那麼也許當您更改頁面時,uid未被設置?

2.)如果您不止一次使用相同的分頁,則將其創建爲函數。

我假設您使用的查詢得到的結果是正確的,唯一的問題是它沒有在其他頁面上顯示正確的結果。如果是這種情況,那麼使用我調整的這個功能。 (您可能必須自己調整它,例如網頁可能就無法讀取domain.com/pg=3像我一樣)

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 

使用方法:(我使用基本的「用戶」表因爲它很簡單)

編寫一個查詢以獲得您所查找的任何行的總數。例如:

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

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

然後使用第一個函數。

Pagination($total_users, $display_limit); 

然後再次運行查詢,但這次設置了限制,以便每頁僅顯示20個用戶。

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

然後顯示的鏈接,使用第二個查詢

PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab); 

這應該對任何查詢工作,無論多麼複雜,只要您的查詢是正確的開始說起。它聽起來像你的查詢是正確的,只是結果顯示在第二頁。任何方式,如果該功能不適合你,你仍然應該創建你自己的分頁功能,這是太多的代碼寫在多個位置。