预处理

PDO支持sql预处理功能,可以有效的防止sql注入的问题

例如:

以下操作会导致数据表中所有数据删除

$host = 'localhost';
$port = 3306;
$dbname = 'pdo';
$user = 'root';
$pass = '123';
$dsn = "mysql:host={$host};port={$port};dbname={$dbname}";
try {
    $mysql = new PDO($dsn,$user,$pass);
} catch (Exception $e) {
    echo 'connect failure !';
    die();
}

$id = '1 or 1=1';    //ID模拟从前端获取的删除数据的ID
$sql = "DELETE FROM `books` WHERE id={$id}";
$mysql->exec($sql);

这是常见的一种sql注入的方式

采用pdo提供的预处理的方法,可以避免这一点

$id = '1 or 1=1';    //ID模拟从前端获取的删除数据的ID
$sql = "DELETE FROM `books` WHERE id = :id";    //使用占位符代替用户输入的id    
$sth = $mysql->prepare($sql);        //绑定参数
$sth->execute(array('id'=>$id));

语法:

$mysql->prepare($sql);  //生成预处理语句  返回PDOStatement对象
$sth->execute(array(参数))   //执行预处理语句   返回布尔值

查询

$sql = 'SELECT * FROM `books` WHERE id < 100';
$res = $mysql->query($sql);   //执行查询  返回PDOStatement对象
$all = $res->fetchAll();     //返回结果集中所有的行
$row = $res->fetch();        //返回结果集中下一行,同时指针向前移动一位
foreach ($all as $key => $value) {
    var_dump($value);
}

扩展:TP中预查询

 

$resultSet = Db::query('insert into user values(:name,:age,:sex)', ['张三','10','1']);

 

事务机制

$mysql->beginTransaction();    //开启事务机制
$sql = "UPDATE `books` SET name='mysql and PHP...' WHERE id < 100 ";
$mysql->exec($sql);
//根据业务执行以下语句
$mysql->rollBack();        //回滚
$mysql->commit();        //提交