`

动态生成SQL查询条件定制表单及语句的脚本

阅读更多
  最近使用AJAX技术来做东西,写了很多的JS代码,也分析了一些别人的JS程序,使用VS.net进行跟踪调试,积累了些经验,现在可以很流畅地使用JS来写些程序来满足自己的需要了。
  我做的东西里有一项是通用的表格展示,服务器端使用DOM4J来转换生成XML数据,在客户端使用JS解析XML数据,然后在插件中展示数据,附带添加、删除及修改功能,这部分功能已经实现,基本上使用一个页面和一个Action(struts里的东东)就可以对任何表进行展示、添加、删除和修改。但对于查询,不太容易做到通用,想了好长时间,还是使用XML与JS来解决了。也就是使用XML来定义要查询的字段、类型,然后在客户端自动解释成表单。目前的版本功能很简单,没有数据验证功能,仅能用AND连接查询条件(不过好象实际使用中,多数时候都是用AND),更多功能在以后会进一步完善。
  代码分为四个部分:
  一、核心是解析XML形式的表单定义数据、生成表单、拼接SQL语句、并对表单面板进行控制的JS文件;其中XML数据可以是数据岛中定义的,可以是网页中的字符串,也可以是单独的XML文件,另外,XML数据可以使用异步的方式进行加载(这个功能借鉴了dhtmlXTree中的方法);
  二、一个辅助的日期选择脚本,供日期类型字段选择日期用;
  三、一个样式表文件;
  四、一个例子网页;
  下面我的核心代码贴在这里,详细的代码请到我的网络硬盘下载http://wallimn.gbaopan.com ,或发邮件向我索取。
///////////////////////////////sqlgen.js///////////////////////////////////////
// JavaScript Document
 function sqlgen(fields){
  this.dateind=0;
  this.panelini=false;
  if(typeof fields=="object")
   this.fields=fields;
  else this.fields=null;
  this.panelini=false;
  this.contab=document.getElementById("conditiontabbody");
  this.whereclause="";
  this.onokafter=function(sql){alert("条件子句为:"+sql+"\n点击后处理事件尚未添加,请定义onokafter函数。");};
  this.test = function(){
   return this.onokafter.apply(null, this);
  };
 }
 function genbtnhook(self){
  var okbtn = document.getElementById('beginsearch');
  if(typeof okbtn!="undefined"){
   okbtn.onclick=function(){return self.onsqlok.apply(self, []);};
  }
 }
 sqlgen.prototype.onsqlok=function(){
  //return null;
  this.whereclause = this.getsqlstring();
  //alert(this.whereclause+this.dateind);
  if(this.onokafter!=null){
   //this.onokafter(this.whereclause);
   //alert(this.whereclause);
   return this.onokafter.apply(null, [this.whereclause]);
  }
 }
 sqlgen.prototype.getsqlstring=function(){
  //var contab = document.getElementById("conditiontabbody");
  if(this.fields==null || typeof this.contab=="undefined")return "";
  //alert(contab.tbody.innerHTML);
  var trs = this.contab.getElementsByTagName("tr");
  var onerow=null;
  var desc, type, name;
  var c1,c2,v1,v2;
  if(typeof trs == "undefined")return "";
  //var fields = document.all('xmlfields').XMLDocument.getElementsByTagName('Field');
  var field=null;
  var re="";
  for(var i=0; i<trs.length; i++){
   onerow = trs[i];
   c1 = onerow.getElementsByTagName("select")[0].value;
   if(c1=="")continue;
   desc = onerow.getElementsByTagName("span")[0].innerText;
   v1 = onerow.getElementsByTagName("input")[0].value;
   field = this.fields[i];
   type = field.getAttribute('Type');
   name = field.getAttribute('Name');
   if(type=="String")v1="'"+v1+"'";
   else if(type=="Date")v1="todate('"+v1+"','yyyy-mm-dd hh24:mi:ss')";
   else if(type=="Number")v1=v1;
   else continue;
   if(c1!="" && v1!="")re = re + "("+name + " "+ c1 +" "+  v1 + ") and ";
   //type = onerow.getElementById("fieldtype").innerText;
   //desc = onerow.getElementById("fielddesc");
   //alert(' desc='+desc+' c1='+c1+' v1='+v1+' type='+type+' name='+name);   
   //break;
  }
  if(re!="") re =re.substr(0, re.length-5);
  return re;
 }
 sqlgen.prototype.generatepanel=function(){
  //var fields = document.all('xmlfields').XMLDocument.getElementsByTagName('Field');
  var field=null;
  var desc="", type="";
  var newrow = null;
  var cell,arr;
  //var contab = document.getElementById("conditiontabbody");
  for(var i=0; i<this.fields.length; i++){
   field = this.fields[i];
   desc = field.getAttribute('Desc');
   type = field.getAttribute('Type');
   newrow = this.contab.insertRow();
   //newrow.setAttribute("height","20px");
   arr = this.getcondition(type,desc);
   cell = newrow.insertCell();
   cell.setAttribute("width","100px");
   cell.setAttribute("align","right");
   cell.innerHTML=arr[0];
   cell = newrow.insertCell();
   cell.setAttribute("width","290px");
   cell.innerHTML=arr[1];
   cell = newrow.insertCell();
   cell.setAttribute("width","290px");
   cell.innerHTML=arr[2];
  }
 }
 sqlgen.prototype.getcondition=function(type,desc){
 var arr = new Array(0);
 if(type=="String"){
  arr[0] = '<span class="a" id="fielddesc">'+desc+'</span>';
  
  arr[1] = '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
     '<option value="">无限制</option>' +
     '<option value="=">等于</option>' +
     '<option value="like">象</option>' +
    '</select>' +
    '<input type="text" name="textfield" id="sqlvalue'+this.dateind+'" style="width:160px;" />';
    
  this.dateind++;//从0开始
  arr[2] = '&nbsp;';
  this.dateind++;//从0开始
 }
 else if(type=="Number"){
  arr[0] = '<span class="a" id="fielddesc">'+desc+'</span>';
  
  arr[1] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
      '<option value="">无限制</option>' +
      '<option value="=">等于</option>' +
      '<option value="<">小于</option>' +
      '<option value="<=">小于等于</option>' +
     '</select>' +
     '<input type="text" name="textfield" id="sqlvalue'+this.dateind+'" style="width:160px;" /> ';
  this.dateind++;//从0开始
      
  arr[2] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
      '<option value="">无限制</option>' +
      '<option value="=">等于</option>' +
      '<option value=">">大于</option>' +
      '<option value=">=">大于等于</option>' +
     '</select>' +
     '<input type="text" name="textfield" id="sqlvalue'+this.dateind+'" style="width:160px;" />' ;
  this.dateind++;//从0开始
  }
  else if(type=="Date"){
  arr[0] = '<span class="a" id="fielddesc">'+desc+'</span>';
  
  arr[1] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
     '<option value="">无限制</option>' +
     '<option value="=">等于</option>' +
     '<option value="<">小于</option>' +
     '<option value="<=">小于等于</option>' +
     '</select>' +
     '<input type="text" class="textInput" name="sqlvalue'+this.dateind+'" id="sqlvalue'+this.dateind+'" readonly ' +
     'style="width:140px;" onclick="javascript:DateControl20(document.getElementById(\'sqlvalue'+this.dateind+'\'))" />' +
     '<input type="button" value="×" onclick="javascript:document.getElementById(\'sqlvalue'+this.dateind+'\').value=\'\';"/>';
  this.dateind++;//从0开始
   
  arr[2] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
      '<option value="">无限制</option>' +
      '<option value="=">等于</option>' +
      '<option value=">">大于</option>' +
      '<option value=">=">大于等于</option>' +
     '</select>' +
     '<input type="text" class="textInput" name="sqlvalue'+this.dateind+'" id="sqlvalue'+this.dateind+'" readonly ' +
     'style="width:140px;" onclick="javascript:DateControl20(document.getElementById(\'sqlvalue'+this.dateind+'\'))" />' +
     '<input type="button" value="×" onclick="javascript:document.getElementById(\'sqlvalue'+this.dateind+'\').value=\'\';"/>';
  this.dateind++;//从0开始
  //alert(arr[1]+"\n"+arr[2]);   
  }
  else {
   arr[0]='类型不合法';
   arr[1]='类型不合法';
   this.dateind++;//从0开始
   arr[2]='类型不合法';
   this.dateind++;//从0开始
  }
  return arr;
 }
 function paneldisptoggle(){
  var panel = document.getElementById('searchpanel');
  //alert(this.panelini);
  var left = (document.body.clientWidth-700)/2;
  if(left<=0)left=1;
  panel.style.left=left+"px";
  //DispToggle('searchpanel');
     panel.style.display = panel.style.display=="none"?"":"none";
 }
 function paneldisptoggle2(){
  var panel = document.getElementById('searchpanel');
  //alert(this.panelini);
  panel.style.position="static";
  panel.style.margin="0 auto";
  //DispToggle('searchpanel');
     panel.style.display = panel.style.display=="none"?"":"none";
 }
 function placesqlgen(){
  document.write('<div id="searchpanel" style="display:none">');
  document.write('<div id="paneltitle">');
  document.write('  <table width="680px" border="0">');
  document.write(' <tr>');
  document.write('   <td><span style="color:#000000" class="a">查询条件定制面板</span></td>');
  document.write('   <td align="right"><input type="button" value="×" onclick="javascript:paneldisptoggle();"/></td>');
  document.write(' </tr>');
  document.write('  </table>');
  document.write('</div>');
  document.write('<div id="panelcontent">');
  document.write('<table width="680px" height="180" border="1" align="left" cellpadding="0" cellspacing="0" id="conditiontab">');
  document.write(' <tbody id="conditiontabbody">');
  document.write(' </tbody>');
  document.write('</table>');
  document.write('</div>');
  document.write('<div id="panelbottom">');
  document.write('  <table width="680px" border="0">');
  document.write(' <tr>');
  document.write('   <td align="center">');
  document.write('  <input type="button" value=" 确  定 " name="beginsearch" id="beginsearch" />');
  document.write('   </td>');
  document.write('   <td align="center">');
  document.write('  <input type="button" value=" 取  消 " name="cancelsearch" ');
  document.write('          id="cancelsearch" onclick="javascript:paneldisptoggle();"/>');
  document.write('   </td>');
  document.write(' </tr>');
  document.write('  </table>');
  document.write('</div>');
  document.write('</div>');
 }
 function docloadXML(xmlString){
     var xmldoc;
  try {
   xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
   xmlDoc.async=false;
   xmlDoc.loadXML(xmlString);
  }
  catch(e){
      var parser = new DOMParser();
      xmlDoc = parser.parseFromString(xmlString,"text/xml");
  }
  return xmlDoc;
    }
 //FileName也可以是个URL
 function docload(FileName){
     var xmldoc;
  try {
   xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
   xmlDoc.async=false;
   xmlDoc.load(FileName);
  }
  catch(e){
   //对于netscape不知如何处理。以后再添加。
   //下边的函数两个浏览器通用。纯属估计
   return null;
  }
  return xmlDoc;
    }
 
 function docloadURL(url){
   var xmlDoc=null;
   try{
     xmlDoc = new XMLHttpRequest();
  }
   catch(e){
    xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  }
   xmlDoc.open("GET",url,false);
   xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
   xmlDoc.send(null);
   return xmlDoc.responseXML;
    }
 
 //异步装载XML数据。
 function xmlkit(asyn){
  if(typeof asyn=="undefined")this.asyn=true;
  else this.asyn=asyn;
  this.xmlDoc=null;
  this.dealxml=null;
  this.onloadAction=function(xmldoc){
   //alert("装载完成!"+xmldoc.xml);
    if(this.dealxml!=null){
     this.dealxml.apply(null,[xmldoc]);
    }
   };
 }
 xmlkit.prototype.loadurlover=function(myxmldoc){
   this.check=function(){
    if(myxmldoc.onloadAction!=null){
     if((!myxmldoc.xmlDoc.readyState)||(myxmldoc.xmlDoc.readyState == 4)){
     myxmldoc.onloadAction(myxmldoc.xmlDoc.responseXML);
     myxmldoc=null;
    }
   }
  };
  return this.check;
 }
 xmlkit.prototype.loadurl=function(filePath,postMode,postVars){
   try{
    if(this.xmlDoc==null)
     this.xmlDoc = new XMLHttpRequest();
    this.xmlDoc.open(postMode?"POST":"GET",filePath,this.asyn);
    if(postMode)
    this.xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    this.xmlDoc.onreadystatechange=new this.loadurlover(this);
    this.xmlDoc.send(null||postVars);
  }
   catch(e){
    if(this.xmlDoc==null)
     this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
    this.xmlDoc.open(postMode?"POST":"GET",filePath,this.asyn);
    if(postMode)this.xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    this.xmlDoc.onreadystatechange= new this.loadurlover(this);
    this.xmlDoc.send(null||postVars);
  }
 } 

/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://wallimn.iteye.com  http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.gbaopan.com
时间:2006-12-15
/***********本人原创,欢迎转载,转载请保留本人信息*************/
分享到:
评论

相关推荐

    php的sql语句操作类库

    通过在服务器上解释和执行PHP代码,可以生成HTML输出,使网站实现与数据库交互、文件操作、表单处理等功能。 3. **跨平台兼容性:** PHP可以运行在多种操作系统(如Windows、Linux、Mac等)以及主流的Web服务器(如...

    企业后台管理基础框架 hsweb.zip

    通用mybatis配置文件,支持多种条件查询自动生成,支持自动生成insert,update,delete语句,支持和查询相同的各种条件.实现用户,权限管理;基于aop,注解,精确到按钮的权限控制.动态表单功能,可在前端设计表单,动态生成...

    渗透神器明小子

    所谓的SQL(结构化查询语言)注入,简单来说就是利用SQL语句在外部对SQL数据库进行查询,更新等动作。首先,数据库作为一个网站最重要的组件之一(如果这个网站有数据库的话),里面是储存着各种各样的内容,包括...

    【MR·明小子注入器】

    所谓的SQL(结构化查询语言)注入,简单来说就是利用SQL语句在外部对SQL数据库进行查询,更新等动作。首先,数据库作为一个网站最重要的组件之一(如果这个网站有数据库的话),里面是储存着各种各样的内容,包括...

    明小子Domain3.6增强纯净版

    所谓的SQL(结构化查询语言)注入,简单来说就是利用SQL语句在外部对SQL数据库进行查询,更新等动作。首先,数据库作为一个网站最重要的组件之一(如果这个网站有数据库的话),里面是储存着各种各样的内容,包括...

    DbVisualizerPro 12.0.7 x86/x64 支持Oracle SQLServer MySQL 等多数据库

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, SQLServer, Sybase, DB2, MySQL, InstantDB, Cloudcape, ...

    数据库工具DbVisualizerPro12.1.5 x86/x64 支持Oracle SQLServer MySQL等

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    Access脚本编写器 1.0.rar

    Access脚本编写器 1.0 功能: 可编写Access数据库的常用的主要对象,包括表,视图,索引,约束,包括 默认值,主键,自动编号,外键(表关系) 编写完自动保存为原数据库名 相应扩展的文件 ...Sql模式可直接生成纯Sql语句文本

    您已经学习了 ASP,下一步呢?

    您已经学习了如何动态地编辑、改变或者添加网页内容,对来自 HTML 表单提交的数据进行响应,访问数据或数据库并向浏览器返回结果,为不同的用户定制页面从而使这些页面的可用性更强。 如需了解更多关于 ASP 的信息,...

    08.在Django中使用数据库 (2).mp4

    ORM(对象关系映射):Django的ORM允许开发人员使用Python代码来操作数据库,而无需直接编写SQL查询语句。这大大简化了数据库操作的过程,并提高了开发效率。 URL映射:Django使用URL映射机制将请求的URL地址与相应...

    07.在Django中使用数据库(1).mp4

    ORM(对象关系映射):Django的ORM允许开发人员使用Python代码来操作数据库,而无需直接编写SQL查询语句。这大大简化了数据库操作的过程,并提高了开发效率。 URL映射:Django使用URL映射机制将请求的URL地址与相应...

    06.如何使用Django模板.mp4

    ORM(对象关系映射):Django的ORM允许开发人员使用Python代码来操作数据库,而无需直接编写SQL查询语句。这大大简化了数据库操作的过程,并提高了开发效率。 URL映射:Django使用URL映射机制将请求的URL地址与相应...

    NETSNS社交系统 v1.5.1 bulid 081209 源码版.rar

    您可以基于此功能,轻松编程SQL语句,实现任意数据任意调用,相关链接可根据关联条件查询。 支持动态访问和静态发布 整站程序支持全静态HTML文件生成,可将站点首页、频道首页、各栏目及每个内容页都生成静态HTML...

    基于PHP实现的网上留言管理系统的设计(源代码+论文)

    为了防止SQL注入攻击和XSS(跨站脚本攻击),你可以对留言板代码进行以下修改: 使用预处理语句执行查询:而不是直接执行查询,你应该使用预处理语句来执行查询。这样可以防止SQL注入攻击。 过滤用户输入:在查询...

    JavaWeb网上图书商城完整项目资料

    &gt; 组合查询:根据多个条件拼凑sql语句。 &gt; 带条件分页查询:条件可能会丢失。使用自定义的PageBean来传递分页数据! &gt; 页面上的分页导航:页码列表的显示不好计算! 4). 购物车模块: * 添加条目 * 修改条目...

    MiniAccess Editor v1.0 P2(Access 脚本编写器)

    约束,包括 默认值,主键,自动编号,外键(表关系)编写完自动保存为原数据库名+相应扩展的文件Asp模式可直接生成带表单输入的可执行的Asp文件,用生成的Asp文件即可生成新的数据库Sql模式可直接生成纯Sql语句文本.

    php中转义mysql语句的实现代码

    你总不可能对每一个这样的特殊字符都人工进行转义,何况你通常处理的都是表单自动提交的内容。 所以,应该使用mysql_real_escape_string函数: mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊...

    最好的asp CMS系统科讯CMSV7.0全功能SQL商业版,KesionCMS V7.0最新商业全能版-免费下载

    11、相关链接可根据关联条件查询。 12、支持频道绑定独立域名、各频道数据分表存储、自定义字段、后台按频道分级管理,帮助用户轻松建立大型站点。 13、支持频道绑定独立域名、各频道数据分表存储、自定义字段、...

    【源码】mysql 版本 spring 4.2.5 (SSM).rar

    5 SQL 编辑器, 支持复杂sql语句(写入语句,查询语句),生成报表,可以导出excel 6 websocket 真正及时通讯技术,支持好友,群组,发图片文件,离线消息,聊天记录 即时聊天、及时站内信并声音提醒、实时在线管理...

    PHP3程序设计

    6.7.6 SQL的查询语句 84 6.8 SQL Delete 语句 90 6.9 字段定义及修正 91 6.9.1 使用索引或关键字段来加快查询 91 6.9.2 使用自动增量创建键 92 6.10 总结 92 第7章 中场二:列表维护 94 7.1 列表维护的规范 94 7.2 ...

Global site tag (gtag.js) - Google Analytics