安全化mysql的where条件输入拼接面板:用于给不会mysql语法的操作人使用

1 篇文章 0 订阅

因为需要edm中可以从discuz会员库中导入.而操作人却不是技术人员,所以开发了此面板.可以满足需求;且安全简单;



需要二个文件,后台处理部分代码

/* 生成关系大概如下
[//input:where; $_POST['where']
    [//行1 input:where[0]; $_POST['where'][0]
		'' //行级连接 input:where[0][r4r]; $_POST['where'][0]['r4r']
		,[ //行级条件段 input:where[0][rWhere]; $_POST['where'][0]['rWhere']
			[//列1 input:where[0][rWhere][0]; $_POST['where'][0]['rWhere'][0]
				''//列级连接 input:where[0][rWhere][0][c4c]; $_POST['where'][0]['rWhere'][0]['c4c']
				,'field'//字段 input:where[0][rWhere][0][field]; $_POST['where'][0]['rWhere'][0]['field']
				,'=' //字段连接,可省 input:where[0][rWhere][0][f4v]; $_POST['where'][0]['rWhere'][0]['f4v']
				,'value'//字段值,可省 input:where[0][rWhere][0][value]; $_POST['where'][0]['rWhere'][0]['value']
			]
			,[//列2 input:where[0][rWhere][1]; $_POST['where'][0]['rWhere'][1]
				''//列级连接 input:where[0][rWhere][1][c4c]; $_POST['where'][0]['rWhere'][1]['c4c']
				,'field'//字段 input:where[0][rWhere][1][field]; $_POST['where'][0]['rWhere'][1]['field']
				,'=' //字段连接,可省 input:where[0][rWhere][1][f4v]; $_POST['where'][0]['rWhere'][1]['f4v']
				,'value'//字段值,可省 input:where[0][rWhere][1][value]; $_POST['where'][0]['rWhere'][1]['value']
			]
		]
    ]
    ,[//行2 input:where[1]; $_POST['where'][1]
		'and' //行级连接 input:where[1][r4r]; $_POST['where'][1]['r4r']
		,[ //行级条件段 input:where[1][rWhere]; $_POST['where'][1]['rWhere']
			[//列1 input:where[1][rWhere][0]; $_POST['where'][1]['rWhere'][0]
				''//列级连接 input:where[1][rWhere][0][c4c]; $_POST['where'][1]['rWhere'][0]['c4c']
				,'field'//字段 input:where[1][rWhere][0][field]; $_POST['where'][1]['rWhere'][0]['field']
				,'=' //字段连接,可省 input:where[1][rWhere][0][f4v]; $_POST['where'][1]['rWhere'][0]['f4v']
				,'value'//字段值,可省 input:where[1][rWhere][0][value]; $_POST['where'][1]['rWhere'][0]['value']
			]
			,[//列2 input:where[1][rWhere][1]; $_POST['where'][1]['rWhere'][1]
				''//列级连接 input:where[1][rWhere][1][c4c]; $_POST['where'][1]['rWhere'][1]['c4c']
				,'field'//字段 input:where[1][rWhere][1][field]; $_POST['where'][1]['rWhere'][1]['field']
				,'=' //字段连接,可省 input:where[1][rWhere][1][f4v]; $_POST['where'][1]['rWhere'][1]['f4v']
				,'value'//字段值,可省 input:where[1][rWhere][1][value]; $_POST['where'][1]['rWhere'][1]['value']
			]
		]
    ]
]

*/
    private $fieldOperator = array(//字段比较符允许值
        '='=>array( 'title' => '等于', 'tip' => '此条件与筛选值必须完全相同,包括空格换行之类任意输入', 'chk' => '' )
        , '>'=>array( 'title' => '大于', 'tip' => '只能用于数字比较,输入会被强制转成数字' , 'chk' => '' )
        , '>='=>array( 'title' => '大于或等于', 'tip' => '输入会被强制转成数字' , 'chk' => '' )
        , '<'=>array( 'title' => '小于', 'tip' => '输入会被强制转成数字' , 'chk' => '' )
        , '<='=>array( 'title' => '小于或等于', 'tip' => '输入会被强制转成数字' , 'chk' => '' )
        , '!='=>array( 'title' => '不等', 'tip' => '此条件与筛选值只要有任何不相同,包括空格换行之类任意输入' , 'chk' => '' )
        , 'LIKE'=>array( 'title' => '含有', 'tip' => '用于关键字查找,注意别换行输入' , 'chk' => '' )
        , 'NOT LIKE'=>array( 'title' => '不含有', 'tip' => '用于关键字查找,注意别换行输入' , 'chk' => '' )
        , 'IN'=>array( 'title' => '在...集合里面', 'tip' => '一行表示集合一个对象' , 'chk' => '' )
        , 'NOT IN'=>array( 'title' => '不在...集合里面', 'tip' => '一行表示集合一个对象' , 'chk' => '' )
        , 'BETWEEN'=>array( 'title' => '在..二者之间', 'tip' => '需要输入二行,第一行用于开始值,第二行用于终止值,只允许数字,其它行忽略' , 'chk' => '' )
        , 'NOT BETWEEN'=>array( 'title' => '不在..二者之间', 'tip' => '需要输入二行,第一行用于开始值,第二行用于终止值,只允许数字,其它行忽略' , 'chk' => '' )
        , 'IS NULL'=>array( 'title' => '留空', 'tip' => '不需要输入,意义表示没有输入任何东西' , 'chk' => '' )
        , 'IS NOT NULL'=>array( 'title' => '不是空的', 'tip' => '不需要输入' , 'chk' => '' )
    );
    private $fieldName = array(//字段中文名对应的表名
            'p.resideprovince'=>array( 'title' => '居住省份', 'tip' => '看论坛个人资料可用项', 'chk' => '' )
            ,'p.residecity'=>array( 'title' => '居住城市', 'tip' => '看论坛个人资料可用项', 'chk' => '' )
            ,'p.occupation'=>array( 'title' => '部门', 'tip' => '看论坛个人资料可用项', 'chk' => '' )
            ,'p.field4'=>array( 'title' => '行业', 'tip' => '看论坛个人资料可用项', 'chk' => '' )
            ,'p.field6'=>array( 'title' => 'edm订阅', 'tip' => '看论坛个人资料中[关注领域]对应的文字,如(政经人文)', 'chk' => '' )
            ,'p.company'=>array( 'title' => '公司名', 'tip' => '看论坛个人资料中[所在单位]输入的内容', 'chk' => '' )
            ,'p.position'=>array( 'title' => '职位', 'tip' => '看论坛个人资料可用项', 'chk' => '' )
            ,'p.gender'=>array( 'title' => '性别', 'tip' => '输入男或女', 'chk' => '' )
            ,'u.uid'=>array( 'title' => '会员ID值', 'tip' => '使用本条件前请全部禁用其它条件,否则将会出错;指定会员UID(一般条件选择 在 ... 之间 然后配合 第一行指定起始UID,第二行指定截止UID,注意查询时将包含起始与截止UID如 1/3做为起始/截止UID,意思就是查询UID等于1,2,3的会员),请在会员类型中选中全部会员', 'chk' => '' )
            ,'u.regdate'=>array( 'title' => '会员注册时间', 'tip' => '注册时间,格式必须是类2013/12/31 01:01:59', 'chk' => 'strtotime')
        );
    private $logicOperator = array(//逻辑连接符
        'OR'=>array( 'title' => '或者是', 'tip' => '选择时,筛选对象只需要符合并行条件的其中一行即可' , 'chk' => '' )
        ,'AND'=>array( 'title' => '同时要', 'tip' => '选择时,筛选对象必须符合并行条件的全部行' , 'chk' => '' )
    );




	/* 主站导入 */
    public function emailMember() {
		$this->benchmark->mark('code_start');
        $gid = (int)$this->input->get('groupId');
		$etab = 'email_'.$this->userId .'_'.$gid;
		
        if (!$this->db->table_exists($etab)) {
			$this->siteImportSMRe($gid.'号分组已经不存在');
			return;
		}
		
		$etab = 'e.' .$etab;
		
        $limit = (int)$this->input->get('limit');
        
        if ($limit < 1) {
			$this->siteImportSMRe( '导入条数(终值)不能小于1');
			return;
		}
		
        $offset = (int)$this->input->get('offset');
        $tab = ' FROM chrddb.dx_ucenter_members AS u ';
        $memberType = (int)$this->input->get('memberType');
        
        if (0 == $memberType) {//只使用uc表
			$whereSql = $this->whereConcatRow('u');
        } else {
            $profile = 'chrddb.dx_common_member_profile'. ($memberType == 2 ? '_archive' : '');
            $tab .= " LEFT JOIN {$profile} AS p ON p.uid=u.uid ";
            $whereSql = $this->whereConcatRow('u', 'p');
        }
        
        !empty($whereSql) && ($whereSql = ' WHERE ' .$whereSql);
        $rowCount = (int)$this->db->query(" SELECT COUNT(*) AS c {$tab} {$whereSql} ")->row()->c;        
        $sql = " INSERT ignore INTO {$etab} (email, member_id) 
			SELECT u.email, u.uid {$tab}
			{$whereSql}
			 LIMIT {$offset}, {$limit}" ;
		$this->db->query($sql);
		$insert = $this->db->affected_rows();		
		$this->benchmark->mark('code_end');
        $this->siteImportSMRe( "处理结束:总符合数据有{$rowCount}条;总耗时:" .$this->benchmark->elapsed_time('code_start', 'code_end')."秒;插入{$insert}条[已存在的不计算在内];拼接条件:{$whereSql};");
    }
	
	private function siteImportSMRe($tip) {
		echo '<script>top.siteImportSMRe('.json_encode($tip).');</script>';
	}
	/*
	 * 拼接行条件
	 */
	private function whereConcatRow() {
        $where = $this->input->get('where');
        if (empty($where) || ! is_array($where)) return '';        
        $sql = '';
        $filter = func_get_args();

        foreach ($where as $key => $row) {
			$r4r = trim($row['r4r']);
			if (empty($r4r) && (0 != $key) ) continue;//只有首行,才允许行连接空
			if ($r4r && !array_key_exists($r4r, $this->logicOperator)) continue;//它行不允许连接
			$rWhere = $row['rWhere'];
			if (empty($rWhere) || ! is_array($rWhere)) continue;
            $colsSql = $this->whereConcatCol($rWhere, $filter);//得到列sql            
            if (false === $colsSql) continue;//列中全禁用,本行无效
            $sql .= " {$r4r} ({$colsSql}) ";
        }
        
        return $sql;
	}
	
	/*
	 * 拼接列条件
	 */
	private function whereConcatCol($cols, $filter) {
        $sql = '';
        
        foreach($cols as $key => $col) {
			$c4c = trim($col['c4c']);
			if (empty($c4c) && (0 != $key) ) continue;//只有首行,才允许行连接空
			if ($c4c && !array_key_exists($c4c, $this->logicOperator)) continue;//它行不允许连接
			$field = trim($col['field']);
			$f4v = trim($col['f4v']);
			$value = $col['value'];
			$fieldAs = explode('.', $field);
			$fieldAs = $fieldAs[0];
			if (!in_array($fieldAs, $filter)) continue;//as 值不允许,无此表
            $fieldSql = $this->whereConcatField($field, $f4v, $value);            
            if (false === $fieldSql) continue;
            $sql .= " {$c4c} {$fieldSql} ";
        }
              
        return $sql;
	}
	
	/*
	 * 拼接字段条件
	 */
	private function whereConcatField($field, $operator, $val) {        
        if (empty($field) || empty($operator) ) return false;        
        if (! array_key_exists($field, $this->fieldName) || ! array_key_exists($operator, $this->fieldOperator)) return false;
        $chk = $this->fieldName[$field]['ck'];        
		if (!empty($chk)) eval('$val = '.$chk.'($val);');//值处理
		if (false === $val) return false;//返回 false表示值不适用
		
        switch($operator) {//根据字段比较符拼接,escape自动增加'';
            case '>':
            case '>=':
            case '<':
            case '<=':
            case '!=':
				$val = trim($val);
				if (empty($val) || !empty(preg_replace("/[0-9a-z]/i", '', $val))) return false;//不允许使用非字母/数字比较,无意义
            case '=':
                $sql = " {$field} {$operator} " .$this->db->escape($val);//自动加'',且按类型转义
                break;
            case 'LIKE':
            case 'NOT LIKE':
				if (empty($val)) return false;//like 无意义
                $sql = " {$field} {$operator} '%" .$this->db->escape_like_str($val). "%'";//过滤%_号
                break;
            case 'BETWEEN':
            case 'NOT BETWEEN':
                if (empty($val)) return false;//不允许空值                
                $val = preg_split("/[\n\r]+/", $val);//按行分割成集合中子值
                if (empty($val[0]) || empty($val[1])) return false;
                if (!empty(preg_replace("/[0-9a-z]/i", '', $val[0])) || !empty(preg_replace("/[0-9a-z]/i", '', $val[1])) ) return false;
                $val[0] = $this->db->escape($val[0]);
                $val[1] = $this->db->escape($val[1]);
                $sql = " {$field} {$operator} {$val[0]} AND {$val[1]} ";
                break;
            case 'IN':
            case 'NOT IN':
                if (empty($val)) return false;//不允许空值                
                $val = preg_split("/[\n\r]+/", $val);//按行分割成集合中子值
                
                if (count($val) == 1) {
					$operator = 'IN' == $operator ? ' = ' : ' <> ';
					$sql = " {$field} = " .$this->db->escape($val[0]) ." ";
					break;
                }
                
                foreach ($val as & $v) $v = $this->db->escape($v);
                $val = implode(',', $val);
                $sql = " {$field} {$operator} ({$val}) ";
                break;
            case 'IS NULL':
            case 'IS NOT NULL':
                $sql = " {$field} {$operator} ";
                break;
        }
        
        return $sql;
	}
	/* 主站导入 */


