php+mysql+ajax实现单表多字段多关键词查询的方法


Posted in PHP onApril 15, 2017

本文实例讲述了php+mysql+ajax实现单表多字段多关键词查询的方法。分享给大家供大家参考,具体如下:

单表多字段查询在一些稍微复杂一点的查询中十分有用。这里主要利用MySQL数据库中的concat函数实现单表多字段多关键词查询。并且显示查询结果的表格可根据所选数据表动态生成。

html代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title></title>
    <script src="js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/jPages.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
      $(function(){
        //回车提交查询
        $('#queryBox').keydown(function(e){
          if(e.keyCode == 13)
          {
            $("#query").focus();//查询按钮获得焦点
            $("#query").click();//调用点击提交按钮
          }
        });
        //点击查询按钮
        $("#query").click(function(){
          //获取用户选择的数据表和查询关键词
          var queryType=$("#queryType").val().trim();
          var queryKeywords=$("#queryKeywords").val().trim();
          //对查询关系词的内容进行限制,比如只能输入汉字、字母、数字和空格。
          var reg=/^[ a-zA-Z0-9\u4e00-\u9fa5]+$/;
          if(reg.test(queryKeywords)==false)
          {
            $("#queryTip").text("您输入的关键词有部分内容不符合要求,只能输入汉字、字母、数字和空格。");
          }
          //如果内容检测通过,开始提交查询
          else
          {
            if(queryType!="" && queryKeywords!="")
            {
              $("#queryTip").text("正在为您检索,请稍候……");
              //使用ajax访问php页面进行查询
              $.ajax({
                type:"post",
                url:"queryInIndex.php",
                async:true,
                data:{queryType:$("#queryType").val(),queryKeywords:$("#queryKeywords").val()},
                dataType:"json",
                success:function(data){
                  if(data=="no")
                  {
                    $("#queryTip").text("没有找到您要查询的信息。");
                  }
                  else
                  {
                    $("#queryTip").text("为您找到 "+data.length+" 条信息。");
                    //预设结果表格字符名
                    if($("#queryType").val()=="users")
                      fieldsString="邮箱,姓名,英文名,学号,学位类型,导师,手机,房间";
                    else if($("#queryType").val()=="papers")
                      fieldsString="作者,标题,期刊/会议,卷期页,级别,状态";
                    else if($("#queryType").val()=="softwares")
                      fieldsString="作者,标题,登记号,日期";
                    else if($("#queryType").val()=="patents")
                      fieldsString="作者,标题,受理日期,受理号,授权日期,授权号";
                    //调用函数创建表格
                    createTable("queryResultList",data,fieldsString,"queryResultPager");
                    $("#queryKeywords").focus();// 关键词文本框继续获得焦点,以方便用户继续输入内容
                  }
                }
              });
            }
            else
            {
              $("#queryTip").text("请先选择查询类型,并输入关键词,然后点击查询按钮。");
              $("#queryKeywords").focus();
            }
          }
        })
        function createTable(tableHolder,data,fieldsString,pagerHolder)
        //自动创建结果表格的函数
        /*
         参数含义:
         tableHolder:显示结果表格的父元素
         data:JSON格式的查询结果
         fieldsString:字段名字符串
         pagerHolder:显示分页导航的元素
         * */
        {
          fieldsArr=fieldsString.split(",");//对字段名字符串进行分割
          var columnNum=fieldsArr.length; //获取列数
          var rowNum=data.length;//获取行数
          $('#'+tableHolder).html("");//清除现有表格
          $('#'+tableHolder).append("<table border='1'><thead><tr></tr></thead><tbody></tbody></table>"); //设置表格结构
          var i=0; //临时循环变量
          while(i<columnNum) //加载字段值
          {
            $('#'+tableHolder+" thead tr").append("<th>"+fieldsArr[i]+"</th>");
            i++;
          }
          i=0;
          while(i<rowNum)//加载数据
          {
            var j=0;
            $('#'+tableHolder+" tbody").append("<tr>")
            while(j<columnNum)
            {
              $('#'+tableHolder+" tbody tr:last").append("<td>"+data[i][j]+"</td>");
              j++;
            }
            $('#'+tableHolder+" tbody").append("</tr>")
            i++;
          }
          //分页导航,这里利用jPages插件
          $("#"+pagerHolder).jPages({
           containerID : tableHolder+" tbody", //存放表格的窗口标签ID
           previous : "前一页", //指示首页的按钮
           next : "下一页",//指示尾页的按钮
           perPage : 10,//每页显示表格的行数
           delay : 0 //分页时动画持续时间,0表示无动画
          });
          //设置结果表格的隔行变色
          $('#'+tableHolder+" tr:odd").css("background-color","#fff");
          $('#'+tableHolder+" tr:even").css("background-color","#efefef");
        }
      })
    </script>
  </head>
