使用 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 - 因此它会是一个相当无聊的页面,但是..那是你的决定 - 但希望你明白了。
您还需要知道记录的数量,因为您需要决定是否还有更多页面。
尝试用 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 - 因此它会是一个相当无聊的页面,但是..那是你的决定 - 但希望你明白了。
您还需要知道记录的数量,因为您需要决定是否还有更多页面。