PHP基础知识——PHP学习笔记(一)
PHP表单处理——PHP学习笔记(二)
PHP进阶知识——PHP学习笔记(三)
PHP数据库——PHP学习笔记(四)
PHP接口实战教程——PHP+Mysql+ajax实现分页查询接口
知识预备
Mysql知识
分页的本质就是在查询记录中选择I-J条记录
limit M offset N
limit N,M
M pageSize 页面上每页展示的格式
N pageSize*(pageIndex-1)
当offset的N超过数据集的总量,会返回一个空的数据集
大量数据查询
随着N值越来越大,查询的效率越来越低
解决方法:
1.科学的建立索引
2.查询步骤一分为二
php操作数据库
原生ajax操作
1.new一个request实例
2.http请求状态变化
3.发送请求
//new一个request实例
var request = new XMLHttpRequest();
//http请求状态变化
request.onreadystatechange = function() {
//解析已经完成
if(request.readyState === 4) {
//服务器状态码
if(request.status !== 200) {
console.log(request.responseText);
} else {
console.log(request.responseText);
}
}
}
//发送请求
request.open('GET', "test.php");
//request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.send();
后端接口开发
数据准备
用excel生成一个含用户名(从uer001-uer200),密码(随机6位数),年龄(10-60岁),性别的表,将其转换为csv保存(文件-另存为-选择csv(逗号分隔))。若存在中文则将csv用记事本打开,另存为,选择编码格式为UTF-8。
打开phpmyadmin建立名为MyDB的数据库以及名为user的数据表(id主键,password,age,sex)
导入整个csv
接口数据结构设置
url:http://127.0.0.1/phpmysql/php/app.php
method:GET
requst:
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
pageSize | 否 | int | 每页展示的数据量,默认为10 |
pageIndex | 是 | int | 第几页的数据 |
response
{
"code": 0,
"message": "Success",
"info": {
"count": "200",
"totalPage": 20,
"data": [{
"id": "user001",
"password": "997320",
"age": 27,
"sex": "女"
}]
}
}
code说明
0查询成功
1数据库连接失败
2未传入pageIndex
3未传入任何数据
接口类设置
1.类名:app
2.成员变量:$conn
3.成员函数:
函数名 | 作用 |
---|---|
__construct | 构造函数,连接数据库 |
run | 接口运行函数 |
pagination | 查询操作 |
getCount | 计算数据总量 |
returnSuccessData | 返回正确的结果 |
returnData | 返回所有的结果 |
后端代码
<?php
class app{
private $conn;
/**
* app constructor.
*/
public function __construct()
{
// 创建连接
$this->conn = new mysqli("localhost", "root", "","mydb");
//防止中文乱码
$this->conn->query("SET NAMES UTF8");
//返回数据库连接错误
if ($this->conn->connect_error) {
return $this->returnData(1,$this->conn->connect_error);
}
}
/**
* 接口运行
* @return false|string
*/
public function run(){
if(is_array($_GET)&&count($_GET)>0)//先判断是否通过get传值了
{
if(isset($_GET["pageIndex"]))//是否存在"pageIndex"的参数
{
$pageSize=$_GET['pageSize'] ?? 10;//设置默认值为10
$pageIndex=$_GET['pageIndex'];
$data=$this->pagination($pageSize,$pageIndex);//调用分页函数
$count=$this->getCount();//调用计算总数的函数
$totalPage=ceil($count/$pageSize);//计算总页数
$info=[
'count'=>$count,
'totalPage'=>$totalPage,
'data'=>$data,
];//数据装入
return $this->returnSuccessData($info);//返回正确结果
}else{
return $this->returnData(2,'未传入pageIndex');
}
}else{
return $this->returnData(3,'未传入任何值');
}
}
/**
* 查询操作
* @param $pageSize
* @param $pageIndex
* @return array
*/
private function pagination($pageSize, $pageIndex){
$result=[];
//防sql注入
$stmt=$this->conn->prepare("SELECT * FROM `user` LIMIT ? OFFSET ?");
$page=$pageSize*($pageIndex-1);
$stmt->bind_param("ii", $pageSize, $page);
$stmt->execute();
$data = $stmt->get_result();
//将获取的结果装入数组
while ($row = $data->fetch_assoc()){
array_push($result,$row);
}
return $result;
}
/**
* 得到总条数
* @return mixed
*/
private function getCount(){
$result=$this->conn->query("SELECT count(id) id FROM `user`");
$row = $result->fetch_assoc();
return $row['id'];
}
/**
* 返回正确的结果数据
* @param $data
* @return false|string
*/
private function returnSuccessData($data){
$content=[
'code'=>0,
'message'=>'Success',
'info'=>$data,
];
$this->conn->close();
return json_encode($content);
}
/**
*返回一个通用的结果
* @param $code
* @param $message
* @param array $data
* @return false|string
*/
private function returnData($code,$message,$data=[]){
$content=[
'code'=>$code,
'message'=>$message,
'info'=>$data,
];
$this->conn->close();
return json_encode($content);
}
}
$app=new app();
$re=$app->run();
echo $re;
?>