微信制作网站设计,旅游网站开发文献综述,seo优化工具推荐,合肥网页设计班在搞公司的SQL查询(MySQL)平台时#xff0c;需要对用户查询SQL进行条数限制#xff0c;默认是在配置文件中配置一个“limit 1000”这样的参数。最自然想到的就是对用户通过web传入的SQL做处理#xff0c;默认加上limit参数。这样一来就有这么几个问题需要处理#xff1a;1…在搞公司的SQL查询(MySQL)平台时需要对用户查询SQL进行条数限制默认是在配置文件中配置一个“limit 1000”这样的参数。最自然想到的就是对用户通过web传入的SQL做处理默认加上limit参数。这样一来就有这么几个问题需要处理1. 如果用户自己传入了limit 10这样的条件怎么办2. 如果用户自己传入了limit 10,2这样的条件怎么办3. 如果用户的查询比较复杂有多个子查询并带有limit怎么办4. 如果用户查询字段有limit(不加“时的SQL会报语法错误)、及表名有limit这样的关键字怎么办测试通过代码如下提供一个处理函数import jsonimport redef replace_limit(sql, limit):依次查找并处理limit offset然后把limit关键字替换为special_flag全部处理完后再把special_flag替换回limit:param sql::param limit::return:special_flag -*-*-def fun(new_sql)::return: sqlupper_sql new_sql.upper()start_index upper_sql.find( LIMIT ) len( LIMIT )end_index start_indexfor i in range(start_index, len(upper_sql)):if bool(re.match(r^[0-9]|,| , upper_sql[i])):end_index 1else:breaklimit_str upper_sql[start_index:end_index].strip()# 输入limit值大于默认limit值就进行替换成默认limit值if , in limit_str:offsets limit_str.split(,)if int(offsets[-1]) limit:limit_str {}, {}.format(offsets[0], limit)else:if int(limit_str) limit:limit_str {}.format(limit)limit_str limit_str new_sql new_sql.replace(new_sql[start_index:end_index], limit_str, 1)new_sql new_sql.replace(new_sql[start_index - len( LIMIT ):start_index], special_flag, 1)return new_sql# 原sql没有limit则在最后加上limit并returnif re.search(rlimit\s.*\d.*, sql, re.IGNORECASE) is None:sql sql.rstrip(;) limit %s % int(limit) ;return sql# 分析limit语句for i in re.findall( limit , sql, re.IGNORECASE):sql fun(sql)# 替换回limit关键字sql sql.replace(special_flag, limit )return sql12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061importjsonimportredefreplace_limit(sql,limit):依次查找并处理limitoffset然后把limit关键字替换为special_flag全部处理完后再把special_flag替换回limit:paramsql::paramlimit::return:special_flag-*-*-deffun(new_sql)::return:sqlupper_sqlnew_sql.upper()start_indexupper_sql.find( LIMIT )len( LIMIT )end_indexstart_indexforiinrange(start_index,len(upper_sql)):ifbool(re.match(r^[0-9]|,| ,upper_sql[i])):end_index1else:breaklimit_strupper_sql[start_index:end_index].strip()# 输入limit值大于默认limit值就进行替换成默认limit值if,inlimit_str:offsetslimit_str.split(,)ifint(offsets[-1])limit:limit_str{}, {}.format(offsets[0],limit)else:ifint(limit_str)limit:limit_str{}.format(limit)limit_str limit_str new_sqlnew_sql.replace(new_sql[start_index:end_index],limit_str,1)new_sqlnew_sql.replace(new_sql[start_index-len( LIMIT ):start_index],special_flag,1)returnnew_sql# 原sql没有limit则在最后加上limit并returnifre.search(rlimit\s.*\d.*,sql,re.IGNORECASE)isNone:sqlsql.rstrip(;) limit %s%int(limit);returnsql# 分析limit语句foriinre.findall( limit ,sql,re.IGNORECASE):sqlfun(sql)# 替换回limit关键字sqlsql.replace(special_flag, limit )returnsql这个函数接收两个参数SQL语句和默认limit限制值在平台中是SQL是从前端获取来的limit值是从配置文件获取来的。大概逻辑如下1. 如果字段中有limit或limittest关键字就不需要处理。2. 如果用户输入没有limit限制就加上默认limit限制然后直接返回sql。3. 如果用户输入有limit限制就进行判断用户输入值是否大于默认值如果大于就替换成默认值否则不改动。4. 最后把替换过的关键字再替换回来。在这里测试就可以直接调用函数即可如下sql select limitest as limit from test limit 10, 100;print(replace_limit(sql, 20))12sqlselect limitest as limit from test limit 10, 100;print(replace_limit(sql,20))结果如下select limitest as limit from test limit 10, 20;1selectlimitestaslimitfromtestlimit10,20;可以看到结果满足我们的需求由于用户输入值大于默认值就替换成了默认limit值。如果您觉得本站对你有帮助那么可以支付宝扫码捐助以帮助本站更好地发展在此谢过。