(记录)mysql分页查询,参数化过程的坑

  在最近的工作中,由于历史遗留,一个分页查询没有参数化,被查出来有sql注入危险,所以对这个查询进行了参数化修改。

  一看不知道,看了吓一跳,可能由于种种原因,分页查询sql是在存储过程中拼接出来的,where之后的条件也是在代码中先进行拼接,然后作为整体参数在传入存储过程里,在存入过程里又进行一次拼接。这样的话就有sql注入的潜在危险,尽管在拼接where之前进行的查询条件的验证。

  大家都明白,参数化是防止sql注入的有效方法,然后就对这个分页查询进行大刀阔斧的改革。

  思路一:1、对原先的代码中拼接的where条件,不进行直接的赋值拼接。而是拼接成带@符号的参数。并且给参数赋值;例如:

      2、给存储过程添加参数

      3、用SetParameters(paras.ToArray())方法直接把参数paras传给存储过程

  结论:根本走不通,因为我们的查询条件是动态拼接的,没办法动态给存储过程定义传入参数,这个思路直接给pass掉了;

  小结:虽然这个方法走不通,但是在这个思路的第一步,是我们可以继续用的,这个是没有问题的。既然没有办法动态定义存储过程参数,我们就不能再存储过程中拼接分页sql,只能把分页sql的select和table、order都放到代码程序中进行拼接,那么我们的思路二就来了。

  思路二:1、接着我们思路一第一步之后的往下走

      2、代码中拼接分页查询sql;看代码如下:

  结论:还是走不通啊啊啊啊啊啊!从错误日志中查看(@pageNum - 1) * @pageSize,@pageSize这些值都已经传入了,但是就是报错;内容如下:Message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘(1-1)*20, 20‘ at line 12.

最后发现limit(,) 函数参数内不能进行计算,只能传入值,并且是int类型。

  小结:我们就把(@pageNum - 1) * @pageSize的计算放到了代码中。最后代码如下:

  这样我已经成功了一半,为什么说成功了一半呢?因为有些查询条件出现了问题,像模糊查询,怎么都查不出来数据,即时你输入的查询条件是可用的。费了九牛二虎之力找到了问题所在,我们的模糊查询尽管改成了参数化,但是我们把@XXX参数没替换成他对应的值,因为@XXX变成了一个字符串了代码如下:

这个问题我们用mysql的CONCAT()函数进行处理,改之后代码如下:

  这样我们就大功告成了。虽然性能上差了很多,但是这个主要是对参数化进行的更改,其中limit(,) 和CONCAT() 函数的使用比较重要。

  再有就是本人也是初次接触mysql,许多东西还需要学习。再有就是在给大家提个醒,关于IN() 函数的使用,如果有多个值1,2,3参数化类型会是string,替换值的时候会给‘1,2,3‘ 带上单引号,自然也就找不到你需要的数据了,所以还是用or 慢慢去拼接吧。

  郑重声明:本博客,只是为了参数化,性能方面没有过多的考虑。如有错误之处请大家海涵,望多多给予指点。

原文地址:https://www.cnblogs.com/sqlservertongbu/p/11013490.html

时间: 2024-11-10 12:35:56

(记录)mysql分页查询,参数化过程的坑的相关文章

MySql分页查询慢|这里告诉你答案

一.背景 我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量:select * from table where column=xxx order by xxx limit 1,20.当数据量比较小时(100万以内),无论你翻到哪一页,性能都是很快的.如果查询慢,只要在where条件和order by 的列上加上索引就可以解决.但是,当数据量大的时候(小编遇到的情况是500万数据),如果翻到最后几页,即使加了索引,查询也是非常慢的,这是什么原因导致的呢?我们该如

sql server 与 mysql 分页查询以及创建临时表的区别

一: 分页查询的时候 sql server使用的是top关键字,而mysql 使用的是limit e.g: 查询第五个到第十个入职的职员 sql server2000: select top 6 * from emp where empno not in (select top 4 empno from emp order by hiredate) order by hiredate; mysql: select * from emp order by hire date limit 4,6;

mysql分页查询语法

一.limit语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须是一个整数常量.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目. 初始记录行的偏移量是 0(而不是 1); mysql> SELECT * FROM table LIMIT 5,10; // 检索记

MySQL分页查询性能优化

当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点.下面简单说一下我知道的一些方法. 准备工作 为了对下面列举的一些优化进行测试,下面针对已有的一张表进行说明. 表名:order_history 描述:某个业务的订单历史表 主要字段:unsigned int id,tinyint(4) int type 字段情况:该表一共37个字段,不包含text等大型数组,最大为varcha

Mysql慢查询日志过程

原创地址 :http://itlab.idcquan.com/linux/MYSQL/922126.html mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出代码实现中耗费资源的sql语句,对我们程序的优化有很高的参考.本篇主要将慢查询日志的开启,日志分析,这也是优化SQL程序的一般步骤中至关重要的一步. 1.mysql慢查询日志 打开mysql的慢查询日志很简单,只需要在mysql的配置文件里(windows系统是my.ini,linux系统是my.cnf)的[mysqld]下面加

mysql 分页查询 limit

每次都会忘掉limit,记录下来. 分页查询(limit 起始行,查询几行) -- 起始行从0开始 -- 分页:当前页  每页显示多少条 -- 分页查询当前页的数据的sql: SELECT * FROM student LIMIT (当前页-1)*每页显示多少条,每页显示多少条; -- 需求: 查询第1,2条记录(第1页的数据) SELECT * FROM student LIMIT 0,2; -- 查询第3,4条记录(第2页的数据) SELECT * FROM student LIMIT 2,

Oracle查询前10条记录及分页查询(第5条到第10记录)

如果你想了解Oracle查询前10条记录的相关实际应用方案的话,你就可以点击以下的文章对其在实际相关操作中的正确用法,有一个更加完善的认识,希望你在浏览完以下的文章会以下就是正文的详细内容的介绍. 在Oracle怎样查询表中的top10条记录呢? select *   from test   where rownum <=10   下面是关于rownum的介绍 Rownum和row_number() over()的使用 ROWNUM是Oracle从8开始提供的一个伪列,是把SQL出来的结果进行编

mysql分页原理和高效率的mysql分页查询语句

该博来自网络转载!!!供自己学习使用!!! 以前我在mysql中分页都是用的 limit 100000,20这样的方式,我相信你也是吧,但是要提高效率,让分页的代码效率更高一些,更快一些,那我们又该怎么做呢? 第一部分:看一下分页的基本原理: 代码如下: mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20***************** 1. row **************id: 1select_typ

六、mysql分页查询

参考url:https://www.bilibili.com/video/BV12b411K7Zu?p=132 应用场景:当要显示的数据,一页显示不全,需要分页提交SQL请求 语法: SELECT 查询列表 FROM 表1 [join type join 表2 ON 连接条件 WHERE 筛选条件 GROUP BY 分组字段 HAVING 分组后的筛选 ORDER BY 排序的字段] LIMIT offset,size; Offset要显示条目的起始索引(起始索引从0开始) Size要显示的条目