使分页与 mssql 一起使用的问题
Issue with getting pagination to work with mssql
我试图设置此分页 table,但由于某种原因,我现在收到此错误,它正在使用 MySQL,但当我将其切换到 MSSQL 时。我收到此错误:
Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL
Server]Incorrect syntax near '`'.' in
C:\inetpub\wwwroot\pagination\index.php:40 Stack trace:#0
C:\inetpub\wwwroot\pagination\index.php(40): PDOStatement->execute()#1
{main}thrown in C:\inetpub\wwwroot\pagination\index.php on line 40
Line 40 is near the Stmt2 execute.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Receiving</title>
<!-- CSS File -->
<link href="css/pagination.css" rel="stylesheet">
</head>
<body>
<?php
require_once ("db_connect.php");
// No. of adjacent pages shown on each side
$adjacents = 2;
// We will assign variable here for entry By. you can use your variables here.
$EntryBy = "completed";
// We Will prepare SQL Query
$STM = $dbh->prepare("SELECT DateRequested FROM receivingrequests WHERE Status = :Status");
// bind paramenters, Named paramenters alaways start with colon(:)
$STM->bindParam(':Status', $EntryBy);
// For Executing prepared statement we will use below function
$STM->execute();
// Count no. of records
$Records = $STM->rowCount();
// Your File Name will be the same like your php page name which is index.php
$targetpage = "index.php";
// Below is setting for no. of records per page.
$limit = 10;
$page = $_GET['page'];
if ($page)
// First Item to dipaly on this page
$start = ($page - 1) * $limit;
else
// if no page variable is given, set start to 0
$start = 0;
// Get data using PDO prepare Query.
$STM2 = $dbh->prepare("SELECT `RequestNumber`,`DATEREQUESTED`, `EmpName` ,`Department` ,`VasLblDate` ,`Status` FROM receivingrequests WHERE Status = :Status ORDER BY RequestNumber LIMIT $start, $limit");
// bind paramenters, Named paramenters alaways start with colon(:)
$STM2->bindParam(':Status', $EntryBy);
// For Executing prepared statement we will use below function
$STM2->execute();
// We will fetch records like this and use foreach loop to show multiple Results later in bottom of the page.
$STMrecords = $STM2->fetchAll();
// Setup page variables for display. If no page variable is given, default to 1.
if ($page == 0) $page = 1;
// previous page is page - 1
$prev = $page - 1;
// next page is page + 1
$next = $page + 1;
// lastpage is = total Records / items per page, rounded up.
$lastpage = ceil($Records / $limit);
// last page minus 1
$lpm1 = $lastpage - 1;
// Now we apply our rules and draw the pagination object. We're actually saving the code to a variable in case we want to draw it more than once.
$pagination = "";
if ($lastpage > 1)
{
$pagination.= "<div class='pagination'>";
// previous button
if ($page > 1) $pagination.= "<a href='$targetpage?page=$prev'>Previous</a>";
else $pagination.= "<span class='disabled'>Previous</span>";
// pages
if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
{
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
}
elseif ($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some
{
// close to beginning; only hide later pages
if ($page < 1 + ($adjacents * 2))
{
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
$pagination.= "...";
$pagination.= "<a href='$targetpage?page=$lpm1'>$lpm1</a>";
$pagination.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>";
}
// in middle; hide some front and some back
elseif ($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
{
$pagination.= "<a href='$targetpage?page=1'>1</a>";
$pagination.= "<a href='$targetpage?page=2'>2</a>";
$pagination.= "...";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
$pagination.= "...";
$pagination.= "<a href='$targetpage?page=$lpm1'>$lpm1</a>";
$pagination.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>";
}
// close to end; only hide early pages
else
{
$pagination.= "<a href='$targetpage?page=1'>1</a>";
$pagination.= "<a href='$targetpage?page=2'>2</a>";
$pagination.= "...";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
}
}
// next button
if ($page < $counter - 1) $pagination.= "<a href='$targetpage?page=$next'>Next</a>";
else $pagination.= "<span class='disabled'>Next</span>";
$pagination.= "</div>\n";
}
// Below is a start of table in which we will show records using foreach loop.
// We use foreach loop here to echo records.
foreach($STMrecords as $r)
{
echo "<table width='100%' class='mytableP'>";
echo "<tr><th>RequestNumber</th><th>DateRequested</th><th>Employee Name</th><th>Department</th><th>VasLablDate</th><th>Status</th></tr>";
echo "<tr>";
echo "<td>" . $r[0] . "</td>";
echo "<td>" . $r[1] . "</td>";
echo "<td>" . $r[2] . "</td>";
echo "<td>" . $r[3] . "</td>";
echo "<td>" . $r[4] . "</td>";
echo "<td>" . $r[5] . "</td>";
echo "</tr>";
echo "</table>";
echo "<br />";
}
// For showing pagination below the table we will echo $pagination here after </table>. For showing above the table we will echo $pagination before <table>
echo $pagination;
// Closing MySQL database connection
$dbh = null;
?>
</body>
我怀疑错误的原因是 mysql 用来引用属性名称的 `
个字符。 MSSQL 使用 [
和 ]
.
只需删除 ` 字符,只要不使用保留字作为 table 属性,它们就不是必需的。
编辑:
至于 LIMIT 问题:您可以使用 doctrine DBAL 库,一个简单的 PDO 包装器。核心语法与 PDO 语法相同,但你有像查询构建器这样的好特性:
http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html
通过查询生成器,您可以使用 ->setFirstResult()
和 ->setMaxResults()
来模拟 mysql.
中的限制函数
但是如果您使用 SQL Server 2012+,@AaronBertrand 在上面的评论中写的内容(使用 OFFSET / FETCH)会容易得多。
我试图设置此分页 table,但由于某种原因,我现在收到此错误,它正在使用 MySQL,但当我将其切换到 MSSQL 时。我收到此错误:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near '`'.' in C:\inetpub\wwwroot\pagination\index.php:40 Stack trace:#0 C:\inetpub\wwwroot\pagination\index.php(40): PDOStatement->execute()#1 {main}thrown in C:\inetpub\wwwroot\pagination\index.php on line 40 Line 40 is near the Stmt2 execute.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Receiving</title>
<!-- CSS File -->
<link href="css/pagination.css" rel="stylesheet">
</head>
<body>
<?php
require_once ("db_connect.php");
// No. of adjacent pages shown on each side
$adjacents = 2;
// We will assign variable here for entry By. you can use your variables here.
$EntryBy = "completed";
// We Will prepare SQL Query
$STM = $dbh->prepare("SELECT DateRequested FROM receivingrequests WHERE Status = :Status");
// bind paramenters, Named paramenters alaways start with colon(:)
$STM->bindParam(':Status', $EntryBy);
// For Executing prepared statement we will use below function
$STM->execute();
// Count no. of records
$Records = $STM->rowCount();
// Your File Name will be the same like your php page name which is index.php
$targetpage = "index.php";
// Below is setting for no. of records per page.
$limit = 10;
$page = $_GET['page'];
if ($page)
// First Item to dipaly on this page
$start = ($page - 1) * $limit;
else
// if no page variable is given, set start to 0
$start = 0;
// Get data using PDO prepare Query.
$STM2 = $dbh->prepare("SELECT `RequestNumber`,`DATEREQUESTED`, `EmpName` ,`Department` ,`VasLblDate` ,`Status` FROM receivingrequests WHERE Status = :Status ORDER BY RequestNumber LIMIT $start, $limit");
// bind paramenters, Named paramenters alaways start with colon(:)
$STM2->bindParam(':Status', $EntryBy);
// For Executing prepared statement we will use below function
$STM2->execute();
// We will fetch records like this and use foreach loop to show multiple Results later in bottom of the page.
$STMrecords = $STM2->fetchAll();
// Setup page variables for display. If no page variable is given, default to 1.
if ($page == 0) $page = 1;
// previous page is page - 1
$prev = $page - 1;
// next page is page + 1
$next = $page + 1;
// lastpage is = total Records / items per page, rounded up.
$lastpage = ceil($Records / $limit);
// last page minus 1
$lpm1 = $lastpage - 1;
// Now we apply our rules and draw the pagination object. We're actually saving the code to a variable in case we want to draw it more than once.
$pagination = "";
if ($lastpage > 1)
{
$pagination.= "<div class='pagination'>";
// previous button
if ($page > 1) $pagination.= "<a href='$targetpage?page=$prev'>Previous</a>";
else $pagination.= "<span class='disabled'>Previous</span>";
// pages
if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up
{
for ($counter = 1; $counter <= $lastpage; $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
}
elseif ($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some
{
// close to beginning; only hide later pages
if ($page < 1 + ($adjacents * 2))
{
for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
$pagination.= "...";
$pagination.= "<a href='$targetpage?page=$lpm1'>$lpm1</a>";
$pagination.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>";
}
// in middle; hide some front and some back
elseif ($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2))
{
$pagination.= "<a href='$targetpage?page=1'>1</a>";
$pagination.= "<a href='$targetpage?page=2'>2</a>";
$pagination.= "...";
for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
$pagination.= "...";
$pagination.= "<a href='$targetpage?page=$lpm1'>$lpm1</a>";
$pagination.= "<a href='$targetpage?page=$lastpage'>$lastpage</a>";
}
// close to end; only hide early pages
else
{
$pagination.= "<a href='$targetpage?page=1'>1</a>";
$pagination.= "<a href='$targetpage?page=2'>2</a>";
$pagination.= "...";
for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++)
{
if ($counter == $page) $pagination.= "<span class='current'>$counter</span>";
else $pagination.= "<a href='$targetpage?page=$counter'>$counter</a>";
}
}
}
// next button
if ($page < $counter - 1) $pagination.= "<a href='$targetpage?page=$next'>Next</a>";
else $pagination.= "<span class='disabled'>Next</span>";
$pagination.= "</div>\n";
}
// Below is a start of table in which we will show records using foreach loop.
// We use foreach loop here to echo records.
foreach($STMrecords as $r)
{
echo "<table width='100%' class='mytableP'>";
echo "<tr><th>RequestNumber</th><th>DateRequested</th><th>Employee Name</th><th>Department</th><th>VasLablDate</th><th>Status</th></tr>";
echo "<tr>";
echo "<td>" . $r[0] . "</td>";
echo "<td>" . $r[1] . "</td>";
echo "<td>" . $r[2] . "</td>";
echo "<td>" . $r[3] . "</td>";
echo "<td>" . $r[4] . "</td>";
echo "<td>" . $r[5] . "</td>";
echo "</tr>";
echo "</table>";
echo "<br />";
}
// For showing pagination below the table we will echo $pagination here after </table>. For showing above the table we will echo $pagination before <table>
echo $pagination;
// Closing MySQL database connection
$dbh = null;
?>
</body>
我怀疑错误的原因是 mysql 用来引用属性名称的 `
个字符。 MSSQL 使用 [
和 ]
.
只需删除 ` 字符,只要不使用保留字作为 table 属性,它们就不是必需的。
编辑: 至于 LIMIT 问题:您可以使用 doctrine DBAL 库,一个简单的 PDO 包装器。核心语法与 PDO 语法相同,但你有像查询构建器这样的好特性: http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html
通过查询生成器,您可以使用 ->setFirstResult()
和 ->setMaxResults()
来模拟 mysql.
但是如果您使用 SQL Server 2012+,@AaronBertrand 在上面的评论中写的内容(使用 OFFSET / FETCH)会容易得多。