MySQL预处理语句

预制语句的SQL语法基于三个SQL语句:

PREPARE stmt_name FROM preparable_stmt;

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

{DEALLOCATE | DROP} PREPARE stmt_name;

PREPARE语句用于预备一个语句,并赋予它名称stmt_name,借此在以后引用该语句。

预编译SQL的存活期就是当前的会话,也就是当前的数据库连接。如果连接一断开 ,那就会消失。

例:

mysql> desc tb;

+-------+------------------+------+-----+---------+----------------+

| Field | Type             | Null | Key | Default | Extra          |

+-------+------------------+------+-----+---------+----------------+

| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |

| Name  | char(20)         | NO   |     | NULL    |                |

| Age   | tinyint(4)       | NO   |     | NULL    |                |

+-------+------------------+------+-----+---------+----------------+

3 rows in set (0.08 sec)

mysql> PREPARE prod FROM "INSERT INTO tb VALUES(?,?,?)";

Query OK, 0 rows affected (0.58 sec)

Statement prepared

mysql> PREPARE prod FROM "INSERT INTO tb(name,age) VALUES(?,?)";

Query OK, 0 rows affected (0.00 sec)

Statement prepared

mysql> set @p=‘tejevo‘;

Query OK, 0 rows affected (0.06 sec)

mysql> set @q=20;

Query OK, 0 rows affected (0.00 sec)

mysql> execute prod using @p, @q;

Query OK, 1 row affected (0.05 sec)

mysql> select * from tb;

+----+--------+-----+

| id | Name   | Age |

+----+--------+-----+

|  1 | tejevo |  20 |

+----+--------+-----+

1 row in set (0.00 sec)

mysql> deallocate prepare prod;

说明:from后面跟的就是要进行编译的那个SQL,这个值可以是一个字面的字符串值 ,就像上面,也可以是一个变量。比如:

set @sql = ‘select * from tb‘;

prepare pstmt from @sql;

from后面跟的只能是字面值或者变量这两种情况 ,不能直接跟十六进制的字符串。

被编译的SQL只能是一条单独的语句,不能多条语句一起编译,比如:

prepare mutisql from ‘select 1;select 2‘;  --- 这是错误的

调用的时候利用using关键字向SQL传递参数 。

set @value = 1;execute pstmt using @value;

先声明一个变量来保存参数的值,然后通过后面的using @value来传SQL传递参数 。
注意这里的参数的值只能由变量来传递,不能直接写成execute pstmt using 1; 这是错误的。
多个参数之间用逗号隔开。

使用 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:可以被预编译的SQL语句的型也是有限制的,并不是所有的SQL都可以被编译。在预定义语句中,CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE, 和大部分的 SHOW 句法被支持。
I:PREPARE 语句不可以用于存储过程(5.0以上可以使用),自定义函数!但从 MySQL 5.0.13 开始,它可以被用于存储过程,仍不支持在函数或触发器中使用!

时间: 2024-10-12 21:04:23

MySQL预处理语句的相关文章

PHP MySQL 预处理语句

PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预处理:创建 SQL 语句模板并发送到数据库.预留的值使用参数 "?" 标记 .例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?) 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出 执行:最

PHP MySQL -处理语句

PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预处理:创建 SQL 语句模板并发送到数据库.预留的值使用参数 "?" 标记 .例如: INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?) 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出. 执行

前端学PHP之PDO预处理语句

× 目录 [1]定义 [2]准备语句 [3]绑定参数[4]执行查询[5]获取数据[6]大数据对象 前面的话 本来要把预处理语句和前面的基础操作写成一篇的.但是,由于博客园的限制,可能是因为长度超出,保存时总是报错,于是再开一篇.另一方面,相较于前面的exec()和query()语句来说,预处理语句更加常用 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这种重复执行一个查询,每次迭代使用不同的参数情况,PDO提供了一种名为预处理语句(prepared s

mysqli_stmt类:使用预处理语句处理SELECT查询结果

SELECT语句和其他的SQL查询命令不同,它需要处理查询结果.SQL语句的执行也需要使用mysqli_stmt对象中的execute()方法,但与mysqli对象中的query()方法不同,execute()方法的返回值并不是一个mysqli_result对象.mysqli_stmt对象提供了一种更为精巧的办法来处理SELECT语句查询结果:在使用execute()方法执行SQL语句完成查询之后,使用mysqli_stmt对象中的bind_result()方法,把查询结果的各个数据列绑定到一些

PDO预处理语句PDOStatement对象使用总结

PDO预处理语句PDOStatement对象使用总结 PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的prepare()方法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的.如果通过之前执行PDO对象中的query()方法返回的PDOStatement类对象,只代表的是一个结果集对象.而如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参

PDO预处理语句规避SQL注入攻击

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击. 第一种方法 <?php $dsn = "mysql:dbname=study;host=localhost"; $pdo = new PDO($dsn,"root","root"); /

mysql prepare语句使用

语法 [sql] view plain copy PREPARE statement_name FROM sql_text /*定义*/ EXECUTE statement_name [USING variable [,variable...]] /*执行预处理语句*/ DEALLOCATE PREPARE statement_name /*删除定义*/ 例 [sql] view plain copy mysql> PREPARE prod FROM "INSERT INTO examlp

MYSQL预处理传参不区分大小写解决办法

问题:预处理语句为:SELECT * FROM WHERE name=? 如果传送的参数为“admin” “ADmin” “ADMIN” “ADimn”等,结果处理后的语句为SELECT * FROM WHERE name=‘admin’ 解决办法:要查询的字段前加BINARY ,如: SELECT * FROM WHERE BINARY name=? 可能原因:调用mysql API将执行预处理语句,可是mysql对这种情况不区分大小写

Mysql常用语句总结

对MySql经常使用语句的详细总结 下面总结的知识点全是经常用的,全都是干货,好好收藏吧./* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysqld --skip-grant-tables -- 修改root密码 密码加密函数password() update mysql.user set password=password('root'); SHOW