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

时间:2021-12-22 06:25:22

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

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

html代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?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程序设计有所帮助。