使用 Microsoft sql & PHP 进行分页

Pagination with Microsoft sql & PHP

尝试用 mssql 和 php 做一些分页,但我似乎无法让它工作...我没有收到任何错误,所以我无法真正找出我做错了什么,我是否遗漏了任何明显的东西?

 <?php 
error_reporting(E_ALL); ini_set('display_errors', 1);
 $dbhost = 'localhost';
 $dbuser = '*****';
$dbpass = '******';
$db = 'blog';
$connectionInfo = array( "UID"=>$dbuser,                            
"PWD"=>$dbpass,                            
"Database"=>$db, "CharacterSet" => "UTF-8"); 
$connect_db = sqlsrv_connect ( $dbhost, $connectionInfo ) or die(sqlsrv_errors());

if ((!isset($_GET['pagenum'])) || (!is_numeric($_GET['pagenum'])) || ($_GET['pagenum'] < 1)) { $pagenum = 1; }
else { $pagenum = $_GET['pagenum']; }

$result = sqlsrv_query ($connect_db,"SELECT blogID FROM blog_posts") or die(sqlsrv_errors());

$rows = sqlsrv_num_rows($result);

$page_rows = 2; 

$last = ceil($rows/$page_rows); 
if (($pagenum > $last) && ($last > 0)) { $pagenum = $last; }

$max = ($pagenum - 1) * $page_rows;

$result2 = sqlsrv_query(($connect_db,"SELECT TOP $page_rows FROM blog_posts WHERE blogID NOT IN (SELECT TOP $max blogID FROM blog_posts ORDER BY blogID ASC) ORDER BY blogID ASC") or die(sqlsrv_errors()); 

while($info = sqlsrv_fetch_array( $result2, SQLSRV_FETCH_BOTH )) 
{ 
    print $info['blogID']; 
    echo "<br>";
} 
echo "<p>";
echo " --Page $pagenum of $last-- <p>";

if ($pagenum == 1) { } 
    else 
    {
        echo " <a href='{$_SERVER['PHP_SELF']}?pagenum=1'> <<-First</a> ";
        echo " ";
        $previous = $pagenum-1;
        echo " <a href='{$_SERVER['PHP_SELF']}?pagenum=$previous'> <-Previous</a> ";
    } 
    echo " ---- ";
    if ($pagenum == $last) 
    {
    } 
    else {
        $next = $pagenum+1;
        echo " <a href='{$_SERVER['PHP_SELF']}?pagenum=$next'>Next -></a> ";
        echo " ";
        echo " <a href='{$_SERVER['PHP_SELF']}?pagenum=$last'>Last ->></a> ";
    } 
    ?> 

blogID 是 db

中每个 post 的唯一 ID

非技术性答案(例如,不是为您编写所有代码)

您目前获得的代码显示 $max = (page number-1) * length of page

-if page = 1, then max = 0, 所以第1页没有数据

-对于第 2 页,您有 1 页的内容

-对于第 3 页,您将有 2 页长度的内容

很明显 - 这不是你的意思。您的意思是 select 从上一页末尾到当前页末尾的行数。 MSSQL 不太擅长这个

首先

您需要一个最小值和最大值。显示来自

$min = (page number -1 * pagelength)+1 (例如,一页末尾和下一页开头的记录不同) $max = page number * pagelength

如果页面长度为 5,页面浏览量可能最少记录 21,最多 25

然后您可以使用 SQL 之类的 SELECT * FROM ( <your query here> ) AS RowConstrainedResult WHERE RowNum >= $min AND RowNum < $max ORDER BY RowNum

您当前的 select 声明只获得一个博客 ID - 因此它会是一个相当无聊的页面,但是..那是你的决定 - 但希望你明白了。

您还需要知道记录的数量,因为您需要决定是否还有更多页面。