预处理与参数绑定

即时sql

一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)执行流程如下:

  1. 词义及语法解析;
  2. mysql优化器优化,指定执行计划;
  3. 执行并返回结果;

预处理sql

大多数项目中的sql语句都是固定的,每次运行时只是参数的不同(select中where条件值,update中的set,insert中的value),如果每次运行都解析语法、优化器优化,执行计划等,很影响效率。所谓预编译语句就是将此类 SQL 语句中的参数用占位符替代,可以视为将 SQL语句模板化或者说参数化,一般称这类语句叫Prepared Statements。预处理具有如下优势:

  1. 一次编译、多次运行,省去了解析优化等过程,mysql服务端只需要解析一次sql语句;
  2. 以二进制方式只需要发送句柄和参数,对于blob和text格式,采用绑定参数的形式可分块传输,而无需一次性传输;
  3. 仅需要将参数传至mysql服务端,而不是整个sql语句,网络io更小;
  4. 最重要的一点,可防止 SQL 注入,因为预处理已将sql语句结构固化,传入的参数不会再进行语法解析,不会改变之前的语法。

mysql预处理

set @sql = 'select * from test.full_text where id = ?';
set @id = 1;
//定义预处理
prepare sql_prepare from @sql;
//执行预处理语句
execute sql_prepare using @id;
//删除语句,释放资源
{DEALLOCATE | DROP} PREPARE sql_prepare;

php pdo预处理及参数绑定

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// 插入一行
$name = 'one';
$value = 1;
$stmt->execute();

// 用不同的值插入另一行
$name = 'two';
$value = 2;
$stmt->execute();
?>
讨论数量: 1

小猿赶早为你点赞~!

4年前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!