[原创]PHP语言分页 非权威教程一

软件和网站开发以及相关技术探讨
回复
flyinflash
帖子: 2376
注册时间: 2006-09-21 14:28

[原创]PHP语言分页 非权威教程一

#1

帖子 flyinflash » 2008-05-09 22:40

分页显示 256 本书,每页显示 5 个标签,每标签显示 10 本书。

代码: 全选

Tab ID [1] [2] [3] [4] [5] [>] [>>]
------------------------------------------
Book ID 1
...
Book ID 10


Tab ID  [<<] [<] [6] [7] [8] [9] [10] [>] [>>]
------------------------------------------
Book ID 50
...
Book ID 60


...


Tab ID  [<<] [<] [26]
------------------------------------------
Book ID 250
...
Book ID 256

分页思路:
1、显示 Book ID
2、显示 Tab ID
3、显示 [<<][<][>][>>] 等翻页



1、Book ID 受“起始 Book ID”,即 $start_bid 影响,确定 $now_tab,就可以确定 $start_bid。

代码流

代码: 全选

<?php

$total_bok = 256;
$tab_per_page = 5;
$bok_per_tab = 10;
// 基本定义


$now_tab = $_GET['now_tab'];
if (!$now_tab)
  $now_tab = 1;
// 使用 GET 传递变量,控制 now_tab 的变化


$now_page = ceil($now_tab / $tab_per_page);


$need_tab = ceil($total_bok / $bok_per_tab);
$need_page = ceil($need_tab / $tab_per_page);


echo '<hr />';
echo "<p>Total Book(s): $total_bok</p>";
echo "<p>Need Tab: $need_tab</p>";
echo '<hr />';
echo "<p>Tab Per Page: $tab_per_page</p>";
echo "<p>Book Per Tab: $bok_per_tab</p><hr />";
echo "<p>Now Page: $now_page</p>";
echo "<p>Now Tab: $now_tab</p>";
echo '<hr />';


$start_bid = ($now_tab - 1) * $bok_per_tab;
// $start_bid 即 start book ID,起始 book ID


$diff = $total_bok - $start_bid;

if ($diff > $bok_per_tab)
  $range = $bok_per_tab;
else
  $range = $diff;

$i = $start_bid;

while ($i <= $start_bid + $range)
{
  // 一般思维首先会想到 $i <= $start_bid + $bok_per_tab,而不是 $i <= $start_bid + $range
  // 使用辅助变量 $diff 和 $range 是为了避免 $total_bok 不是 $bok_per_tab 整数倍时导致出现无效 Book ID
  if (!$i)
  {
    $i++;
    continue;
    // 当 $now_tab = 1,则 $start_bid = 0,$i = $start_bid,所以跳过
  }
  echo "<p>Book ID $i</p>";
  $i++;
}

?>

2、跟 Bood ID 类似,Tab ID 受“起始 Tab ID”,即 $start_tab 影响,确定 $now_page,就可以确定 $start_tab。

代码流

代码: 全选

<?php

$total_bok = 256;

$tab_per_page = 5;
$bok_per_tab = 10;


$now_tab = $_GET['now_tab'];
if (!$now_tab)
  $now_tab = 1;


$now_page = ceil($now_tab / $tab_per_page);

$need_tab = ceil($total_bok / $bok_per_tab);
$need_page = ceil($need_tab / $tab_per_page);


$start_tab = ($now_page - 1) * $tab_per_page;

$diff = $need_tab - $start_tab;

if ($diff > $tab_per_page)
  $range = $tab_per_page;
else
  $range = $diff;

$i = $start_tab;
$tmp_now_tab = $now_tab;

while ($i <= $start_tab + $range)
{
  if (!$i)
  {
    $i++;
    continue;
  }

  if ($now_tab == $i)
    echo " [$i] ";
  else
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$i".'">'.$i.'</a>] ';

  $i++;
}

// 类似 Book ID,不同的是 Tab ID 被超链接包围


