预处理
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(); //提交
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mysql 预查询处理 事务机制 - Python技术站