如果没有记录,则分页错误


Error in pagination if there are no records

这里的脚本工作正常,如果数据库中没有记录,我在页面上收到以下错误

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本对应的手册,了解在第 1 行"-5"附近使用的正确语法

这是PHP和MySQL部分

     try {
    require_once 'db.php';
    $total = $db->query('SELECT COUNT(*) FROM article')->fetchColumn();    
    $per_page = 5;

    $pages = ceil($total / $per_page);
    $page = min($pages, filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
        'options' => array(
            'default'   => 1,
            'min_range' => 1,
        ),
    )));

    $offset = ($page - 1)  * $per_page;
    $start = $offset + 1;
    $end = min(($offset + $per_page), $total);

   $stmt = $db->prepare('SELECT * FROM article ORDER BY ne_title LIMIT :limit OFFSET :offset');

    $stmt->bindParam(':limit', $per_page, PDO::PARAM_INT);
    $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
    $stmt->execute();    
    if ($stmt->rowCount() > 0) {
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $iterator = new IteratorIterator($stmt);
        foreach ($iterator as $row) {
                $desc = $row["ne_article"];
                $img = $row['ne_image'];
                if(!empty($img)){
                $img = '<br/><img src="uploads/images/'.$img.'" alt="" class="responsive-shrink">';
                }else{
                $img = '';
                }
                $youtube = $row["ne_youtube"];    
                if(!empty($youtube)){
                $youtube = '<br/><div class="video-container"><iframe src="http://www.youtube.com/embed/'.$youtube.'"></iframe></div>';
                }else{
                $youtube = '';
                }
        echo '<h4><a href="'.$row['ne_url'].'">'.$row['ne_title'].'</a></h4>
                <h5><b>Views:</b> '.$row['views'].', <b>Posted on:</b> '.format_date($row['created']).'</h5>                
                '.$img.'
                '.$youtube.'
                <p>
                <br/>'.bbcode(nl2br(shortenString($desc))).'
                </p>
                 <div id="pagelink">
                <a href="'.$row['ne_url'].'" class="myButton"> Read more...</button></a>
                    </div>';        
        }
    echo '<div id="pagination">
    <div id="pagiCount">';
        $prevlink = ($page > 1) ? '<span id="prev"><a href="?page=1" title="First page">First</a></span> <span id="prev"><a href="?page=' . ($page - 1) . '" title="Previous page"><<</a></span>' : '';
        $nextlink = ($page < $pages) ? '<span id="next"><a href="?page=' . ($page + 1) . '" title="Next page">>></a></span> <span id="next"><a href="?page=' . $pages . '" title="Last page">Last</a></span>' : '';
        echo '<div id="paging"><p><small>', $prevlink, ' Page ', $page, ' of ', $pages, '', $nextlink, '</small></p></div>';       
    echo '</div></div>';
    } else {
        echo '<p>No resilts found.</p>';
    }
} catch (Exception $e) {
    echo '<p>', $e->getMessage(), '</p>';
}

有人可以帮助解决这个问题吗?

我觉得你把事情复杂化了。尝试这样的事情,请注意我已经绑定了$start和$end而不是您的$limit变量。开始永远不会因为您的其他代码而为负数或零...

$total = $db->query('SELECT COUNT(*) FROM article')->fetchColumn();    
$per_page = 5;
$pages = ceil($total / $per_page); // total number of pages
$offset = ($page - 1)  * $per_page;
$start = $offset + 1;
$end = min(($offset + $per_page), $total);
$stmt = $db->prepare('SELECT * FROM article ORDER BY ne_title LIMIT :limit OFFSET :offset');
$stmt->bindParam(':limit', $start, PDO::PARAM_INT);
$stmt->bindParam(':offset', $end, PDO::PARAM_INT);