zoukankan      html  css  js  c++  java
  • PHP PDO扩展整理,包括环境配置基本增删改查事务预处理

    相关文章:PHP的mysql扩展整理,操作数据库的实现过程分析    PHPmysqli扩展整理,包括面向过程和面向对象的比较事务控制批量执行预处理

     

    介绍

    PDO是一种PHP程序连接数据库的接口,通过PDO可以将PHP程序与数据库联系起来.

    优点:

      1.可移植性,可以支持各种主流数据库服务,而且实现代码几乎都是相同的,使用PDO在代码层面上不需要太多操作就可以把一个程序的后台数据库从mysql移植到oracle上

      2,支持事务和预处理等高级操作,能够有效的防止sql注入

    环境配置

    必须在PHP5.0及以上配置文件中开启PDO相关的数据库扩展

    比如想要使用PDO连接mysql数据库,就必须打开PDO_mysql扩展

    就在php.ini中找到extension-php_pdo_mysql.dll,把这一行前面的分号去掉

    然后使用phpinfo函数查看,如过显示如下图的内容,表示成功开启:

    基本流程

    首先要创建一个PDO对象,数据库连接的方法就封装在PDO类的构造函数中.实例化PDO类,传入相应的参数,就可以实现数据库的连接:

    $pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');

    PDO类有三个必要的参数,分别是:数据库驱动 登录名 密码

    不同类型数据库驱动会有差别,mysql的驱动格式为:  mysql:host=主机名;dbname=数据库名

    $pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    建议开启数据库的异常模式

    只有开启了异常模式,才能使用try catch语句才会正常捕获PDOException定义的异常:

    $pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    dml操作实例,给雷小军涨薪100块:

    <?php
    try{
        $pdoObj =new PDO("mysql:host=localhost;dbname=test;charset=utf-8",'root','root');
        $pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }catch(PDOException $p){
        echo '数据库连接失败'.$p->getMessage();
    }
    try{
        $affect_rows=$pdoObj->exec("update `class` set salary=salary+100 where sname='雷小军'");
       echo "影响{$affect_rows}行";
    }catch(PDOException $e){
        echo "错误:".$e->getMessage();
    }

    查询操作实例,查询class表中的所有数据 :

    <?php
    try{
        $pdoObj =new PDO("mysql:host=localhost;dbname=test;charset=utf8",'root','root');
        $pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }catch(PDOException $p){
        echo '数据库连接失败'.$p->getMessage();
    }
    try{
        $query=$pdoObj->query("select* from class");
        while($val=$query->fetch(PDO::FETCH_ASSOC)){
            echo "<pre>";
            var_dump($val);
        }
    
    }catch(PDOException $e){
        echo "错误:".$e->getMessage();
    }

    执行查询语句之后,需要使用fetch()函数获取查询的结果集,fetch函数的参数代表获取结果集的类型:

    PDO::FETCH_ASSOC:代表获取以关联数组的形式获取结果集

    PDO::FETCH_NUM:代表索引数组结果集

    如果不填代表索引数组和关联数组都获取到

    事务

    某程序要实现借款功能,Sheldon借给Penny100块钱,必须将Sheldon的存款减100,把Penny的存款加100,这两个操作要么都成功,要么都失败,这时就要用到事务:

    首先需要关闭sql语句自动提交功能,并且开启事务:

    $pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    $pdoObj->beginTransaction();

    然后执行两个update语句,如果成功,提交修改,如果失败,就回滚:

    $affect_rows['borrow']=$pdoObj->exec("update `class` set salary=salary-{$many} where sname='谢尔顿李库伯'");
        $affect_rows['get']=$pdoObj->exec("update `class` set salary=salary+{$many} where sname='佩妮'");
        if ($affect_rows['borrow']&&$affect_rows['get']){
            $pdoObj->commit();
        }
      else {
        
    $pdoObj->commit();
      }

    脚本执行结束后需要开启自动提交功能:

    $pdoObj->setAttributeZ(PDO::ATTR_AUTOCOMMED,1);
    <?php
    try{
        $pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');
        $pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        //关闭自动提交
        $pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    }catch(PDOException $p){
        echo '数据库连接失败'.$p->getMessage();
    }
    try{
        //开启事务
        $pdoObj->beginTransaction();
        
        $many =100;
        $affect_rows=array('borrow'=>0,'get'=>0);
        $affect_rows['borrow']=$pdoObj->exec("update `class` set salary=salary-{$many} where sname='谢尔顿李库伯'");
        $affect_rows['get']=$pdoObj->exec("update `class` set salary=salary+{$many} where sname='佩妮'");
        if ($affect_rows['borrow']&&$affect_rows['get']){
            $pdoObj->commit();
        }
    }catch(PDOException $e){
        echo "错误:".$e->getMessage().'<br />';
        $pdoObj->rollBack();
        echo '转账失败';
    }
    
    //事务操作完成之后开启自动提交
    $pdoObj->setAttribute(PDO::ATTR_AUTOCOMMIT,1);

    预处理

    预处理操作采用预编译的方式,大大提高了程序的执行效率,还能防止sql注入:

    步骤:

    1.将要执行的sql语句写在prepare函数里,缺少的参数使用?填充

    $stmt = $pdoObj->prepare("insert into `class` values(?,?,?,?,?)");

    2.bindParam函数绑定变量

        $stmt->bindParam(1,$id);
        $stmt->bindParam(2,$sname);
        $stmt->bindParam(3,$gender);
        $stmt->bindParam(4,$company);
        $stmt->bindParam(5,$salary);

    3.传入变量并执行

        $id=31;
        $sname='吕布';
        $gender='男';
        $company='群雄';
        $salary=10000;
        $fanbu=1000;
        $stmt->execute();

    当需要执行多组sql语句时,只需要将步骤3复制多组,并且修改参数值即可

    完整实例如下:

    <?php
    try{
        $pdoObj =new PDO("mysql:host=localhost;dbname=test",'root','root');
        $pdoObj ->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    }catch(PDOException $p){
        echo '数据库连接失败'.$p->getMessage();
    }
    try{
        //关联数组的形式
        $stmt = $pdoObj->prepare("insert into `class` values(:id,:sname,:gender,:company,:salary)");
        $stmt->bindParam("id",$id);
        $stmt->bindParam("sname",$sname);
        $stmt->bindParam("gender",$gender);
        $stmt->bindParam("company",$company);
        $stmt->bindParam("salary",$salary);
        $stmt->bindParam("fanbu",$fanbu);
    
        $id=31;
        $sname='吕布';
        $gender='男';
        $company='群雄';
        $salary=10000;
        $stmt->execute();
    
        $id=32;
        $sname='马超';
        $gender='男';
        $company='蜀汉';
        $salary=10000;
        $stmt->execute();
    
        $id=33;
        $sname='典韦';
        $gender='男';
        $company='群雄';
        $salary=10000;
        $stmt->execute();
    }catch(PDOException $e){
        echo "错误:".$e->getMessage().'<br />';
        $pdoObj->rollBack();
        echo '转账失败';
    }
  • 相关阅读:
    事务的传播特性及事务的并发
    Spring 配置文件配置事务
    Spring 配置文件AOP
    Spring 注解形式AOP
    Spring与Junit测试整合
    Spring基础知识1--环境搭建、bean创建、依赖注入、注解注入
    JDK动态代理与CGLIB动态代理
    java.lang.illegalArgumentException异常
    计算器
    list
  • 原文地址:https://www.cnblogs.com/iszhangk/p/11516889.html
Copyright © 2011-2022 走看看