许多成熟的数据库都支持预处理语句(Prepared Statements)的概念。它们是什么东西?php
你能够把它们想成是一种编译过的要执行的SQL语句模板,可使用不一样的变量参数定制它。数据库
预处理语句具备两个主要的优势:框架
正由于预处理语句是如此有用,它成了PDO惟一为不支持此特性的数据库提供的模拟实现。fetch
这使你可使用统一的数据访问规范而没必要关心数据库自己是否具有此特性。优化
/* 使用预处理语句重复插入数据(1) 此示例演示了一个经过向命名占位符代入一个name和一个value值来执行的INSERT查询 */ $stmt= $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); //插入一行 $name= 'one'; $value= 1; $stmt->execute();//使用不一样的值插入另外一行 $name= 'two'; $value= 2; $stmt->execute(); /* 使用预处理语句重复插入数据(2) 此示例演示了一个经过向用?表示的占位符代入一个name和一个value值来执行的INSERT查询 */ $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(); /* 经过预处理语句获取数据 此示例演示使用从表单获取的数据为关键值来执行查询获取数据。用户的输入会被自动添加引号,因此这儿不存在SQL注入攻击的危险。 */ $stmt= $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if($stmt->execute(array($_GET['name']))) { while($row= $stmt->fetch()) { print_r($row); } }
其实主流的PHP框架都支持Prepared Statements,并且要简单不少。下面是ThinkPHP模型支持的例子:.net
// 实例化User模型 $model= D('User'); // 定义预处理传入数据 $data['username'] = 'deeka'; $data['password'] = '123456'; // 数据预处理 if($model->create($data)){ $model->add(); }