从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存储过程实现分页 #### 背景与需求 在数据库操作中,分页是一种常见...同时,通过预编译的方式执行SQL语句,可以有效避免SQL注入等安全问题。总之,利用MySQL存储过程实现分页是一个非常实用且高效的方法。
- 构建实际查询数据的SQL语句:`SELECT <字段列表> FROM <表名> WHERE <条件> ORDER BY <排序方式> LIMIT <起始位置>,<每页数量>`。 4. **执行SQL语句**: - 使用`PREPARE`、`EXECUTE`语句动态执行上述SQL语句。 ...
在编写存储过程和函数的过程中,有时我们需要根据运行时的具体情况动态地生成SQL语句,例如使用变量作为表名。然而,在MySQL中直接使用变量作为表名会导致语法错误。这是因为MySQL解释器会尝试将变量视为表名而不是...
预处理语句在MySQL中用于提高效率和安全性,避免SQL注入。以下是预处理的例子: ```sql PREPARE stmt FROM 'INSERT INTO dept(dname, loc) VALUES (?, ?)'; SET @dname = 'li'; SET @loc = 'xin'; EXECUTE stmt ...
存储过程是一种在数据库中预编译好的SQL语句集合,可以接受输入参数、返回输出参数或结果集。使用存储过程的好处包括提高性能(减少网络传输)、增强安全性(减少直接的SQL注入风险)以及简化复杂的业务逻辑处理。 ...
SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在应用程序接收用户输入的地方插入恶意SQL语句,来操控数据库执行非预期的操作。为了防范此类攻击,开发人员通常会采用一些过滤机制来剔除可能引起SQL注入...
3. **预处理语句**:预处理语句可以防止SQL注入,例如使用 `prepare()` 准备SQL,`execute()` 执行,`bind_param()` 绑定参数。 4. **事务处理**:通过 `begin_transaction()`, `commit()`, `rollback()` 实现事务的...
不使用预处理可能导致恶意用户通过输入特殊字符操纵SQL语句。使用`mysqli_prepare`和`PDO::prepare`函数来创建预处理语句,然后使用`bind_param`或`bindParam`绑定变量。 2. **忽略错误处理**: 忽视MySQL错误处理...
MySQL存储过程是一种在数据库中预编译的SQL语句集合,允许开发人员定义一组操作,这些操作可以在需要时作为一个单元执行,而不是逐个执行单独的SQL语句。在PHP与MySQL的交互中,存储过程常被用于提高数据操作的效率...
- 准备语句与参数绑定:了解预处理语句的概念,使用`mysqli_prepare`、`mysqli_stmt_bind_param`和`mysqli_stmt_execute`防止SQL注入。 4. 动态网页开发: - 数据的展示:使用PHP从MySQL中检索数据,并将其动态地...
此外,为了防止SQL注入,应当使用参数化查询或预处理语句,而不是直接在SQL语句中拼接变量。例如,使用PDO的预处理语句: ```php $stmt = $pdo->prepare("SELECT * FROM table LIMIT ?, ?"); $stmt->execute([$...
在PHP开发中,数据库操作是不可或缺的一部分,而PDO(PHP Data Objects)提供了一种安全、高效的方式来连接MySQL数据库并执行SQL语句。本教程将详细讲解如何使用PDO进行单次和多次的增删改查操作,并结合百度分页...
3. **创建Statement对象**:使用`Connection.createStatement()`或`Connection.prepareStatement(sql)`创建执行SQL语句的对象。前者适用于简单的SQL,后者用于参数化查询和防止SQL注入。 4. **编写SQL语句**:构建...
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者封装一系列的SQL语句,以便重复使用和执行复杂的数据库操作。本文将重点探讨在MySQL中创建和使用存储过程的关键知识点,适用于那些已经有SQL基础的读者...
在这个例子中,`bindParam()`方法被用来绑定参数值,其中第一个参数是占位符在SQL语句中的位置,第二个参数是变量名,第三个参数是数据类型。 总结起来,数据分页在PHP编程中是一项重要的任务,需要处理好性能和...
Java 分页拦截类是一种在MyBatis框架中实现SQL自动分页的方法,它通过拦截`StatementHandler`的`prepare`方法来动态修改SQL语句,从而实现物理分页的效果。这种方式使得开发者无需在每个查询方法中手动添加分页逻辑...
当数据验证无误后,使用`INSERT INTO` SQL语句将数据插入到数据库。PHP的预处理语句(例如`mysqli_prepare()`和`mysqli_stmt_bind_param()`)能有效防止SQL注入。 6. **查询与显示数据** 要显示留言,使用`SELECT...
- **创建(Create)**: 新增运动员信息时,会执行INSERT SQL语句向运动员表中添加新的记录。这需要构造SQL语句,然后使用PHP的数据库操作函数来执行。 - **读取(Read)**: 显示运动员列表,可能通过SELECT语句从...