2011-06-26 25 views
1

問題1:スクリプトのページネーションが機能していません。 20エントリ後、最新の20エントリのみが表示され、別のページに分割されません。コードは以下の通りです:複雑なクエリ+ページネーションスクリプト

問題2:私は同じページネーションスクリプトを他のものに使用していますが、正しく分割しますが、次のページには1ページ目と同じ結果が表示されます。 2番目のスクリプト:

 $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.同じページ設定を複数回使用している場合は、それを関数に作成します。

使用しているクエリを使用して得た結果が正しいと仮定していますが、他のページに正しい結果が表示されないという唯一の問題です。その場合、私は微調整したこの関数を使用します。

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 

使用するには(あなたは私が行うよう、たとえば、あなたのページがdomain.com/pg=3読まない場合があり、それを自分で微調整する必要があります):(私は基本的な「ユーザー」テーブルを使用しています

あなたが探しているものの合計行数を取得するために1つのクエリを記述します。例:

$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); 

1ページあたり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); 

2番目のクエリを使用して、リンクを表示します。あなたの質問が正しいのは私には聞こえましたが、結果は2ページ目に表示されていました。いずれにしても、その関数がうまく動作しない場合は、それ自身の関数にページネーションを作成する必要があります。これは、複数の場所で書かれたコードが多すぎます。