前台部分

<form οnsubmit="siteImportSM();return false;" target="uploadHideWin" action="index.php" id="siteImportSMForm">
<input type="hidden" value="email" name="c" />
<input type="hidden" value="emailMember" name="m" />
<input type="hidden" value="<?php echo $groupId;?>" name="groupId" />
<strong>主站导入会员email方式</strong><span class="red">此功能将会影响系统性能,请使用系统无发送任务时操作</span><br />

<select id="memberType" name="memberType" title="论坛会员已经被分成二个会员群体,不活跃的是不经常登录的会员,需要在导入时选择群体">
	<option value="1">常登录会员库</option>
	<option value="2">极少登录会员库</option>
	<option value="0" selected="selected" >无条件全站会员库</option>
</select>

<div id="whereBar"></div>
<a href="javascript:;" οnclick="addWhere();" title="增加一组条件">添加</a>
/ 
<a href="javascript:;" οnclick="removeWhere();" title="移除尾组条件">移除</a> [不明作用:把鼠标移动到对应的操作项目上即可得到提示信息]
<br />
本轮导入首条是从符合数据的第<input value="0" name="offset" id="siteOffset" class="imed" title="可以接着上轮导入进度继续"/>条开始
,读取到终条<input value="100000" name="limit" id="siteLimit"  class="imed" title="如果发现读取时间过长,请设置每轮的条数,控制每轮耗时"/>条数据(即符合的实际数据集从首条位置开始,到第'终条'这部分的数据)
<input type="submit" value="开始转移式导入"/>
<div class="red" id="siteImportSMTip"></div>
</form>


