PDO 分页错误

PDO Pagination Error

我一直在使用 pdo 进行分页,但我似乎无法通过这一部分。我已经查阅了其他帖子和教程,但我碰壁了,有人能帮忙吗? **编辑完整代码已添加,已添加更新但仍有错误

<?php
try{
    $handler = new PDO('mysql:host=127.0.0.1;dbname=clients','root','');
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    echo $e->getMessage();
    die();
}


?>
<html>
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head>


<body bgcolor="#F5F1DE">

<div class="center">
  <br>
   <br>
    <br>
     <br>
      <br>
  <h2> Business Listings</h2>


<table  border="1" style="width:50%">
    <tr>
<?php
$per_page = 10;
$NoofRecords = $handler->query('SELECT COUNT(CompID) FROM Listings;');
$pages = ceil($NoofRecords / $per_page);

if(!isset($_GET['page'])){
    header(":location: Listings.php?page=1");
}
else{
    $page =$_GET['page'];
}

$start = (($page - 1)*$per_page);
echo "SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT                  $start,$per_page;";
$query = $handler->query("SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;");
while($r = $query->fetch()) {
    echo '<td>', $r['Name'], '</td>','<td>', $r['Email'], '</td>','<td>',         $r['Phone'], '</td>',
'<td>','<a href="' . $r['Name'] . '.php">Company page</a>', '</td>';
echo '</tr>';
}

for($number=1;$number<=$pages;$number++)
{
    echo '<a href="?page'.$number.'">.$number. </a>';
}   
echo"<BR>Current Page: $page"
?>

</table>
  </Div>
</div>


</div>
</body>
</html>

在字符串中使用变量时使用双引号 " 而不是单引号 ':

"SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;"

限制在您的查询中排在最后。

SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page ;

https://dev.mysql.com/doc/refman/5.0/en/select.html

您还需要使用双引号,因为 Crystal 已指出 PHP 来处理变量。你应该使用准备好的语句,尽管这对注入是开放的,How can I prevent SQL injection in PHP?

已更新,没有您仍应使用的准备好的语句..

<?php
try{
    $handler = new PDO('mysql:host=127.0.0.1;dbname=clients','root','');
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
    echo $e->getMessage();
    die();
}
$per_page = 10;
$NoofRecords = $handler->query('SELECT COUNT(CompID) as counted FROM Listings;');
$fetchdata = $NoofRecords->fetch();
$recordcount = $fetchdata['counted'];
$pages = ceil($recordcount / $per_page);
if(empty($_GET['page'])){
    //this is a waste if this page is listings.php, just set $page to 1;
    header("Location: Listings.php?page=1");
} else{
    $page = $_GET['page'];
}
$start = (($page - 1)*$per_page);
echo "SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;";
$query = $handler->query("SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;");
while($r = $query->fetch()) {
    $table_contents = '<tr><td>' . $r['Name'] . '</td><td>' . $r['Email'] . '</td><td>'. $r['Phone'] . '</td><td><a href="' . $r['Name'] . '.php">Company page</a></td></tr>';
}
?>
<html>
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head>
<body bgcolor="#F5F1DE">
<div class="center"> 
    <br>
    <br>
    <br>
    <br>
    <br>
    <h2> Business Listings</h2>
    <table  border="1" style="width:50%"> 
        <?php echo $table_contents; ?>
    </table>
    <?php
    for($number=1;$number<=$pages;$number++) {
        echo '<a href="?page'.$number.'">'.$number. '</a>';
    }   
    echo "<BR>Current Page: $page"; ?>

</div>
</div><!-- I dont know what these 2 divs are for... -->
</div> 
</body>
</html>

将您的查询行更改为:查询语法错误。

$query = $handler->query("SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page");

除了其他答案中提到的 sql 问题(LIMIT 最后,双引号以便您可以在字符串中使用变量),您已经有一个较早的问题:

$pages = ceil(($NoofRecords,0)/$per_page);
              ^^^^^^^^^^^^^^^^ What is supposed to happen here?

,0 部分使整个语句无效。

您只需要:

$pages = ceil($NoofRecords / $per_page);