本案例的数据查询包括两种,一种是快速查询,如图1所示;另一种是自定义查询,如图2所示。
图1 快速查询数据
图2 自定义查询数据
自定义查询的难点就是如何获取用户设置的各种条件,并把这些条件按着SQL语法规则构建成查询字符串,并根据这个查询字符串调用exeshow()函数把查询的数据显示在页面底部的视图包含框中。该处理函数的难点是如何灵活而又严谨根据用户复杂的设置构建SQL查询字符串,实现的代码如下。
//=================================== //自定义查询 function custquery(){ //读取表单域中的数据 var table0 = document.getElementById("table0"); var col = document.getElementById("col"); var allcol = document.getElementById("allcol"); var row = document.getElementById("row"); var where = document.getElementById("where"); var orderby = document.getElementById("orderby"); var order = document.getElementById("order"); var save0 = document.getElementById("save0"); save0.onclick = function(){ //根据自定义查询表单中的设置条件进行查询 var table0value = table0.value; var colvalue = col.value; var allcolvalue = allcol.value; var rowvalue = row.value; var wherevalue = where.value; var orderbyvalue = orderby.value; var ordervalue = order.value; //获取字段列表被选中的值 var coloption = col.getElementsByTagName("option"); var colValue = []; for(var i=0;i<coloption.length; i++){ if(coloption[i].getAttribute("selected")) colValue.push(coloption[i].value); } //设计查询字符串 var sql = "select"; //TOP if(parseFloat(rowvalue) != 0) sql += " top " + rowvalue; //查询字段 if(allcolvalue){ //查询所有字段 sql += " * "; colValue = []; //清空字段列表数组 } else if(colValue && colValue !="" && colValue != undefined){ //查询部分字段 var str = colValue.join(","); if(str.indexOf("id")<0) str = "id," +str; //如果不包括id字段,则加上 sql += " " + str; } else{ //查询所有字段 sql += " * "; } //TABLE sql += " from [" + table0value + "]"; //WHERE wherevalue = wherevalue.replace(/^(\s| )+/g,'').replace(/(\s| )+$/g, ''); //清除两侧空格 //SQL字段筛选关键字 var whereid = ["<",">","(",")","[","]","=","*","?","!","or","and","is","in ","if","not","between","exists", "like","datediff"]; //条件指示变量 var wheretrue = false; //检测WHERE语句是否包含关键字 for(var i=0;i<whereid.length;i++){ var str = whereid[i]; if(wherevalue.indexOf(str)>0) //这里还存在一个问题,如果字段中包含上面关键字,将会出现错误 wheretrue = true; } //检测WHERE下语句是否仅包含一个字段 var wherefield = ["id","price","outclass","inclass","shopclass","outid","detail","date","class"]; for(var i=0;i<wherefield.length;i++){ var str = wherefield[i]; if(wherevalue == str) wheretrue = true; } //如果非法的条件,则清除WHERE语句 if(wheretrue ==false) wherevalue = ""; //满足条件,则追加WHERE语句 if(wherevalue && wherevalue !="" && wherevalue != undefined ){ sql += " where " + wherevalue; } //ORDER sql += " order by " + orderbyvalue + " " + ordervalue; //设置口令 if(!key(sql,table1limit)) return false; //执行查询 var rs = requeryrs(sql); //调用exeshow()方法,处理查询的数据 exeshow({ box: showtablebox, rs: rs, table: table0value, sql: sql, tabletitle: this.value + "(" + table0value + ")" }); //添加文本区域自动伸缩外部插件 $('textarea').elastic(); } }
借助exeshow()函数,我们可以快速查询任意条件的数据。固定查询的功能要比任意查询的功能容易实现,读者不需要处理复杂的查询条件,只需要根据固定的查询条件设置SQL字符串,然后调用exeshow()函数函数即可。
由于固定查询包括按月查询、按时间段查询、模糊查询、最近日期查询和查询指定天数的记录。下面我们以模糊查询为例进行说明,其他快速查询的实现函数可以参阅光盘示例。模糊查询的核心就是把用户输入的多个关键词劈开,然后借助SQL的instr()函数即可,实现代码如下。
//=================================== //模糊查询 function mohu(){ var table3 = document.getElementById("table3"); var key = document.getElementById("key"); var save3 = document.getElementById("save3"); save3.onclick = function(){ var table3value = table3.value; var keyvalue = key.value; if( keyvalue != "" && keyvalue != undefined && keyvalue != null ){ //验证 //劈开关键词 keyvalue = keyvalue.replace(/^(\s| )+/g,'').replace(/(\s| )+$/g, ''); //清空两侧空格 keyvalue = keyvalue.replace(/(\s| )+/g," "); //把多个空格替换为一个空格 var a = keyvalue.split(" "); var sqlstr = "" for(var i=0; i<a.length; i++){ sqlstr += " detail like '*+ a[i] +*'" + a[i] + "*' and "; sqlstr += "instr(remark,'"+ a[i] +"')>0 and "; } sqlstr = sqlstr.substring(0,sqlstr.lastIndexOf("and")); var sql = "select * from ["+ table3value + "] where " + sqlstr; }else{ alert("没有输入关键字!"); return false; } sql += " order by id desc"; if(!key(sql,table1limit)) //设置口令 return false; var rs = requeryrs(sql); exeshow({ //调用exeshow()方法,处理查询的数据 box: showtablebox, rs: rs, table: table3value, sql: sql }); $('textarea').elastic(); //添加文本区域自动伸缩外部插件 } }