PHP分页与SQL_CALC_FOUND_ROWS和LIMIT

时间:2018-02-21 09:42:13

标签: php pagination

亲爱的朋友们,您好,

我的目标是在使用SQL_CALC_FOUND_ROWS和FOUND_ROWS时对我的数据库条目进行分页,因为我还有一个搜索功能

搜索结果在那里,我无法通过它们进行分页。

可能我的代码在这里对PHP专业人员来说是一团糟,请不要担心评论。任何帮助是极大的赞赏。我刚刚开始使用PHP,我也非常积极地成为Pro的一天。

为了使分页工作,我必须做什么,这样我才能在页面上有搜索功能的同时分页?

详情:

  • 检查页面

  • 获得搜索

  • 搜索表单提交到同一页面

  • 分页和搜索是为了统一工作

  • 与SQL_CALC_FOUND_ROWS一起使用LIMIT

  • LIKE过滤搜索结果

  • 准备好的陈述

  • while循环显示PDO fetch

  • 的结果
  • FOUND_ROWS获取第一次查询的结果
    - >结果是一个整数

  • 最后一页是通过划分
    来计算的 整数通过限制

  • 使用if语句

  • 在for循环中完成分页

连接

try {
    $conn = new PDO($server, $user, $pass);
    $conn -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // echo "success";
} catch (PDOException $e) {
    echo "ERROR: " . $e -> getMessage();
}

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL & ~E_NOTICE);

索引     

if (!isset($_GET['page'])) { $page = 1;
} else { $page = $_GET['page']; }

if ($page < 1) { $page = 1;
} elseif ($page > $last_page) {
    $page = $last_page; }

$search = $_GET['search'];
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="<?php $_SERVER['PHP_SELF'] ?>" method="GET">
        <input type="text" name="search" value="<?php $search ?>">
        <input type="submit" value="search">
    </form</body>
</html>

<?php
$start = 0;
$limit = 3;

$query = "
    SELECT SQL_CALC_FOUND_ROWS * FROM tbl_articles
    WHERE 
        (art_headline LIKE '%{$search}%')
        OR 
        (art_content LIKE '%{$search}%')
    LIMIT $start, $limit
";

$stmt = $conn -> prepare($query);
$stmt -> execute();

while ($res = $stmt -> fetch(PDO::FETCH_ASSOC)) {
    echo '<h1>'.$res['art_headline'].'</h1>'."\n";
    echo '<p>'.$res['art_content'].'</p>';
    echo '<b>'.$res['art_author'].'</b>'."\n";
    echo '<span>'.date("d.m.Y", strtotime($res['art_datetime'])).'</span>'."\n\n";
    echo '<b>'.$res['art_id'].'</b>'."\n";
}

$query = "
    SELECT FOUND_ROWS() AS num FROM tbl_articles
";

$stmt = $conn -> prepare($query);
$stmt -> execute();
$max = $stmt -> fetch(PDO::FETCH_ASSOC);
var_dump($max[num]);

$total_pages = $max[num];
// $stmt = $conn -> query($query) -> fetchColumn();
$last_page = ceil($total_pages / $limit);

// loop through pages
echo "<div><nav>";
for ($i = 1; $i <= $last_page; $i++) {

    if (
            ($i == 1)
            || 
            ($i == $last_page)
            ||
            (
                ($i >= ($page - 2)) 
                && 
                ($i <= ($page + 2))
            )
        ) {

        if ($last_i != ($i - 1)) {
            $out .= " ... ";
        }

        if ($page == $i) { $out .= "["; }
        $out .= "<a href=\"?page=$i&search=$search\">$i</a>";
        if ($page == $i) { $out .= "] "; }

        $out .= " ";
        $last_i = $i;

        $prev = $page - 1;
        $prev_link = "<a href=\"?page=$prev&search=$search\">back</a>\n";
        $next = $page + 1;
        $next_link = "<a href=\"?page=$next&search=$search\">next</a>\n";
    }
}
echo $prev_link;
echo $out;
echo $next_link;
echo "</nav></div>";
?>

PHP初学者非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

好的,我的PHP专业导师帮我解决了。

我们走了:

修复搜索结果显示我必须插入

if ($_GET['page'] > 1) {
    $start = ($_GET['page'] - 1) * $limit;
}
$ start和$ limit变量之间的

和第一个$ query

修复我刚刚插入的分页:

$page = $_GET['page'];

在脚本之上。