数据查询

课后整理 2021-2-25

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