PDO安全处理与事务处理
1. PDO异常处理
PDO异常处理介绍:
- PDO::ATTR_ERRMODE://不报错(忽略)(0)
- PDO::ERRMODE_WARNING: //以警告的方式报错(1)
- PDO::ERRMODE_EXCEPTION://以异常处理方式报错(2)
举例:
<?php
// 默认不提示错误信息,需要用errorCode(), errorInfo()
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
$sql = "INSERT INTO users(name, age) VALUES ('xy', 11)";
$res = $pdo->exec($sql);
if($res){
echo "sucess";
}else{
//打印错误信息
echo $pdo->errorInfo();
print_r($pdo->errorInfo());
}
设置错误报警:
<?php
// 默认不提示错误信息,需要用errorCode(), errorInfo()
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
//设置错误报警模式
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//或者1
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
$sql = "INSERT INTO users(name, age) VALUES ('xy', 11)";
$res = $pdo->exec($sql);
if($res){
echo "sucess";
}else{}
设置异常信息模式:
<?php
// 默认不提示错误信息,需要用errorCode(), errorInfo()
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
//设置成异常信息
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
$sql = "INSERT INTO users(name, age) VALUES ('xy', 11)";
try{
}catch (PDOException $e){
echo $e->getMessage();
}
2. PDO预处理
PDO预处理方法:
- prepare() // 用于执行查询SQL语句,返回PDOStatement对象
- bindValue() //将值绑定到对应的一个参数,返回布尔值
- bindParam() // 将参数绑定到相应的查询占位符上,返回布尔值
- bindColumn() // 用来匹配列名和一个指定的变量名
- execute() // 执行一个准备好了的预处理语句,返回布尔值
- rowCount() // 返回使用增,删,改,查操作语句后受影响的行总数。
绑定方法:
?式的绑定方法:
<?php
/*
* ?式的预处理语句,共有三种绑定方式
*/
//1.连接数据库
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
//print_r($pdo);
//2. 预处理的SQL语句
$sql = "INSERT INTO users(id, name, age) VALUES (?,?,?)";
//执行预处理语句
$stmt = $pdo->prepare($sql);
//3. 参数绑定的三种方法
// i;(?式的绑定方式)
$stmt->bindValue(1, null);
$stmt->bindValue(2,'xyz');
$stmt->bindValue(3, 33);
// ii;(变量绑定方式)
$stmt->bindParam(1,$id);
$stmt->bindParam(2,$name);
$stmt->bindParam(3,$age);
$id = null;
$name = 'xxx';
$age = 24;
// iii: 数组方式绑定
$stmt->execute(array(null, 'zzz', 22));
//4. 执行
$stmt->execute();
echo $stmt->rowCount();
别名的预处理方式:
<?php
/*
* 别名式的预处理语句,共有三种绑定方式
*/
//1.连接数据库
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
//print_r($pdo);
//2. 预处理的SQL语句
$sql = "INSERT INTO users(id, name, age) VALUES (:id,:name,:age)";
//执行预处理语句
$stmt = $pdo->prepare($sql);
//3. 参数绑定的三种方法
// i;(?式的绑定方式)
$stmt->bindValue("id", null);
$stmt->bindValue("name",'xxyz');
$stmt->bindValue("age", 33);
//4. 执行
$stmt->execute();
// ii;(变量绑定方式)
$stmt->bindParam("id",$id);
$stmt->bindParam("name",$name);
$stmt->bindParam("age",$age);
$id = null;
$name = 'xxxs';
$age = 24;
//4. 执行
$stmt->execute();
// iii: 数组方式绑定
//$stmt->execute(array(null, 'zzzz', 22));
$stmt->execute(array("id"=>null, "name"=>'zzzz',"age"=> 22));
echo $stmt->rowCount();
预处理的查询:
<?php
/*
* 采用预处理SQL执行查询,并采用绑定结果方式输出
*/
//1.连接数据库
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
//print_r($pdo);
//2. 预处理的SQL语句
$sql = "SELECT id,name,age FROM users ";
//执行预处理语句
$stmt = $pdo->prepare($sql);
//3. 执行
$stmt->execute();
//
$stmt->bindColumn(1, $id);
$stmt->bindColumn(2, $name);
$stmt->bindColumn("age", $age);
while($val=$stmt->fetch(PDO::FETCH_COLUMN)){
echo "{$id}:{$name}:{$age}<br>";
}
//foreach($stmt as $val){
// echo $val['id'].'...'.$val['name'].'...'.$val['age'].'<br>';
//}
3. PDO事务处理
数据表需要InnoDB类型
事务处理操作方法:
- beginTransation() // 开启一个事务(做一个回滚点)
- commit() // 提交事务
- rollBack() // 事务回滚操作
<?php
// 采用预处理+事务处理执行SQL操作
//1.连接数据库
try{
$pdo = new PDO("mysql:host=localhost; dbname=myapp", "root","");
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch (PDOException $e){
die('Connection failed:'.$e->getMessage());
}
print_r($pdo);
//执行数据操作
try{
//开启事务;
$pdo->beginTransaction();
$sql = "INSERT INTO users(id, name, age) VALUES (?,?,?)";
$stmt = $pdo->prepare($sql);
//传入参数
$stmt->execute(array(1,'xxxxu',22));
$stmt->execute(array(null,'zu',22));
$stmt->execute(array(null,'zxxxu',22));
//提交事务
$pdo->commit();
}catch (PDOException $e){
die("fail to exec".$e->getMessage());
$pdo->rollBack();