本案例的数据查询包括两种,一种是快速查询,如图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(); //添加文本区域自动伸缩外部插件
}
}