PDO安全事务处理

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();






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值