<?php
class dblib {
private $__conn;
function connect(){
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "webtintuc";
if (!$this->__conn){
try {
$this->__conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$this->__conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e){
echo "Error: " . $e->getMessage();
die();
}
}
}
function dis_connect(){
if ($this->__conn){
$this->__conn = null;
}
}
function insert($table, $data)
{
$this->connect();
$field_list = '';
$value_list = '';
foreach ($data as $key => $value){
$field_list .= ",$key";
$value_list .= ",'".$value."'";
}
$sql = 'INSERT INTO '.$table. '('.trim($field_list, ',').') VALUES ('.trim($value_list, ',').')';
$stmt = $this->__conn->prepare($sql);
return $stmt->execute();
}
function update($table, $data, $where){
$this->connect();
$sql = '';
foreach ($data as $key => $value){
$sql .= "$key = '".$value."',";
}
$sql = 'UPDATE '.$table. ' SET '.trim($sql, ',').' WHERE '.$where;
$stmt = $this->__conn->prepare($sql);
return $stmt->execute();
}
function remove($table, $where){
$this->connect();
$sql = "DELETE FROM $table WHERE $where";
$stmt = $this->__conn->prepare($sql);
return $stmt->execute();
}
function get_list($sql){
$this->connect();
$stmt = $this->__conn->prepare($sql);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
return $stmt->fetchALL();
}
function get_row($sql){
$this->connect();
$stmt = $this->__conn->prepare($sql);
$stmt->execute();
$stmt->setFetchMode(PDO::FETCH_ASSOC);
return $stmt->fetch();
}
function get_row_number($sql){
$this->connect();
$stmt = $this->__conn->prepare($sql);
$stmt->execute();
return $stmt->fetchColumn();
}
}
?>
###post.php
<?php
$link = '';
$where = '';
if (isset($_GET["cat"])) {
$cat = intval($_GET["cat"]);
if ($cat != 0)
$where = "WHERE category_id = $cat";
$link = "cat=$cat&";
}
$sql = "SELECT count(*) FROM posts $where";
$total_records = $homelib->get_row_number($sql);
$limit = 3;
$current_page = isset($_GET['page']) ? $_GET['page'] : 1;
$total_page = ceil($total_records / $limit);
if ($current_page > $total_page){
$current_page = $total_page;
}
else if ($current_page < 1) {
$current_page = 1;
}
$start = ($current_page - 1) * $limit;
$sql = "SELECT * FROM posts $where ORDER BY createdate DESC LIMIT $start, $limit";
$data = $homelib->get_list($sql);
?>
<!-- Blog Entries Column -->
<div class="col-md-8">
<h1 class="my-4">Siêu HOT
<small>tin mới nhất</small>
</h1>
<?php
for ($i = 0; $i < count($data); $i++) {
?>
<div class="card mb-4">
<img class="card-img-top" src="images/<?php echo $data[$i]['image'];?>" height="300px" alt="Card image cap">
<div class="card-body">
<h2 class="card-title"><?php echo $data[$i]['title'];?></h2>
<p class="card-text"><?php echo substr($data[$i]['content'], 0, 200).'...';?></p>
<a href="#" class="btn btn-primary">Xem thêm →</a>
</div>
</div>
<?php
}
?>
<!-- Pagination -->
<ul class="pagination justify-content-center mb-4">
<?php
if ($current_page > 1 && $total_page > 1){
echo '<li class="page-item"><a class="page-link" href="index.php?'.$link.'page='.($current_page-1).'">Prev</a></li>';
}
for ($i = 1; $i <= $total_page; $i++) {
if ($current_page == $i)
echo '<li class="page-item disabled"><a class="page-link" href="#">'.$i.'</a></li>';
else
echo '<li class="page-item"><a class="page-link" href="index.php?'.$link.'page='.$i.'">'.$i.'</a></li>';
}
if ($current_page < $total_page && $total_page > 1){
echo '<li class="page-item"><a class="page-link" href="index.php?'.$link.'page='.($current_page+1).'">Next</a></li>';
}
?>
</ul>
</div>
结果:
<块引用>致命错误 :未捕获的 PDOException:SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 C:\xampp\htdocs\webtintuc\incs\class_db.php:100 中的“-3, 3”附近使用的正确语法:#0 C: \xampp\htdocs\webtintuc\incs\class_db.php(100): PDOStatement->execute() #1 C:\xampp\htdocs\webtintuc\post.php(30): dblib->get_list('SELECT * FROM p ...') #2 C:\xampp\htdocs\webtintuc\index.php(8): include('C:\xampp\htdocs...') #3 {main} 被抛出 C:\xampp\htdocs\webtintuc\incs\class_db.php 在线的 100
答案 0 :(得分:1)
SQL 查询中的 limit
和 start
无论如何都不能为负数。它是一个数字,用于限制 SQL 语句应返回的行数。
为了有用,limit
应该始终是一个大于零的整数。 start
应该是任何大于等于 0 的整数。它被称为 offset
。
您的计算最终会生成一个设置为 start
的 -3
。那永远行不通。
确保检查您的逻辑,使其不会产生负 $start
值。
你可以通过这样计算 $start
来快速证实我的理论......
$start = max(0, ($current_page - 1) * $limit);
如果您的公式返回负值,这将确保该值为 0。
请记住,这不是永久解决方案。您需要正确地找出计算 $start
值的方式。