青风百里

SQL 语句预编译
一.问题引入在查询几万条数据的时候,第一次要很长时间,第二次就只需要很少的时间,就不模拟了,没有那么多数据SQL语...
扫描右侧二维码阅读全文
30
2018/09

SQL 语句预编译

一.问题引入

  • 在查询几万条数据的时候,第一次要很长时间,第二次就只需要很少的时间,就不模拟了,没有那么多数据
  • SQL语句的执行分为两个阶段:编译和执行
  • 如果第一次执行,是先编译再执行,编译过程十分复杂,耗用系统资源,相对不安全
  • 如果再次执行相同的语句,直接从缓存中读取,执行效率高,也可以防止SQL注入,是比较安全的

二.PDO预处理的步骤

  • 先提取相同结构的sql部分(将数据部分,可变部分去掉)
  • 编译这个相同的结构,将编译结果保存
  • 再将不同的数据部分放入(绑定数据)
  • 执行

1.制作相同结构的SQL语句

  • 使用占位符":value"来代替真正的数据,例如:INSERT INTO student VALUES(:title, :age)
  • 使用另一种占位符":1"来代替真正的数据,例如:INSERT INTO student VALUES(?, ?, ?)

2.预编译相同结构的SQL语句

  • 使用PDO::prepare()函数
  • 注意预编译的代码有时间限制,看缓存怎么设置的

3.绑定数据

  • 使用PDOStatement::bindValue(":titile", "新闻数据");
  • 或者使用PDOStatement::bindValue("1", "新闻数据");

4.执行绑定数据的SQL语句

  • 使用bool PDOStatement::execute ()执行预处理语句
  • 总结为(1)提取,(2)预编译,(3)绑定,(4)执行

下面看案例

<?php
$dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
$username = "root";
$password = "";
$pdo = new PDO($dsn, $username, $password);
//(1)提取
$sql = "INSERT INTO `user`(sex, age) VALUES(:sex, :age)";
//(2)预编译
$PDOStatement = $pdo->prepare($sql);
//(3)绑定
$PDOStatement->bindValue(":sex", "男");
$PDOStatement->bindValue(":age", 14);
//(4)执行
$PDOStatement->execute();

  • 使用另一种占位符
<?php
$dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
$username = "root";
$password = "";
$pdo = new PDO($dsn, $username, $password);
//(1)提取
$sql = "INSERT INTO `user`(sex, age) VALUES(?, ?)";
//(2)预编译
$PDOStatement = $pdo->prepare($sql);
//(3)绑定
$PDOStatement->bindValue("1", "女");
$PDOStatement->bindValue("2", 99);
//(4)执行
$PDOStatement->execute();

Last modification:September 30th, 2018 at 07:10 pm

Leave a Comment