PDO的安全处理与事物处理方法

5年以前  |  阅读数:252 次  |  编程语言:PHP 

事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行,并且在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操作. 如果执行成功, 那么这一系列操作都会永久有效. 事务很好的解决了在操作数据库的时候不同步的问题. 同时, 通过事务去执行大数据量的时候, 执行效率可以提高很多很多.

事务处理具有四个特性:原子性、一致性、独立性、持久性。并不是所有的数据库都支持事务处理的,PDO 为能够执行事务处理的数据库提供事务支持。

一.PDO异常处理
PDO::ATTR_ERRMODE

  1. PDO::ATTR_ERRMODE//不报错误(忽略)(0)

  2. PDO::ERRMODE_WARNING
    //以警告的方式报错(1)

  3. PDO::ERRMODE_EXCEPTION //以异常的方式报错(2)


    <?php 
    //默认是PDO::ATTR_ERRMODE 不报错误(忽略)(0),需要用errorCode()、errorInfo() 
    try{ 
      $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
    //  $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING); 
      $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
    }catch (PDOException $e){ 
      die("fail to connect db".$e->getMessage()); 
    } 
    $sql="INSERT INTO user VALUES(null,'dabao','26')"; 
    try{ 
      $res=$pdo->exec($sql); 
    }catch (PDOException $e){ 
      echo $e->getMessage(); 
    } 
    //$res=$pdo->exec($sql); 
    //if($res){ 
    //  echo 'OK'; 
    //}else{ 
    //  echo $pdo->errorCode(); 
    //  echo '<br/>'; 
    //  print_r($pdo->errorInfo()); 
    //} 

二.PDO预处理方法

  1. prepare() //用于执行查询SQL语句,返回PDOStatement对象

  2. bindValue() //将值绑定到对应的一个参数,返回布尔值

  3. bindParam() //将参数绑定到相应的查询占位符上,返回布尔值

  4. bindColumn() //用来匹配列名和一个指定的变量名

  5. execute() // 执行一个准备好了的预处理语句,返回布尔值

  6. rowCount() // 返回使用增、删、改、查操作语句后受影响的行总数


    <?php 
    /** 
     * ?号式的预处理语句,共有三种绑定方式 
     */ 

    //1.连接数据库 
    try{ 
      $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
    }catch (PDOException $e){ 
      die("fail to connect db".$e->getMessage()); 
    } 

    //2.预处理的SQL语句 
    $sql="INSERT INTO users(id,name,age) VALUES(?,?,?)"; 
    $stmt=$pdo->prepare($sql); 

    //3.对?号的参数进行绑定 
    $id=null; 
    $name="test103"; 
    $age=103; 

    //第一种绑定方式 
    //$stmt->bindValue(1,$id); 
    //$stmt->bindValue(2,$name); 
    //$stmt->bindValue(3,$age); 

    //第二种绑定方式 
    //$stmt->bindParam(1,$id); 
    //$stmt->bindParam(2,$name); 
    //$stmt->bindParam(3,$age); 

    //4.执行 
    //$stmt->execute(); 
    //第三种绑定方式:直接执行数组 
    $stmt->execute(array($id,$name,$age)); 
    echo $stmt->rowCount(); 

    <?php 
    /** 
     * 别名式的预处理语句,共有三种绑定方式 
     */ 

    //1.连接数据库 
    try{ 
      $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
    }catch (PDOException $e){ 
      die("fail to connect db".$e->getMessage()); 
    } 

    //2.预处理的SQL语句 
    $sql="INSERT INTO users(id,name,age) VALUES(:id,:name,:age)"; 
    $stmt=$pdo->prepare($sql); 

    //3.参数进行绑定 
    $id=null; 
    $name="test203"; 
    $age=23; 

    //第一种绑定方式 
    //$stmt->bindValue("id",$id); 
    //$stmt->bindValue("name",$name); 
    //$stmt->bindValue("age",$age); 

    //第二种绑定方式 
    //$stmt->bindParam("id",$id); 
    //$stmt->bindParam("name",$name); 
    //$stmt->bindParam("age",$age); 

    //4.执行 
    //$stmt->execute(); 
    //第三种绑定方式:直接执行数组 
    $stmt->execute(array("id"=>$id,"name"=>$name,"age"=>$age)); 
    echo $stmt->rowCount(); 


    <?php 
    /** 
     * 用预处理方式查询数据 
     */ 
    //1.连接数据库 
    try{ 
      $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
    }catch (PDOException $e){ 
      die("fail to connect mysql".$e->getMessage()); 
    } 

    //2.预处理查询 
    $sql="SELECT id,name,age FROM users"; 
    $stmt=$pdo->prepare($sql); 
    //3.执行 
    $stmt->execute(); 
    foreach($stmt as $val){ 
      echo $val['id']."------".$val['name']."------".$val['age']."<br/>"; 
    } 

三.事务处理操作方法介绍
1) beginTransaction() //开启一个事物(做一个回滚点)

  1. commit()
    //提交事务

  2. rollBack() //事务回滚操作


    <?php 
    //1.连接数据库 
    try{ 
      $pdo=new PDO("mysql:host=localhost;dbname=myapp","root",""); 
      $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
    }catch (PDOException $e){ 
      die("fail to connect db".$e->getMessage()); 
    } 
    //2.执行数据操作 
    try{ 
      //开启事物 
      $pdo->beginTransaction(); 
      $sql="insert into users(id,name,age) VALUES(?,?,?)"; 
      $stmt=$pdo->prepare($sql); 
      //传入参数 
      $stmt->execute(array(null,"test1","21")); 
      $stmt->execute(array(null,"test2","22")); 
      $stmt->execute(array(null,"test3","23")); 
      //提交事物 
      $pdo->commit(); 
    }catch (PDOException $e){ 
      die("fail to execute".$e->getMessage()); 
      //事物回滚 
      $pdo->roolback(); 
    } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例