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 相关文章推荐
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
成为好程序员必须避免的5个坏习惯
Jul 04 PHP
php文件下载处理方法分析
Apr 22 PHP
PHP中的常见魔术方法功能作用及用法实例
Jul 01 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
PHP内存缓存功能memcached示例
Oct 19 PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
PHP观察者模式原理与简单实现方法示例
Aug 25 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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
PHP在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
深入php self与$this的详解
2013/06/08 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
详解如何较好的使用js
2016/12/16 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
JS数组方法join()用法实例分析
2020/01/18 Javascript
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Python二分法搜索算法实例分析
2015/05/11 Python
Python3匿名函数用法示例
2018/07/25 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
Python中几种属性访问的区别与用法详解
2018/10/10 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
Python 处理文件的几种方式
2019/08/23 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
Django配置文件代码说明
2019/12/04 Python
Python编程快速上手——选择性拷贝操作案例分析
2020/02/28 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
苹果台湾官网:Apple台湾
2019/01/05 全球购物
大学生职业生涯规划范文
2014/01/08 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
庆六一开幕词
2015/01/29 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers