`

mysql limit后的变量问题,sql语句的prepare

阅读更多

从MySQL 5.0 开始,
支持了一个全新的SQL句法:

PREPARE stmt_name FROM preparable_stmt ;

EXECUTE stmt_name [USING @var_name [, @var_name ] ...];

{DEALLOCATE | DROP} PREPARE stmt_name ;

 

通过它,我们就可以实现类似 MS SQL 的 sp_executesql 执行动态SQL语句!
同时也可以防止注入式攻击!

为 了有一个感性的认识,
下面先给几个小例子:

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';


mysql> SET @a = 3;


mysql> SET @b = 4;


mysql> EXECUTE stmt1 USING @a, @b;


+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;


mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';


mysql> PREPARE stmt2 FROM @s;


mysql> SET @a = 6;


mysql> SET @b = 8;


mysql> EXECUTE stmt2 USING @a, @b;


+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;



 
如果你的MySQL 版本是 5.0.7 或者更高的,你还可以在 LIMIT 子句中使用它,
示例如下:




mysql> SET @a=1;

mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;

 

 

mysql> SET @skip=1; SET @numrows=5;


mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";


mysql> EXECUTE STMT USING @skip, @numrows;

 
使用 PREPARE 的几个注意点:

A:
 PREPARE stmt_name

 FROM preparable_stmt

;
 预定义一个语句,并将它赋给 stmt_name stmt_name 
是不区分大小写的。
B:
 即使 preparable_stmt
 语句中的 ? 所代表的是一个字符串,你也不需要将 ? 用引号包含起来。
C:
 如果新的 PREPARE 语句使用了一个已存在的 stmt_name
 ,那么原有的将被立即释放!
 即使这个新的 PREPARE 语句因为错误而不能被正确执行。
D:
 PREPARE stmt_name
 的作用域是当前客户端连接会话可见。
E:
 要释放一个预定义语句的资源,可以使用 DEALLOCATE PREPARE 句法。
F:
 EXECUTE stmt_name

 句法中,如果 stmt_name
 不存在,将会引发一个错误。 
G:
 如果在终止客户端连接会话时,没有显式地调用 DEALLOCATE PREPARE 句法释放资源,服务器端会自己动释放它。
H:
 在预定义语句中,CREATE TABLE, DELETE
, DO
, INSERT
, REPLACE
, SELECT
, SET
, UPDATE
, 和大部分的 SHOW
 句法被支持。
G:
 PREPARE 语句不可以用于存储过程,自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数中使用! 
 
 
下面给个示例:
 
CREATE PROCEDURE `p1`(
IN id INT UNSIGNED,
IN name VARCHAR(11)
)
BEGIN
  lable_exit: BEGIN
    SET @SqlCmd = 'SELECT * FROM tA ';
    IF id IS NOT NULL THEN
         SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE id=?');
         PREPARE stmt FROM @SqlCmd;
         SET @a = id;
         EXECUTE stmt USING @a;
         LEAVE lable_exit;
    END IF;
    IF name IS NOT NULL THEN
         SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE name LIKE ?');
         PREPARE stmt FROM @SqlCmd;
         SET @a = CONCAT(name, '%');
         EXECUTE stmt USING @a;
         LEAVE lable_exit;    
    END IF;
  END lable_exit;
END;
 
CALL `p1`(1,NULL);
CALL `p1`(NULL,'QQ');
DROP PROCEDURE `p1`;
分享到:
评论

相关推荐

    mysql存储过程实现分页

    ### MySQL存储过程实现分页 #### 背景与需求 在数据库操作中,分页是一种常见...同时,通过预编译的方式执行SQL语句,可以有效避免SQL注入等安全问题。总之,利用MySQL存储过程实现分页是一个非常实用且高效的方法。

    MySql存贮过程有关MySQL存贮过程的文档

    - 构建实际查询数据的SQL语句:`SELECT <字段列表> FROM <表名> WHERE <条件> ORDER BY <排序方式> LIMIT <起始位置>,<每页数量>`。 4. **执行SQL语句**: - 使用`PREPARE`、`EXECUTE`语句动态执行上述SQL语句。 ...

    mysql中存储过程、函数的一些问题

    在编写存储过程和函数的过程中,有时我们需要根据运行时的具体情况动态地生成SQL语句,例如使用变量作为表名。然而,在MySQL中直接使用变量作为表名会导致语法错误。这是因为MySQL解释器会尝试将变量视为表名而不是...

    非常好的mysql笔记,详细记载了mysql相关操作及一些典型案例

    预处理语句在MySQL中用于提高效率和安全性,避免SQL注入。以下是预处理的例子: ```sql PREPARE stmt FROM 'INSERT INTO dept(dname, loc) VALUES (?, ?)'; SET @dname = 'li'; SET @loc = 'xin'; EXECUTE stmt ...

    mysql分页存储过程

    存储过程是一种在数据库中预编译好的SQL语句集合,可以接受输入参数、返回输出参数或结果集。使用存储过程的好处包括提高性能(减少网络传输)、增强安全性(减少直接的SQL注入风险)以及简化复杂的业务逻辑处理。 ...

    sql注入过滤字典.txt

    SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在应用程序接收用户输入的地方插入恶意SQL语句,来操控数据库执行非预期的操作。为了防范此类攻击,开发人员通常会采用一些过滤机制来剔除可能引起SQL注入...

    PHP与Mysql练习题.rar

    3. **预处理语句**:预处理语句可以防止SQL注入,例如使用 `prepare()` 准备SQL,`execute()` 执行,`bind_param()` 绑定参数。 4. **事务处理**:通过 `begin_transaction()`, `commit()`, `rollback()` 实现事务的...

    PHP开发者最常犯的11个MySQL错误编程小技巧共4页

    不使用预处理可能导致恶意用户通过输入特殊字符操纵SQL语句。使用`mysqli_prepare`和`PDO::prepare`函数来创建预处理语句,然后使用`bind_param`或`bindParam`绑定变量。 2. **忽略错误处理**: 忽视MySQL错误处理...

    mysql 存储过程的问题

    MySQL存储过程是一种在数据库中预编译的SQL语句集合,允许开发人员定义一组操作,这些操作可以在需要时作为一个单元执行,而不是逐个执行单独的SQL语句。在PHP与MySQL的交互中,存储过程常被用于提高数据操作的效率...

    PHP+MySQL动态网站开发实例教程

    - 准备语句与参数绑定:了解预处理语句的概念,使用`mysqli_prepare`、`mysqli_stmt_bind_param`和`mysqli_stmt_execute`防止SQL注入。 4. 动态网页开发: - 数据的展示:使用PHP从MySQL中检索数据,并将其动态地...

    php下巧用select语句实现mysql分页查询

    此外,为了防止SQL注入,应当使用参数化查询或预处理语句,而不是直接在SQL语句中拼接变量。例如,使用PDO的预处理语句: ```php $stmt = $pdo->prepare("SELECT * FROM table LIMIT ?, ?"); $stmt->execute([$...

    phpPDO+mysql单次增删改查多次增删改查百度分页多选删除

    在PHP开发中,数据库操作是不可或缺的一部分,而PDO(PHP Data Objects)提供了一种安全、高效的方式来连接MySQL数据库并执行SQL语句。本教程将详细讲解如何使用PDO进行单次和多次的增删改查操作,并结合百度分页...

    Java间隔指定记录数获取数据库中的数据

    3. **创建Statement对象**:使用`Connection.createStatement()`或`Connection.prepareStatement(sql)`创建执行SQL语句的对象。前者适用于简单的SQL,后者用于参数化查询和防止SQL注入。 4. **编写SQL语句**:构建...

    MySql学习心得之存储过程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者封装一系列的SQL语句,以便重复使用和执行复杂的数据库操作。本文将重点探讨在MySQL中创建和使用存储过程的关键知识点,适用于那些已经有SQL基础的读者...

    PHP程序设计-3期(KC016) 5.2.6数据分页常见问题.docx

    在这个例子中,`bindParam()`方法被用来绑定参数值,其中第一个参数是占位符在SQL语句中的位置,第二个参数是变量名,第三个参数是数据类型。 总结起来,数据分页在PHP编程中是一项重要的任务,需要处理好性能和...

    java分页拦截类实现sql自动分页

    Java 分页拦截类是一种在MyBatis框架中实现SQL自动分页的方法,它通过拦截`StatementHandler`的`prepare`方法来动态修改SQL语句,从而实现物理分页的效果。这种方式使得开发者无需在每个查询方法中手动添加分页逻辑...

    php留言本实例教程和代码

    当数据验证无误后,使用`INSERT INTO` SQL语句将数据插入到数据库。PHP的预处理语句(例如`mysqli_prepare()`和`mysqli_stmt_bind_param()`)能有效防止SQL注入。 6. **查询与显示数据** 要显示留言,使用`SELECT...

    适合初学者的PHP增删改查demo

    - **创建(Create)**: 新增运动员信息时,会执行INSERT SQL语句向运动员表中添加新的记录。这需要构造SQL语句,然后使用PHP的数据库操作函数来执行。 - **读取(Read)**: 显示运动员列表,可能通过SELECT语句从...

Global site tag (gtag.js) - Google Analytics