作业总结:
一、配置连接数据文件。
ajax接受发送数据需要一个PHP文件做连接,设置一个变量$page接受GET到的值,使用PDO进行连接数据库。
设置一下每页显示的数量赋值给变量$num。
设置数据查询模板,模板里可以直接使用{}包裹变量进行查询,使用CEIL对查询到的mov_id总数/$num向上取整,命令赋值给变量$sql.
$stmt=$pdo->prepare($sql)预执行一下查询命令,把结果赋值给变量$stmt.
$stmt->execute() 执行一下查询。
查询文章内容ID起始位置,这里有一个页码偏移量的公式:
偏移量 = 当前显示数量*(当前页码-1);
$offset = $num * ($page -1);
设置文章内容查询数据模板
$sql = "SELECT `mov_id`,`name`, CONCAT(LEFT(`detail`,20),'...') FROM `movies` LIMIT {$num} OFFSET {$offset} ";
这里的CONNAT()是连接两个数据内容的函数
LEFT()是从左边开始截取20个字符
LIMIT 如果出现的这个单词是 LIMIT 2,3 表示从第二条开始显示,显示3条内容。
limit 2 offset 1;
//含义是从第1条(不包括)数据开始取出2条数据,LIMIT后面跟的是2条数据,OFFSET后面是从第1条开始读取,即读取第2,3条,简单理解就是取 N条数据从X开始取。
预执行这个查询
执行查询
实例化使用fetchAll方式查询,函数体内使用PDO::FETCH_ASSOC,查询结果以关联数组方式显示。
以json的数据格式发送数据,数据以数组的方式提交。echo json_encode([$pages, $result]);
连接发送数据代码:
<?php
// 获取当前要显示的页数
$page = intval($_GET['p']);
$pdo = new PDO('mysql:dbname=php', 'root', 'root');
// 每页显示数量
$num = 5;
// 总页数: 需要分二步, 第一求出总记录数量, 第二总记录数量除以每页显示的记录数量,再向上取整
$sql = "SELECT CEIL(COUNT(`mov_id`)/{$num}) FROM `movies`";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$pages = $stmt->fetchColumn(0);
// 每页的显示起止位置: 偏移量
// 偏移量 = 当前显示数量 * (当前页码 - 1)
$offset = $num * ($page - 1);
$sql = "SELECT `mov_id`,`name`, CONCAT(LEFT(`detail`,20),'...') FROM `movies` LIMIT {$num} OFFSET {$offset} ";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([$pages, $result]);二 、 前台显示
在html里使用js创建一个ajax对象 var request = new XMLHttpRequest();
监听这个ajax并且以函数表达式执行
如果请求的.readyState的值===4,那么就把ajax获取到的内容使用JSON.parse赋值给变量data,这里的data包含第一页发送数组内的两个数组,访问的时候以下标方式访问。
获取一下ul标签,因为当前页面就一个UL所以可以直接在后面加上.item(0)
使用for循环一下data[0],在循环体内创建一个li标签,因为li的下标是从0开始的,所以这里的li内的值要使用i+1方式传值。
li.onclick,点击LI标签的时候执行函数,这里使用的是location.search.slice(0,3)+this.Text;
location.search是查询当前URL里问号后面的字符,.slice(0,3)是从前面第0位开始截取3个字符,后面的this.Text是获取到当前点击的LI标签内部的值进行拼接获取到最新的页码。
location.replace()是替换当前的URL地址。
ul.appendChild(li);是把循环完的li以appendChild方式添加到ul里面。
修改当前页码的背景色,同样使用获取地址URL的方式获取一下地址,不同的是这次是以 -1 截取最后一位字符,由于li下标是从0开始的,所以当前的值 - 1就是LI对应的下标,把这个值以下标方式传给获取到的li标签。
把这个li标签设置添加一个名为active的class。
显示当前页面的内容。
先获取到下标是0的tbody标签,data[1]是上个页面第二个数组内容,这时候使用ajax的forEach方式遍历一下,遍历函数里有一个回调函数,函数的参数可以随便写,这个参数就是第二个数组的传参。
创建标签tr
for循环一下value,创建一个td标签,把value下标key的值赋值给td并以innerText方式改写内容,最后插入tr,外层使用appendChild把tr插入tbody里。
配置请求request.open('GET', 'get_movies.php?p=<?php echo $_GET["p"] ?:1?>', true);
request.open方法以GET方式传参,获取get_movies.php页面的数据,并且输出获取到的页码。
发送请求 request.send(null);
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>电影分类</title>
<style>
/*设置表格样式*/
table
{
/*折叠表格线与单元格之间的间隙*/
border-collapse:collapse;
width: 90%;
}
/*设置表格与单元格边框*/
table,th, td
{
border: 1px solid black;
}
/*设置标题行背景色*/
table thead tr:first-of-type {
background-color: lightblue;
}
/*设置每一列的宽度*/
table tbody tr td:nth-of-type(1) {
width: 10%;
}
table tbody tr td:nth-of-type(2){
width: 20%;
}
table tbody tr td:nth-of-type(3) {
width: 70%;
}
/*设置分页条样式*/
ul {
text-align: center;
}
ul li {
/*去掉默认样式*/
list-style-type: none;
/*转为水平显示*/
display: inline-block;
width: 30px;
height: 20px;
border: 1px solid black;
/*垂直水平居中*/
text-align: center;
line-height: 20px;
cursor: pointer;
margin-left: 5px;
}
ul li:hover {
background-color: lightblue;
border: 1px solid red;
}
/*作业: 如何设置当前页码的高亮?*/
.active {
background-color: lightblue;
border: 1px solid red;
}
</style>
</head>
<body>
<table>
<caption>最新影视剧介绍</caption>
<thead>
<tr>
<th>序号</th>
<th>片名</th>
<th>简介</th>
</tr>
</thead>
<!-- tr*5>td{x}*3-->
<tbody>
</tbody>
</table>
<!--分页条-->
<ul>
</ul>
<script>
// 创建 Ajax对象
var request = new XMLHttpRequest();
// 监听请求
request.onreadystatechange = function () {
// 请求成功
if (request.readyState === 4) {
var data = JSON.parse(request.responseText);
// console.log(data);
// 1. 动态显示分页条
var ul = document.getElementsByTagName('ul').item(0);
for (var i = 0; i < data[0]; i++) {
var li = document.createElement('li');
li.innerText = (i+1);
// 动态显示数据
li.onclick = function () {
var search = location.search.slice(0,3) + this.innerText;
location.replace(search); //替换当前请求
};
// 将表格内容渲染到页面中...
ul.appendChild(li);
}
// 当前字体颜色
var s1 = location.search.slice(-1)-1 ;
var lis = document.getElementsByTagName('li')[s1];
// console.log(lis)
lis.setAttribute("class","active");
// 2. 显示当前页内容
var tbody = document.getElementsByTagName('tbody').item(0);
// console.log(data[1]);
data[1].forEach(function (value){
// console.log(value);
var tr = document.createElement('tr');
for (var key in value) {
var td = document.createElement('td');
td.innerText = value[key];
tr.appendChild(td);
}
tbody.appendChild(tr);
});
}
};
// 配置请求
request.open('GET', 'get_movies.php?p=<?php echo $_GET["p"] ?:1?>', true);
// 发送请求
request.send(null);
</script>
</body>
</html>最后无图无真相

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号