<html> 
<head> 
<meta charset="UTF-8">
</head> 
<body> 
<?php
//总记录数
$db_conn = OCILogon("PICA","PICA","(DESCRIPTION=(ADDRESS=(PROTOCOL =TCP)(HOST=192.168.28.1)(PORT = 1521))(CONNECT_DATA =(SID=ORCL)))");
$sql = "select ROWNUM rn from news";
$par = ociparse($db_conn, $sql);
ociexecute($par);
$nRecords = ocifetchstatement($par, $rs);
//取得页码
$page = @$_GET['page'];
//定义每页显示信息条数
$page_size = 5;
//当页码参数为空时,将页码设为1
if ($page == "")
{
    $page = 1;
}
//当页码大于1时,每页的开始记录是 (页码-1) * 每页记录数 +1
$startRow = ($page - 1) * $page_size + 1;
echo "$startRow";
$endRow = $page * $page_size;
//方法一
$cmdstr = "select *
from
(
    select ROWNUM rn ,temp.newsid,temp.title
    from (select * from news) temp
    where ROWNUM <= $endRow
)
where rn >= $startRow";
//执行查询SQL
$parsed = ociparse($db_conn, $cmdstr);
ociexecute($parsed);
$nrows = ocifetchstatement($parsed, $results);
echo "$nrows";
echo "<html><head><title>分页测试</title></head><body>";
echo "<center><h2>分页测试</h2>\n";
//表字段名获取
$arrName = array_keys($results);
echo "<table border=1 cellspacing='0' width='70%'>\n<tr>\n";
//for ($i = 0; $i < count($arrName); $i++)
//{
   echo "<td>Rn</td><td>ID</td><td> 标题</td>\n";
//}
echo "</tr>\n";
//循环输出记录
for ($i = 0; $i < $nrows; $i++)
{
    echo "<tr>\n";
    foreach ($results as $data)
    {
        echo "<td>$data[$i]</td>\n";
    }
    echo "</tr>\n";
}
echo "<tr>
<td colspan='" . count($arrName) . "'> 行数:$nrows</td></tr></table>\n<br>";
//显示分页
//总页数
$totalPage = ceil($nrows/$page_size);
//上一页链接
$Prev = $page - 1;
if ($Prev < 1)
{
    $Prev = 1;
}
//下一页链接
$Next = $page + 1;
if ($Next > $totalPage)
{
    $Next = $totalPage;
}
//输出上一页链接
if ($page <> 1)
{
    echo '<span><a href="?page=1">First&nbsp;</a></span>';
    echo '<span><a href="?page=' . $Prev . '">Prev</a></span>';
}
else
{
    echo '<span>First</span>';
    echo '<span>Prev</span>';
}
//页码数字链接
//显示的数字个数
$pageNumber = 5;
//页码数算法
$pagebegin = $page - $pageNumber;
if ($page == 1)
{
    $pageend = $pageNumber;
}
else
{
    $pageend = $page + $pageNumber;
}
if ($pagebegin <= 0)
{
    $pagebegin = 1;
}
if ($pageend > $totalPage)
{
    $pageend = $totalPage;
}
//一次向前翻$pageNumber行
if ($page > $pageNumber)
{
    echo '<span><a href="?page=' . ($page - $pageNumber) . '"><<</a></span>';
}
//输出动态生成的页码链接
for ($i = $pagebegin; $i <= $pageend; $i++)
{
    if ($i == $page)
    {
        echo '<span style="background:#FFCC99">' . $i . '</span>';
    }
    else
    {
        echo '<span><a href="?page=' . $i . '">' . $i . '</a></span>';
    }
}
//一次向后翻$pageNumber行
if (($totalPage - $page) > 5)
{
    echo '<span><a href="?page=' . ($page + $pageNumber) . '">>></a></span>';
}
//输出下一页链接
if ($page <> $totalPage)
{
    echo '<span><a href="?page=' . $Next . '">Next</a></span>';
    echo '<span><a href="?page=' . $totalPage . '">Last</a></span>';
}
else
{
    echo '<span>Next</span>';
    echo '<span>Last</span>';
}
?>
</body>  
</html>  代码如上,输出的结果一直只有一页,实际应该有3页的,而且中文乱码了,求大神帮忙看看
分页

解决方案 »

  1.   

    你的分页代码没有问题,一共5条数据,你自己设定每页5条,那么确实只有1页。
    至于中文乱码,应该是你数据库和页面编码不一致问题,如果你不能保持一致,可以用iconv函数转码
      

  2.   

    你有
    $endRow = $page * $page_size;
    //方法一
    $cmdstr = "select *
    from
    (
        select ROWNUM rn ,temp.newsid,temp.title
        from (select * from news) temp
        where ROWNUM <= $endRow
    )
    where rn >= $startRow";
    那么无论表中有多少数据,都只会取回不多于 $endRow 的记录,何况还不是从第一条看是呢(rn >= $startRow)
    所以你的 $nrows 只是读取到的记录数,而不是总记录数。
    不能作为计算总页数的依据
      

  3.   

    select count(*) from news
    先取得总记录数,然后再计算个分页参数和查询当前页数据
      

  4.   

    你的页面是 utf-8 的,而数据库中去的的数据是 gbk 的,所以出现乱码
    本来是可以在连接数据库时指定需要的编码的,但是对于 oracle 分立函数的我不必写(只会 pdo 的),你可以搜索一下写法
    当然也可以用 iconv 进行转码