批改状态:合格
老师批语:写得不错, 超出我的预期
功能描述:
设置搜索条件,可以单一条件搜索 也可多个条件同时搜索,完成数据查询 生成前台显示的功能,
前后端通讯方式 ajax 异步 $.ajax 适用POST请求方式完成。
总结 :前端script代码过多,适用post方式提交翻页请求时需重新获取翻页标签属性值,并生成数据传输后台才能生效 很繁琐
如果首次查询以POST方式提交传输数据,后继翻页不方便变更为GET方式翻页,后台获取参数频繁报错,所以就功能而言,前后简单查询和翻页查询的提交传输数据方式应该保持一致。 功能还有可以更细致完善的地方没有完善。页码过多时的显示样式没有设计实现。用ajax方式实现的翻页效果 比直接用php 在当前页实现翻页效果复杂的多,相当繁琐。
无条件查询

单一条件查询 当前表中男的有多少

复合条件查询 男的 工资在3000到5000的有谁

复合条件查询 + 翻页 男的 年龄在20到30之间 的第二页数据

以下为实例代码
前台页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页查询实战</title>
<script src="./lib/js/jquery-3.4.1.js"></script>
</head>
<style>
*{
margin: 0;
padding: 0;
}
ul{
list-style-type: none;
}
a{
text-decoration: none;
}
.form{
width: 600px;
height: 150px;
margin: 50px auto;
padding: 10px 25px;
text-align: center;
border-radius:7px;
border: 1px solid black;
}
.form table{
border-collapse:collapse;
width:600px;
margin:0 auto;
text-align:center;
}
.form tr td{
width:148px;
}
.form input[type='text']{
width: 100px;
float: left;
}
.resultTable{
width:800px;
height: 300px;
margin: 10px auto;
text-align: center;
border-radius:7px ;
border: 1px solid black;
}
.resultTable table{
border-collapse:collapse;
width:700px;
margin:0 auto;
text-align:center;
}
caption{
margin: 10px auto;
font-weight: bold;
}
.resultTable table th,td{
border:1px solid #000000;
}
.resultTable table th{
background:lightblue;
}
.resultTable .page{
text-align: center;
width: 800px;
display: table-cell;
vertical-align: middle;
}
.page ul{
margin-top: 15px;
list-style-type: none;
}
.page ul li{
margin: 15px 5px;
padding: 3px 10px;
display: inline;
color: black;
border-radius: 4px;
border: 1px solid lightskyblue;
}
.page ul li:hover{
margin: 15px 5px;
padding: 3px 10px;
display: inline;
color: red;
border-radius: 4px;
border: 1px solid lightskyblue;
}
.page ul li:last-child input {
width: 50px;
margin: 0 5px;
}
</style>
<body>
<div class="form">
<form action="" name="search">
<table>
<tr>
<td>
<label for="name">姓名 :</label>
</td>
<td colspan="3"><input type="text" id="name"></td>
</tr>
<tr>
<td><label for="name">性别 :</label></td>
<td colspan="3">
<input type="radio" name="sex" value="2">女
<input type="radio" name="sex" value="1">男
</td>
</tr>
<tr>
<td><label for="ageSymbol">年龄 :</label></td>
<td>
<select name="ageSymbol" id="ageSymbol">
<option value="0">等于</option>
<option value="1">大于</option>
<option value="2">小于</option>
<option value="3=">不等于</option>
<option value="4">之间</option>
</select>
</td>
<td><input class="hidden" type="text" id="age1" name="age1" value=""></td>
<td><input type="text" id="age2" name="age2" value="" hidden></td>
</tr>
<tr>
<td><label for="salarySymbol">工资 :</label></td>
<td>
<select name="salarySymbol" id="salarySymbol">
<option value="0">等于</option>
<option value="1">大于</option>
<option value="2">小于</option>
<option value="3">不等于</option>
<option value="4">之间</option>
</select>
</td>
<td><input type="text" id="salary1" name="salary1" value=""></td>
<td><input type="text" id="salary2" name="salary2" value="" hidden></td>
</tr>
<tr>
<td colspan="4">
<button type="button" id="btn_search">查询提交</button>
</td>
</tr>
</table>
</form>
</div>
<div class="resultTable">
<table>
<caption>员工信息表</caption>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>工资</th>
</tr>
</thead>
</table>
<div class="page">
</div>
</div>
<script>
//查询表单定位
var searchInfo = document.forms.namedItem("search");
// 结果显示的表格定位
var table = document.getElementsByTagName("table")[1];
// 新建表格主体元素 tbody
var tbody = document.createElement("tbody");
// ul定位 用于显示页码
var page = document.getElementsByClassName("page")[0];
var ul = document.createElement("ul");
//条件查询按钮
var btn_search = document.getElementById('btn_search');
// 条件查询按钮 按键监听
btn_search.addEventListener('click',searchData,false);
//年龄和工资 的输入框定位
var age = document.getElementById('ageSymbol');
var age2 = document.getElementById('age2');
var salary = document.getElementById('salarySymbol');
var salary2 = document.getElementById('salary2');
//年龄输入内容设置为区间条件时 触发监控 显示第二个年龄输入框
age.addEventListener("change",editAge,false);
function editAge(){
if(age.value == "4"){
age2.removeAttribute("hidden");
}else{
age2.setAttribute("hidden",true);
}
}
//工资输入内容设置为区间条件时 触发监控 显示第二个工资输入框
salary.addEventListener("change",editSalary,false);
function editSalary(){
if(salary.value == "4"){
salary2.removeAttribute("hidden");
}else{
salary2.setAttribute("hidden",true);
}
}
// 条件查询 按键触发的搜索事件
function searchData(){
var dataStr = "name="+searchInfo.name.value+"&sex="+searchInfo.sex.value+"&ageSymbol="+searchInfo.ageSymbol.value+
"&age1="+searchInfo.age1.value+"&age2="+searchInfo.age2.value+"&salarySymbol="+searchInfo.salarySymbol.value+
"&salary1="+searchInfo.salary1.value+"&salary2="+searchInfo.salary2.value;
//异步传输数据
$.ajax({
// 请求类型
type:"POST",
// 请求的服务器处理程序: url
url:"pages.php",
// 成功回调
success:resultDate,
// 服务器返回的数据类型
dataType: "json",
// 发送到服务器的数据,默认转为请求字符串/键值对
data:dataStr
})
}
// 查询按键触发的搜索事件,查询成功后的调用函数
function resultDate(msg){
var res ="";
if(msg.state == 0){
var sqlData=msg.data;
var pages =msg.pages;
//循环输出查询结果
sqlData.forEach(function(item){
// console.log(data);
// console.log(data['name']);
if (item['sex']==0) {
var sex ="男";
}else{
var sex= "女";
}
//组合HTML显示代码
res+="<tr>"
+"<td>"+item['id']+"</td>"
+"<td>"+item['name']+"</td>"
+"<td>"+sex+"</td>"
+"<td>"+item['age']+"</td>"
+"<td>"+item['salary']+"</td>"
+"<tr>";
return res;
});
//控制台输出测试一下 HTML字串是否正确
//console.log(res);
if(tbody.firstChild===null){
//没有子节点,直接为当前节点赋值
tbody.innerHTML=res;
}else{
//但前节点有子节点,说明有原先的值,把原值清理掉 重新组合
tbody.innerHTML=null;
tbody.innerHTML=res;
}
//将查询结果的HTML显示元素插入table标签
table.appendChild(tbody);
//构建页码显示
//控制台查看一下总页码数量
// console.log(pages)
var pageHtml="";
for (var i =1;i<=pages;i++){
pageHtml += "<li value="+i+">"+i+"</li>";
}
pageHtml = "<li value='1'>首页</li>"+pageHtml+"<li value="+pages+">尾页</li>";
ul.innerHTML=pageHtml;
// console.log(pageHtml);
page.appendChild(ul);
}
}
// li事件委托监听 按键
page.addEventListener("click",pageSearch,false);
// 监听调用的 翻页响应事件
function pageSearch(e){
// alert("什么鬼")
//获取当前发生行为元素的文本值 li标签对应的属性值
var p = e.target.getAttribute("value");
console.log(p);
var dataStr = "p="+p+"&name="+searchInfo.name.value+"&sex="+searchInfo.sex.value+"&ageSymbol="+searchInfo.ageSymbol.value+
"&age1="+searchInfo.age1.value+"&age2="+searchInfo.age2.value+"&salarySymbol="+searchInfo.salarySymbol.value+
"&salary1="+searchInfo.salary1.value+"&salary2="+searchInfo.salary2.value;
//异步传输数据
$.ajax({
// 请求类型
type:"POST",
// 请求的服务器处理程序: url
url:"pages.php",
// 成功回调
success:resultDate,
// 服务器返回的数据类型
dataType: "json",
// 发送到服务器的数据,默认转为请求字符串/键值对
data:dataStr
})
}
</script>
</body>
</html>点击 "运行实例" 按钮查看在线实例
以下为后台实例代码 pages.php
<?php
//echo "<pre>";
//echo print_r($_SERVER);
$name = $_POST['name'];
$sex = $_POST['sex'];
$ageSymbol = $_POST['ageSymbol'];
$age1 = $_POST['age1'];
$age2 = $_POST['age2'];
$salarySymbol = $_POST['salarySymbol'];
$salary1 = $_POST['salary1'];
$salary2 = $_POST['salary2'];
// 为符号标识更换 条件标识
$arr =[0=>"=",1=>">",2=>"<",3=>"!="];
foreach ($arr as $key=>$val){
if($ageSymbol==$key){
$ageSymbol = $val;
}
}
foreach ($arr as $key=>$val){
if($salarySymbol==$key){
$salarySymbol = $val;
}
}
//查询条件变量
$requirement = null;
// 姓名属性存在时生成的 查询条件
if(!empty($name)){
$requirement = " WHERE `name` = '".$name."' ";
}
// 性别属性存在时可以生成的两种 查询条件
if(!empty($sex)){
$sex==1?$sex=0:$sex=1;
if(strlen($requirement)>0) {
// 按性别和姓名同时存在时生成的 查询条件
$requirement .= " AND `sex` = ".$sex;
}else{
// 仅性别条件存在时的 查询条件
$requirement = " WHERE `sex` = ".$sex;
}
}
// 年龄属性存在是可以生成的几种 查询条件
if(!empty($age1)) {
// 判断之前是否已经生成查询条件,如已有部分查询条件则执行如下
if (strlen($requirement) > 0) { //有前置查询条件
// 根据第二个年龄是否存在,判断是否开启区间查询语句
if (!empty($age2)) {
//存在
$requirement .= " AND `age` BETWEEN " . $age1 . " AND " . $age2;
} else {
//不存在
$requirement .= " AND `age` " . $ageSymbol . " " . $age1;
}
} else {
//没有前置查询条件
if (!empty($age2)) {
//存在 年龄2
$requirement = " WHERE `age` BETWEEN " . $age1 . " AND " . $age2;
} else {
//不存在 年龄2
$requirement = " WHERE `age` " . $ageSymbol . " " . $age1;
}
}
}
// 工资属性存在是可以生成的几种 查询条件
if(!empty($salary1)) {
// 判断之前是否已经生成查询条件,如已有部分查询条件则执行如下
if (strlen($requirement) > 0) { //有前置查询条件
// 根据第二个工资是否存在,判断是否开启区间查询语句
if (!empty($salary2)) {
//存在
$requirement .= " AND `salary` BETWEEN " . $salary1 . " AND " . $salary2;
} else {
//不存在
$requirement .= " AND `salary` " . $salarySymbol . " " . $salary1;
}
} else {
//没有前置查询条件
if (!empty($salary2)) {
//存在 工资2
$requirement = " WHERE `salary` BETWEEN " . $salary1 . " AND " . $salary2;
} else {
//不存在 工资2
$requirement = " WHERE `salary` " . $salarySymbol . " " . $salary1;
}
}
}
// 测试 查询条件字符串
//echo $requirement;
try{
$pdo = new PDO("mysql:host=127.0.0.1;dbname=php","root","root");
}catch (PDOException $E){
die("数据库连接出错".$E->getMessage());
}
//获取当前页码
if(isset($_POST['p'])){
$page = $_POST['p'];
}else{
$page = 1;
}
//每页分页最大记录数
$num = 5 ;
//每页查询到
$offset = ($page-1)*$num;
//计算符合查询条件的记录总数
$sql_pages = "SELECT `id`,`name`,`sex`,`age`,`salary` FROM `staff`{$requirement} ";
//echo $sql_pages;
$stmt = $pdo->prepare($sql_pages);
$stmt->execute();
$count = $stmt->rowCount();
$pages =ceil($count / $num);
//当页符合查询条件的记录
$sql_limit = "SELECT `id`,`name`,`sex`,`age`,`salary` FROM `staff`{$requirement} LIMIT {$offset},{$num}";
//echo $sql_limit;
$stmt = $pdo->prepare($sql_limit);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
//测试输出结果集
//foreach ($rows as $val){
// print_r($val);
//}
exit (json_encode(["state"=>0,"pages"=>$pages,"data"=>$rows]));点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号