PHP+MYSQL 搜索展示「分页」问题

leo212121 发布于 2017/06/11 11:27
阅读 303
收藏 1

如题,在用PHP+MYSQL建站时由于数据量大希望进行分页,目前代码如下

$u = $_SERVER["REQUEST_URI"];
$u = parse_url($u);
$url = $u["path"];

if (!$_GET['submit'] or !$_GET['keyword']) {
    $da = date("Y-m-d");
    echo "  新闻来源:钱江晚报  日期:", $da;
    $sql = sprintf("SELECT da,title,content,key1,key2,key3 FROM qjwb where da='%s'", $da);
} elseif ($_GET['keyword']) {
    $keyword = $_GET['keyword'];
    echo "  新闻来源:钱江晚报  关键词:", $keyword;
    $sql = sprintf("SELECT da,title,content,key1,key2,key3 FROM qjwb where key1='%s' or key2='%s' or key3='%s' order by da desc", $keyword, $keyword, $keyword);
}

$pagesize = 10;
$result = $pdo->query($sql);
$num = $result->rowcount();
if ($_GET["page"]) {
    $pageval = $_GET["page"];
} else {
    $pageval = 1;
}

echo "&nbsp;&nbsp;共 $num 条" . "</form>";

$k = ($pageval - 1) * $pagesize;
$sql = sprintf("%s limit %d,%d", $sql, $k, $pagesize);
//echo $sql;
$result = $pdo->query($sql);
$rows = $result->fetchAll();

if ($num > $pagesize) {
    $sum = ceil($num / $pagesize);
    echo "<p align=\"center\" style=\"margin: 5px\">";
    if ($pageval > 1) {
        echo "第 $pageval 页,共 $sum 页&nbsp;&nbsp;" .
            " <a href={$url}?keyword={$_GET["keyword"]}&submit={$_GET["submit"]}&page=" . ($pageval - 1) . ">上一页</a>";
    } else {
        echo "第 $pageval 页,共 $sum 页&nbsp;&nbsp;" .
            " <a href=#bottom>上一页</a>";
    }
    echo "&nbsp;&nbsp;";
    if ($pageval < $sum) {
        echo "<a href={$url}?keyword={$_GET["keyword"]}&submit={$_GET["submit"]}&page=" . ($pageval + 1) . ">下一页</a>";
    } else {
        echo " <a href=#bottom>下一页</a>";
    }
    echo "</p>";
}

请问这样点击下一页的链接,每一次是否MYSQL要重新进行查询,是否有更好的解决方案,谢谢

加载中
0
PHPerKael
PHPerKael
分页是要重新查询的,性能好不好主要还是要看你的SQL怎么写。使用limit子句,数据量比较大的话,MySQL可能会认为进行全表扫描比使用索引速度更快,所以性能就显得慢了。我自己的做法是带上一个lastID,最后一条记录的ID作为条件,减少检索范围。
l
leo212121
您好,感谢您的答案,新人菜鸟,学到了lastID可以替换limit语句。但是还在想每次网页加载都要重新查询所有符合条件的记录数目,应该是有些重复劳动,是否有办法仅搜索一次。
0
l
leo212121

引用来自“PHPerKael”的评论

分页是要重新查询的,性能好不好主要还是要看你的SQL怎么写。使用limit子句,数据量比较大的话,MySQL可能会认为进行全表扫描比使用索引速度更快,所以性能就显得慢了。我自己的做法是带上一个lastID,最后一条记录的ID作为条件,减少检索范围。

新人菜鸟,学到了lastID可以替换limit语句。但是还在想每次网页加载都要重新查询所有符合条件的记录数目,应该是有些重复劳动,是否有办法仅搜索一次。

返回顶部
顶部