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+mysql扎实个人基本功
Mar 27 PHP
常用的PHP数据库操作方法(MYSQL版)
Jun 08 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
PHP计算当前坐标3公里内4个角落的最大最小经纬度实例
Feb 26 PHP
php网页版聊天软件实现代码
Aug 12 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
Mar 14 PHP
PHP实现的DES加密解密封装类完整实例
Apr 29 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
ThinkPHP框架实现的邮箱激活功能示例
Jun 15 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维护文件系统
2006/10/09 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
php获取微信openid方法总结
2019/10/10 PHP
htm调用JS代码
2007/03/15 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
js删除局部变量的实现方法
2016/06/25 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
python读取文本中的坐标方法
2018/10/14 Python
Python安装whl文件过程图解
2020/02/18 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
经济系大学生求职信
2013/10/01 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技