echo '<hr />';
echo "<p>Total Book(s): $total_bok</p>";
echo "<p>Need Tab: $need_tab</p>";
echo '<hr />';
echo "<p>Tab Per Page: $tab_per_page</p>";
echo "<p>Book Per Tab: $bok_per_tab</p><hr />";
echo "<p>Now Page: $now_page</p>";
echo "<p>Now Tab: $now_tab</p><hr />";


$start_bid = ($now_tab - 1) * $bok_per_tab;

$diff = $total_bok - $start_bid;

if ($diff > $bok_per_tab)
  $range = $bok_per_tab;
else
  $range = $diff;

$i = $start_bid;

while ($i <= $start_bid + $range)
{
  if (!$i)
  {
    $i++;
    continue;
  }
  echo "<p>Book ID $i</p>";
  $i++;
}

?>
当 $now_page > 1 时,如

代码: 全选

[5] [6] [7] [8] [9] [10]
[10] [11] [12] [13] [14] [15]
标签[5] [10] 有“上一页”功能。事实上,当 $now_page > 1 时,每一页的第一个标签可以。

为了更好看,把

代码: 全选

  else
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$i".'">'.$i.'</a>] ';
      
改为

代码: 全选

  else
  {
    if ($i == $start_tab)
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$i".'"> < </a>] ';
    else
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$i".'">'.$i.'</a>] ';
  }
因为 $i 是动态的,$start_tab 是相对静态的,所以他们相等时,$i 肯定为第一页的第一个标签。


3、显示翻页关键在判断 Tab ID 的位置。

接上面 2,在每一页(除第一页)最后一个标签上加上一个额外标签实现“下一页”。

跟判断标签是否是每一页的第一个标签类似,“因为 $i 是动态的,$start_tab 是相对静态的,
所以他们相等时,$i 肯定为第一页的第一个标签”,相应地,只要 $i == $start_tab + $range,
那么 $i 肯定是每一页的最后一个标签。

代码: 全选

  if (($i == ($start_tab + $range)) &&
      ($now_page < $need_page)
      )
  {
    $j = $i + 1;
    echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$j".'"> > </a>] ';
  }
$now_page < $need_page 使最后一页不显示“下一页”。


转到“第一页”

代码: 全选

if ($now_page > 1)
{
  $j = $need_tab;
  echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=1".'"> << </a>] ';
}
转到“最后一页”

代码: 全选

if ($now_page < $need_page)
{
  $j = $need_tab;
  echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$j".'"> >> </a>] ';
}


全部代码流

代码: 全选

<?php

require_once '../etc/conf.php';
require_once 'connect_db.php';

connect_db();

/*
for ($i = 0, $j = 'a'; $i < 100; $i++)
{
  if ($j == 'z')
    $j = 'a';

  $query = "
    insert into sg_comment (uid, bid, comment_text) values (3, 6, '$i $j') " ;
  $result = mysql_query($query);

  $j++;
}
*/



$total_bok = 256;

$tab_per_page = 5;
$bok_per_tab = 10;

$now_tab = $_GET['now_tab'];
if (!$now_tab)
  $now_tab = 1;

$now_page = ceil($now_tab / $tab_per_page);

$need_tab = ceil($total_bok / $bok_per_tab);
$need_page = ceil($need_tab / $tab_per_page);


$start_tab = ($now_page - 1) * $tab_per_page;

$diff = $need_tab - $start_tab;

if ($diff > $tab_per_page) $range = $tab_per_page;
else $range = $diff;

$i = $start_tab;
$tmp_now_tab = $now_tab;

if ($now_page > 1)
{
  $j = $need_tab;
  echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=1".'"> << </a>] ';
}

while ($i <= $start_tab + $range)
{
  if (!$i)
  {
    $i++;
    continue;
  }

  if ($now_tab == $i)
  {
    echo " [$i] ";
  }
  else
  {
    if ($i == $start_tab)
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$i".'"> < </a>] ';
    else
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$i".'">'.$i.'</a>] ';
  }

  if (($i == ($start_tab + $range)) &&
      ($now_page < $need_page)
      )
  {
    $j = $i + 1;
    echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$j".'"> > </a>] ';
  }

  $i++;
}

if ($now_page < $need_page)
{
  $j = $need_tab;
  echo ' [<a href="'.$_SERVER['PHP_SELF']."?now_tab=$j".'"> >> </a>] ';
}


echo '<hr />';
echo "<p>Total Book(s): $total_bok</p>";
echo "<p>Need Tab: $need_tab</p>";
echo '<hr />';
echo "<p>Tab Per Page: $tab_per_page</p>";
echo "<p>Book Per Tab: $bok_per_tab</p><hr />";
echo "<p>Now Page: $now_page</p>";
echo "<p>Now Tab: $now_tab</p><hr />";

$start_bid = ($now_tab - 1) * $bok_per_tab;

$diff = $total_bok - $start_bid;

if ($diff > $bok_per_tab)
  $range = $bok_per_tab;
else
  $range = $diff;

$i = $start_bid;

while ($i <= $start_bid+$range)
{
  if (!$i)
  {
    $i++;
    continue;
  }
  echo "<p>Book ID $i</p>";
  $i++;
}
简单封装成函数,以下摘自 shuge.org/bin/echo_common_html.php 文件中 echo_paging_box 函数:

代码: 全选

function echo_paging_box($total_bok, $now_tab)
{
  global $a;
  global $bid;
  global $c;
  global $cid;

  global $sys_conf;

  $tab_per_page = $sys_conf['tab_per_page'];
  $bok_per_tab = $sys_conf['bok_per_tab'];

  $now_tab = $_GET['now_tab'];
  if (!$now_tab)
    $now_tab = 1;

  $now_page = ceil($now_tab / $tab_per_page);

  $need_tab = ceil($total_bok / $bok_per_tab);
  $need_page = ceil($need_tab / $tab_per_page);


  $start_tab = ($now_page - 1) * $tab_per_page;

  $diff = $need_tab - $start_tab;

  if ($diff > $tab_per_page) $range = $tab_per_page;
  else $range = $diff;

  $i = $start_tab;
  $tmp_now_tab = $now_tab;

  echo '<div class="paging_navigation_box">';
  echo "<p>Total Post(s): $total_bok</p>";
  echo "<p>Total Tab: $need_tab</p>";
  echo "<p>Now Tab: $now_tab</p>";

  if ($now_page > 1)
  {
    $j = $need_tab;
    echo ' [<a href="'.$_SERVER['PHP_SELF']."?a=$a&bid=$bid&c=$c&cid=$cid&now_tab=1&sid=$sid".'"> << </a>] ';
  }

  while ($i <= $start_tab + $range)
  {
    if (!$i)
    {
      $i++;
      continue;
    }

    if ($now_tab == $i)
    {
      echo " [$i] ";
    }
    else
    {
      if ($i == $start_tab)
        echo ' [<a href="'.$_SERVER['PHP_SELF']."?a=$a&bid=$bid&c=$c&cid=$cid&now_tab=$i&sid=$sid".'"> < </a>] ';
      else
        echo ' [<a href="'.$_SERVER['PHP_SELF']."?a=$a&bid=$bid&c=$c&cid=$cid&now_tab=$i&sid=$sid".'">'.$i.'</a>] ';
    }

    if (($i == ($start_tab + $range)) &&
        ($now_page < $need_page)
        )
    {
      $j = $i + 1;
      echo ' [<a href="'.$_SERVER['PHP_SELF']."?a=$a&bid=$bid&c=$c&cid=$cid&now_tab=$j&sid=$sid".'"> > </a>] ';
    }

    $i++;
  }

  if ($now_page < $need_page)
  {
    $j = $need_tab;
    echo ' [<a href="'.$_SERVER['PHP_SELF']."?a=$a&bid=$bid&c=$c&cid=$cid&now_tab=$j&sid=$sid".'"> >> </a>] ';
  }

  echo '</div>';
}

?>
回复