概述
在 PHP 中使用 PDO 连接 SQL Server 数据库时,若需实现分页功能且不使用 OFFSET FETCH 语法,可采用嵌套 TOP 子句结合正则替换的方式处理。
核心逻辑
- 接收参数:获取当前页码(pageid)和每页大小(pagesize)。
- 构建基准查询:编写包含所需字段的 SELECT 语句,确定排序字段(如 FItemID)。
- 统计总行数:通过正则表达式移除原始 SQL 中的
TOP限制,执行查询并计算记录总数。 - 计算分页信息:根据总记录数和每页大小计算总页数,校验当前页码有效性。
- 构建分页查询:利用两层嵌套的
TOP子句实现偏移量控制。内层按降序取前 N 条,外层按升序取前 M 条。 - 执行查询:调用封装函数获取最终数据。
代码示例
// 设置分页参数
if (isset($_GET["pageid"])) {
$intCurrentPage = $_GET["pageid"];
} else {
$intCurrentPage = 1;
}
$intPageSize = 20;
$orderbyid = "FItemID";
// 构建基础 SQL
$curRow = $intCurrentPage * $intPageSize;
$SQL = "SELECT TOP {$curRow} a.FNumber, a.FItemID, a.FName, a.FModel, d.fname as measureunits, e.fname as secmeasureunits
FROM {$tablename} a
LEFT JOIN t_MeasureUnit d ON a.FUnitID=d.FMeasureUnitID
LEFT JOIN t_MeasureUnit e ON a.FSecUnitID=e.FMeasureUnitID
WHERE 1=1";
// 移除 TOP 以获取总行数
$newSQL = preg_replace("/(t|T)(o|O)(p|P)\s\d{1,12}/", "", $SQL);
$ROW = pdo_exequery($pdo_msconnection, );
= ( ?? []);
= ;
( != ) {
= (( - ) / ) + ;
( == ) = ;
( > ) = ;
= ;
} {
= ;
= ;
}
= (, );

