PHP与MySQL 分页案例
分页思想
- 获取当前页码的数据
页码 SQL语句
1 select * from products limit 0,10
2 select * from products limit 10,10
3 select * from products limit 20,30
-
公式
$pageno
页码$startno
起始位置$pagesize=10
页面大小$startno= ($pageno- 1)* $pagesize;
-
获取页码
- 用户点击页面底端页码,传递当前的页面
-
获取总页码
记录数 页数 计算
60 6 60/10=6
51 6 ceil(51/10)=6
-
公式
$rowcount
总记录数$pagecount
总页数$pagecount= ceil($rowcount/ $pagesize);
-
获取总记录数
select count(*) from products;
实现方法
- 步骤
- 获取总记录数
- 求出总页数
- 循环显示页码
- 通过当前页面,求出起始位置
- 获取当前页面数据,并遍历显示
代码实现
连接数据库
# MySQLDB.class.php
<?php
class MySQLDB {
private $host; // 主机地址
private $port; // 端口号
private $user; // 用户名
private $pwd; // 密码
private $dbname; // 数据库名
private $charset; // 字符集
private $link; // 连接对象
private static $instance;
private function __construct($param){
$this->initParam($param);
$this->initConnect();
}
private function __clone(){
}
// 获取单例
public static function getInstance($param= array()){
if(!self::$instance instanceof self){
self::$instance= new self($param);
}
return self::$instance;
}
// 初始化参数
private function initParam($param){
$this->host= $param['host']??'127.0.0.1';
$this->port= $param['port']??'3306';
$this->user= $param['user']??'';
$this->pwd= $param['pwd']??'';
$this->dbname= $param['dbname']??'';
$this->charset= $param['charset']??'utf8';
}
// 连接数据库
private function initConnect(){
$this->link= @mysqli_connect($this->host, $this->user, $this->pwd, $this->dbname, $this->port);
if(mysqli_connect_error()){
echo '数据库连接失败<br>';
echo '错误信息:'.mysqli_connect_error(),'<br>';
echo '错误码:'.mysqli_connect_errno(),'<br>';
exit;
}else{
echo '数据库连接成功!';
}
mysqli_set_charset($this->link, $this->charset);
}
// 数据库的增删改查
private function execute($sql){
if(!$rs= mysqli_query($this->link, $sql)){
echo 'SQL语句执行失败<br>';
echo '错误信息:'.mysqli_error($this->link),'<br>';
echo '错误码:'.mysqli_errno($this->link),'<br>';
echo '错误的SQL语句:'.$sql,'<br>';
exit;
}
return $rs;
}
// 执行增删改语句
public function exec($sql) {
$key=substr($sql,0,6);
if(in_array($key,array('insert','update','delete')))
return $this->execute($sql);
else{
echo '非法访问<br>';
exit;
}
}
//获取自动增长的编号
public function getLastInsertId() {
return mysqli_insert_id($this->link);
}
//执行查询语句
private function query($sql) {
if(substr($sql,0,6)=='select' || substr($sql,0,4)=='show' || substr($sql,0,4)=='desc'){
return $this->execute($sql);
}else{
echo '非法访问<br>';
exit;
}
}
//匹配所有数据
public function fetchAll($sql,$type='assoc') {
$rs=$this->query($sql);
$type=$this->getType($type);
return mysqli_fetch_all($rs,$type);
}
//匹配一维数组
public function fetchRow($sql,$type='assoc') {
$list=$this->fetchAll($sql,$type);
if(!empty($list))
return $list[0];
return array();
}
//匹配一行一列
public function fetchColumn($sql) {
$list=$this->fetchRow($sql,'num');
if(!empty($list))
return $list[0];
return null;
}
//获取匹配类型
private function getType($type) {
switch($type){
case 'num':
return MYSQLI_NUM;
case 'both':
return MYSQLI_BOTH;
default:
return MYSQLI_ASSOC;
}
}
}
显示页
# index.php
<?php
//自动加载类
spl_autoload_register(function($class_name){
require "./{$class_name}.class.php";
});
//获取单例
$param=array(
'user' => 'root',
'pwd' => '',
'dbname' => 'data'
);
$db= MySQLDB::getInstance($param);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>数据库连接</title>
<style type="text/css">
table{
width:780px;
border:solid #000 1px;
}
td,th{
border:solid #000 1px;
}
</style>
</head>
<body>
<?php
$pagesize= 5;
//第一步:获取总记录数
$rowcount= $db->fetchColumn('select count(*) from products');
//第二步:求出总页数
$pagecount= ceil($rowcount/$pagesize);
//第四步:通过当前页面,求出起始位置
//$pageno=isset($_GET['pageno'])?$_GET['pageno']:1;
$pageno= $_GET['pageno']??1;
$pageno= $pageno<1?1:$pageno;
$pageno= $pageno>$pagecount?$pagecount:$pageno;
$startno= ($pageno-1)*$pagesize;
//第五步:获取当前页面数据,并遍历显示
$sql= "select * from products limit $startno,$pagesize";
$rs= $db->fetchAll($sql);
?>
<table>
<tr>
<th>编号</th>
<th>商品名称</th>
<th>规格</th>
<th>价格</th>
</tr>
<?php foreach($rs as $row):?>
<tr>
<td><?=$row['proID']?></td>
<td><?=$row['proname']?></td>
<td><?=$row['proguige']?></td>
<td><?=$row['proprice']?></td>
</tr>
<?php endforeach;?>
</table>
<!--第三步:循环显示页码-->
<span>一共有<?=$rowcount?>条记录,每页放<?=$pagesize?>条记录,当前是<?=$pageno?>页 <br></span>
【<a href="?pageno=1">首页</a>】
【<a href="?pageno=<?=$pageno-1?>">上一页</a>】
<?php for($i=1; $i<=$pagecount; $i++):?>
<a href="?pageno=<?=$i?>"><?=$i?></a>
<?php endfor;?>
【<a href="?pageno=<?=$pageno+1?>">下一页</a>】
【<a href="?pageno=<?=$pagecount?>">末页</a>】
</body>
</html>
分页优化
-
概述
- 在上面的分页代码中,虽然SQL语句比较经典
- 但是每次都要获取不需要的数据,浪费资源
-
优化
$sql="select * from products limit $startno,$pagesize";
$sql="select * from products where proid>=(select proid from products limit $startno,1) limit $pagesize";