<body>
  <div id="queryBox" style="text-align: center; padding-top: 10px;padding-bottom: 10px; width: 100%;">
    <span>
      <select id="queryType" style="height: 30px;"><!--选择数据表的下拉菜单-->
        <option selected="selected" value="">请选择数据表</option>
        <option value="users">学生信息</option>
        <option value="papers">论文</option>
        <option value="softwares">软著</option>
        <option value="patents">专利</option>
      </select>
    </span>
    <span>
      <input type="text" id='queryKeywords' style="width: 200px; height: 25px;"/><!--输入查询关键词的文本框-->
      <input type="button" id="query" style="width: 30px; height: 30px; cursor: pointer;" /> <!--提交查询按钮-->
    </span>
    <div id="queryTip" class="tip">本功能支持以空格为分割标记的多词查询。</div><!--信息提示框-->
  </div>
  <div id="queryResultList"></div><!--用于显示查询结果-->
  <div id="queryResultPager" style="text-align: center; margin-top: 10px;"></div><!--结果分页导航的容器-->
</body>
</html>

queryInIndex.php:

<?php
include_once("../phpFiles/connMysql.php");//包含连接数据库的代码
$queryType=$_POST['queryType'];//目标数据表
$queryKeywords=$_POST['queryKeywords'];  //查询词
$queryKeywords = preg_replace('#\s+#', ' ',$queryKeywords);//将字符串中多个连续空格替换为一个空格
$keywords=explode(" ",$queryKeywords); //查询词按空格分割
//根据不同的数据表生成不同的查询语句
if($queryType=="users")
{
  $sqlsmt="select email,truename,enName,stuid,degree,supervisorname,tel,room from $queryType where "; //查询语句的初始值
  //利用循环 生成对每个关键词的查询语句
  foreach ($keywords as $keyword)
  {
    $sqlsmt.="concat(email,truename,enName,stuid,degree,supervisorname,tel,room) like '%$keyword%' or ";//本句是关键,利用concat函数实现从多个字段查询单个关键词,并用' or '关键词把每个关键词的concat结果合并
  }
  $sqlsmt=substr($sqlsmt,0,strlen($sqlsmt)-3); //去掉查询字符串尾部的' or '
  $sqlsmt.=" order by degree asc, stuid desc"; //追加排序子句
}
else if($queryType=="papers")
{
  $sqlsmt="select authors,title,jorc,vap,level,status from $queryType where ";
  foreach ($keywords as $keyword)
  {
    $sqlsmt.="concat(authors,title,jorc,vap,level,status) like '%$keyword%' or ";
  }
  $sqlsmt=substr($sqlsmt,0,strlen($sqlsmt)-3);
  $sqlsmt.=" order by level desc, vap desc";
}
else if($queryType=="softwares")
{
  $sqlsmt="select authors,title,num,date from $queryType where ";
  foreach ($keywords as $keyword)
  {
    $sqlsmt.="concat(authors,title,num,date) like '%$keyword%' or ";
  }
  $sqlsmt=substr($sqlsmt,0,strlen($sqlsmt)-3);
  $sqlsmt.=" order by date desc";
}
else if($queryType=="patents")
{
  $sqlsmt="select authors,title,acceptDate,acceptNum,authorizeDate,authorizeNum from $queryType where ";
  foreach ($keywords as $keyword)
  {
    $sqlsmt.="concat(authors,title,acceptDate,acceptNum,authorizeDate,authorizeNum) like '%$keyword%' or ";
  }
  $sqlsmt=substr($sqlsmt,0,strlen($sqlsmt)-3);
  $sqlsmt.=" order by acceptDate desc";
}
$myrs=mysql_query($sqlsmt);//执行查询
if(mysql_num_rows($myrs)==0)//如果结果为空 返回'no'
{
  echo(json_encode("no"));
}
else //否则返回json格式的结果
{
  while($row=mysql_fetch_array($myrs))
  {
    $temp[]=$row;
  }
  echo(json_encode($temp));
}
?>

运行结果截图:

php+mysql+ajax实现单表多字段多关键词查询的方法

php+mysql+ajax实现单表多字段多关键词查询的方法

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
其他功能
Oct 09 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
May 04 PHP
php缓存技术详细总结
Aug 07 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
May 12 PHP
PHP实现GIF图片验证码
Nov 04 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
PHP解决中文乱码
Apr 28 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
Apr 27 PHP
php解析非标准json、非规范json的方式实例
May 10 PHP
PHP快速推送微信模板消息
Apr 14 #PHP
PHP 中常量的知识整理
Apr 14 #PHP
php动态读取数据清除最右边距的方法
Apr 12 #PHP
详解使用php调用微信接口上传永久素材
Apr 11 #PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 #PHP
PHP和MYSQL实现分页导航思路详解
Apr 11 #PHP
php 一维数组的循环遍历实现代码
Apr 10 #PHP
You might like
收音机术语解释
2021/03/01 无线电
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
jquery validate poshytip 自定义样式
2012/11/26 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
vue祖孙组件之间的数据传递案例
2020/12/07 Vue.js
Python日期操作学习笔记
2008/10/07 Python
Python时间戳与时间字符串互相转换实例代码
2013/11/28 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
pyqt5 QProgressBar清空进度条的实例
2019/06/21 Python
Python Django 命名空间模式的实现
2019/08/09 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
自行车租赁公司创业计划书
2014/01/28 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
婚姻出轨保证书
2015/05/08 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技