<script>

/*============主站导入js==========*/


function siteImportSM() {
	if (isNaN($('#siteOffset').val())) {
		$('#siteOffset').val(0);
		$('#siteImportSMTip').html('首条数字非法');
		return ;
	}
	
	if (isNaN($('#siteLimit').val())) {
		$('#siteLimit').val(100000);
		$('#siteImportSMTip').html('终条数字非法');
		return ;
	}
	
	var tip = checkWhere();
	if (false === tip) return false;
    $('#siteImportSMTip').html('经过检查你可以继续提交,确认继续,请点击 <a href="javascript:;" οnclick="keepSm();">确认</a>' + tip);
    return false;
}

function checkWhere() {
	var checkObj = $('#whereBar select.fieldOperator');
	if (!checkObj || !checkObj.length) return '';
    var tip = [];
	
	for (var i = 0; i < checkObj.length; i++) {
		var obj = checkObj[i];
		var chBd = function (color) {
			$(obj).next().css('border', '1px solid ' + color);
		}
		chBd('black');

		if ('' == $(obj).next().val()) {
			var e;
			switch($(obj).val()) {
				case 'LIKE':
					e = '将匹配全部记录';
					break;
				case 'NOT LIKE':
					e = '将导致没有任何记录符合';
					break;
				case 'IN':
					e = '空集合没有记录符合';
					break;
				case 'NOT IN':
					e = '非空集合任何记录都符合,无意义';
					break;
				case 'BETWEEN':
					e = '无意义';
					break;
				case 'NOT BETWEEN':
					e = '无意义';
					break;
			}
			
			if (e) {
				chBd('red');
				 $('#siteImportSMTip').html('第一个红边框的输入框无输入,导致' +e);
				 return false;
			}
		}
		
		if (!/[\r\n]+/g.test($(obj).next().val()) ) {//非双行
			var e;
			switch($(obj).val()) {
				case 'BETWEEN':
					e = '无意义';
					break;
				case 'NOT BETWEEN':
				e = '无意义';
				break;
			}
		
			if (e) {
				chBd('red');
				 $('#siteImportSMTip').html('第一个红边框的输入框不足二行,导致' +e);
				 return false;
			}
		}
		
		if (!/^(\s*\w+)+\s*$/g.test($(obj).next().val()) ) {//非数字字母
			if ( ($(obj).val().indexOf('BETWEEN') > -1) || ($(obj).val().indexOf('>') > -1) || ($(obj).val().indexOf('<') > -1) ) {
				chBd('yellow');
				 tip[tip.length] = '大小/二者间区条件,黄边框的输入框输入非数字或字母值,无意义';
			}
		}
		
		if ('' == $(obj).next().val()) {//非空
			if ($(obj).val().indexOf('NULL') > -1) {
				chBd('green');
				 tip[tip.length] = '蓝边框的输入框值并不会使用,因为它不需要输入值';
			}
		}
    }   

    return  tip.length ? '<br/><span class="red">提示需要注意可能存在以下问题,如果不在意可以不理会<br/>' + tip.join('<br/>') + '</span>' : '';
}

