致命错误:未捕获的 PDOException:SQLSTATE[42000]

时间:2021-01-13 04:37:02

标签: php mysql

<?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 &rarr;</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

1 个答案:

答案 0 :(得分:1)

SQL 查询中的 limitstart 无论如何都不能为负数。它是一个数字,用于限制 SQL 语句应返回的行数。

为了有用,limit 应该始终是一个大于零的整数。 start 应该是任何大于等于 0 的整数。它被称为 offset

您的计算最终会生成一个设置为 start-3。那永远行不通。

确保检查您的逻辑,使其不会产生负 $start 值。

你可以通过这样计算 $start 来快速证实我的理论......

$start = max(0, ($current_page - 1) * $limit);

如果您的公式返回负值,这将确保该值为 0。

请记住,这不是永久解决方案。您需要正确地找出计算 $start 值的方式。

相关问题