function keepSm() {
	$('#siteImportSMTip').html( '导入进行中...如需要中止,请刷新页面..或等待完成提示.');
	$('#siteImportSMForm')[0].submit();//注意jq的方法还是会触发onsubmit
}

function siteImportSMRe(tip) {
	$('#siteImportSMTip').html(tip);
}

function addWhere() {
/* 生成关系大概如下
[//input:where; $_POST['where']
    [//行1 input:where[0]; $_POST['where'][0]
		'' //行级连接 input:where[0][r4r]; $_POST['where'][0]['r4r']
		,[ //行级条件段 input:where[0][rWhere]; $_POST['where'][0]['rWhere']
			[//列1 input:where[0][rWhere][0]; $_POST['where'][0]['rWhere'][0]
				''//列级连接 input:where[0][rWhere][0][c4c]; $_POST['where'][0]['rWhere'][0]['c4c']
				,'field'//字段 input:where[0][rWhere][0][field]; $_POST['where'][0]['rWhere'][0]['field']
				,'=' //字段连接,可省 input:where[0][rWhere][0][f4v]; $_POST['where'][0]['rWhere'][0]['f4v']
				,'value'//字段值,可省 input:where[0][rWhere][0][value]; $_POST['where'][0]['rWhere'][0]['value']
			]
			,[//列2 input:where[0][rWhere][1]; $_POST['where'][0]['rWhere'][1]
				''//列级连接 input:where[0][rWhere][1][c4c]; $_POST['where'][0]['rWhere'][1]['c4c']
				,'field'//字段 input:where[0][rWhere][1][field]; $_POST['where'][0]['rWhere'][1]['field']
				,'=' //字段连接,可省 input:where[0][rWhere][1][f4v]; $_POST['where'][0]['rWhere'][1]['f4v']
				,'value'//字段值,可省 input:where[0][rWhere][1][value]; $_POST['where'][0]['rWhere'][1]['value']
			]
		]
    ]
    ,[//行2 input:where[1]; $_POST['where'][1]
		'and' //行级连接 input:where[1][r4r]; $_POST['where'][1]['r4r']
		,[ //行级条件段 input:where[1][rWhere]; $_POST['where'][1]['rWhere']
			[//列1 input:where[1][rWhere][0]; $_POST['where'][1]['rWhere'][0]
				''//列级连接 input:where[1][rWhere][0][c4c]; $_POST['where'][1]['rWhere'][0]['c4c']
				,'field'//字段 input:where[1][rWhere][0][field]; $_POST['where'][1]['rWhere'][0]['field']
				,'=' //字段连接,可省 input:where[1][rWhere][0][f4v]; $_POST['where'][1]['rWhere'][0]['f4v']
				,'value'//字段值,可省 input:where[1][rWhere][0][value]; $_POST['where'][1]['rWhere'][0]['value']
			]
			,[//列2 input:where[1][rWhere][1]; $_POST['where'][1]['rWhere'][1]
				''//列级连接 input:where[1][rWhere][1][c4c]; $_POST['where'][1]['rWhere'][1]['c4c']
				,'field'//字段 input:where[1][rWhere][1][field]; $_POST['where'][1]['rWhere'][1]['field']
				,'=' //字段连接,可省 input:where[1][rWhere][1][f4v]; $_POST['where'][1]['rWhere'][1]['f4v']
				,'value'//字段值,可省 input:where[1][rWhere][1][value]; $_POST['where'][1]['rWhere'][1]['value']
			]
		]
    ]
]

*/
    var rowLen = $('#whereBar div').length;    
    var namePre = 'where[' + rowLen + ']';

	<?php
	echo 'var fieldName = ' .json_encode($fieldName). ";\n";
	echo 'var fieldOperator = ' .json_encode($fieldOperator). ";\n";
	echo 'var logicOperator = ' .json_encode($logicOperator). ";\n";
	?>
   
	var logicOperatorRSel = function () {//行级连接
		var name = namePre + '[r4r]';
		if (rowLen < 1) return '<input type="hidden" value="" name="' +name+ '" />';
		var sel = '<select name="' +name+ '" title="选择行级间条件关系">';
		$.each(logicOperator, function(key, val){
			sel += '<option value="' +key+ '" title="' +this.tip+ '">' +this.title+ '</option>';
		});
		sel += '</select>';
		return sel;
	}
	
	var fieldRow = function () {//列级
		var name = namePre + '[rWhere][' +colLen+ ']';
	
		var logicOperatorCSel = function () {//列级连接
			if (colLen < 1) return '<input type="hidden" value="" name="' +name+ '[c4c]" />';
			var sel = '<select name="' +name+ '[c4c]" title="选择列级间条件关系">';
			$.each(logicOperator, function(key, val){
				sel += '<option value="' +key+ '" title="' +this.tip+ '">' +this.title+ '</option>';
			});
			sel += '</select>';
			return sel;
		}
   
		var fieldOperatorSel = function () {//字段连接
			var sel = '<select name="' +name+ '[f4v]" class="fieldOperator" title="查询对象与值连接符,把鼠标移动到下面的列表查看输入要求">';
			$.each(fieldOperator, function(key, val){
				sel += '<option value="' +key+ '" title="' +val.tip+ '">' +val.title+ '</option>';
			});
			sel += '</select>';
			return sel;
		}
	   
		var fieldNameSel = function () {
			var sel = '<select name="' +name+ '[field]" title="查询对象,把鼠标移动到下面的列表查看输入要求">';
			$.each(fieldName, function(key,val) {
				sel += '<option value="' +key+ '" title="' +val.tip+ '">' +val.title+ '</option>';
			});
			sel += '</select>';
			return sel;
		}
		return logicOperatorCSel() + fieldNameSel() + fieldOperatorSel() + ' <textarea name="' + name+'[value]" wrap="off" title="注意配合连接条件使用:对于集合类条件,每一行代表一个集合中个体;对于在...之间这种,需要二行,首行为开始值,二行为结束值;对于只需要单值的条件,整个框中内容看做一个值;对于需要多行的值,从首行取起达到行数即停止,后面多余的行忽略;关于这个信息把鼠标放到连接符中即可得到提示信息;不同的查询对象,需要输入值不同,把鼠标放到对应的列表项目上即可得到提示"></textarea> ';;
	}
    
    var colLen = 0;
    $('#whereBar').append('<div class="rowBox">' + logicOperatorRSel() + '<strong> ( </strong>' +fieldRow()+ '<span id="row' +rowLen+ 'Col"></span><a href="javascript:;" id="colAdd' +rowLen+ '">添加</a>|<a href="javascript:;" id="colDel' +rowLen+ '">移除</a><strong>)</strong>'+ '</div>');
    $('#colAdd' +rowLen).click(function(){
		colLen = $('#row' +rowLen+ 'Col span').length + 1;
		$('#row' +rowLen+ 'Col').append('<span>' + fieldRow()+ '</span>');
    });
    $('#colDel' +rowLen).click(function(){
		$('#row' +rowLen+ 'Col span:last-child').remove();
    });
}

function removeWhere() {
    $('#whereBar div:last-child').remove();
}

/*============主站导入js==========*/
//防止刷新出现问题
document.write('<iframe style="height:1px;width:1px;visibility:hidden;" src="about:blank" name="uploadHideWin"></iframe>');
</script>


大概逻辑是:

where (行级) 行级连接 (行级)


(行级) = >  ( 字段 连接符 值   字段间(列级)连接 ... )


在处理时也是先行,列,字段化处理,就简单了.

对于GET时的数组结构看代码提示;

如果需要还可以增加字段的区别化值检验,但是认为没太多必要.这个可以分级在前后台加载对应的方法即可.

做到添加筛选条件只需要增加配置参数即可,代码不需要修改太多.

当然这些是有使用前提.并不是可以任何的拼接出所有的sql;

这样,可以让任何人操作,无需要技术干预.

这是这个功能的用处.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值