PDO基础知识

一、什么是PDO?

  PHP DATA OBJECT

  PHP数据库抽象层

  位于PHP与数据库中间的一个桥梁

二、为什么要使用PDO?

  方便数据库的迁移

  方便数据库的升级

  减少学习成本

  使程序更加安全

  防止sql注入

  提高代码效率

三、何时采用PDO?

  绝大多数操作数据库的项目都使用PDO

四、PDO的安装

  1)类库文件需要存在

    php根目录下的ext文件夹中:php_pdo.dll、php_pdo_mysql.dll

  2)在php的配置文件php.ini中须开启

    extension=php_pdo.dll

    extension=php_pdo_mysql.dll

五、如何使用PDO?

  1)PDO核心类

    ①连接数据库

      new PDO($dsn,$username,$password)

        $dsn:

          1.直接写入字符串(推荐)

            $dsn="mysql:host=localhost;dbname=test;charset=utf8";

          2.远程加载文件(不推荐)

            $dsn="uri:file:///d:/dsn.txt";

            $dsn="uri:http://www.baidu.com/dsn.txt";

            dsn.txt文件中的内容为:

              mysql:host=localhost;dbname=test;charset=utf8

          3.设置php.ini(不推荐)

            在php的配置文件php.ini中找到:[PDO],若没有找到则在文件最后手动添加:

              [PDO]

              pdo.dsn.mydsn="mysql:host=localhost;dbname=test;charset=utf8";

            在代码中引入:

              $dsn="mydsn";

    ②判断错误

      使用PDOException异常处理

    ③设置字符集

      $pdo->query("set names utf8");

    ④错误模式设置

      1.手动抛出错误异常,放在sql语句执行之后

        PDO::errorCode()

        PDO::errorInfo()

      2.设置自动抛出错误异常,放在sql语句执行之前

        PDO::setAttribute()

        静默模式(默认)

          PDO::ATTR_ERRMODE=>PDO::ERRMODE_SILENT

        警告模式

          PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING

        异常处理模式(推荐)

          PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION

    ⑤执行sql语句

      1.exec()

        执行增、删、改语句,成功返回受影响行数,失败返回false

      2.query()

        执行查询语句,成功返回PDO预处理对象(可作二维数组处理,直接用foreach遍历)

      3.lastInsertId()

        返回最近一次插入行的ID或序列值

    ⑥关闭数据库连接

      $pdo=null;unset($pdo);

  2)PDO预处理类

    1.什么是预处理?

      就是将sql语句的语法提前解析

    2.为什么要使用预处理?

      效率提高,语法只解析一次

      有效防止sql注入

    3.何时采用预处理?

      框架当中基本全是预处理

    4.如何使用预处理?

      ①准备参数,依次为预处理对象中占位符对应的字段

      ②创建预处理对象

        $stmt=$pdo->prepare(" ");

      ③绑定参数,标识符从1开始,有几个参数就依次绑定几次

        方式一:

          $stmt->bindParam(1,$i);

          $stmt->bindParam(2,$j);

        方式二:

          $stmt->bindValue(1,$i);

          $stmt->bindValue(2,$j);

        方式三:

          可以使用数组对应各占位符的值,在下一步执行对象时将该数组传入

          $arr=array('第一个占位符对应的值','第二个占位符对应的值',...);

          $arr=array('字段名1'=>'以字段名1为占位符对应的值','字段名2'=>'以字段名2为占位符对应的值',...);

      ④执行对象

        $stmt->execute();

        //$stmt->execute($arr);

      ⑤占位符

        ?

          在绑定参数时须指定各占位符对应位置,从1开始

        :字段名称

          在绑定参数时须指定各对应的字段名称

      ⑥查询处理

        $stmt->execute()执行完毕后,解析结果:

          1.$stmt->fetch(PDO::FETCH_ASSOC)

            解析一条,需要循环解析

            while($stmt->fetch(PDO::FETCH_ASSOC){

            }

          2.$stmt->fetchAll(PDO::FETCH_ASSOC)

            解析所有结果,将结果返回到一个二维数组中

          3.$stmt->rowCount()不仅可以获取增、删、改的受影响行数,也可获取查询的记录行数

  3)PDO的异常处理类

    PDOException

    PDOException::getCode()  异常号

    PDOException::getMessage()  异常信息

  4)事务处理

    1.什么是事务处理

      把一整件事情作为一个整体,作为一个事务

    2.为什么要使用事务处理

      程序的安全性、完整性

    3.什么时候使用事务处理

      重要数据

    4.如何使用事务处理

      ①开启事务

        PDO::beginTransaction()

      ②执行sql语句

        PDO::exec()

      ③执行事务或回滚事务

        PDO::commit()

        PDO::rollBack()

try{
    //连接数据库
    $dsn="mysql:host=localhost;dbname=test;charset=utf8";
    $username="autumn";
    $password="ZWQ900815";

    $pdo=new PDO($dsn,$username,$password);

    //设置字符集
    $pdo->query("set names utf8");

    //错误模式设置
    //方式一:手动抛出错误异常,放在sql语句执行之后
    /*
    $errorInfo=$pdo->errorInfo();
    //发生错误时,$errorInfo[1]为错误号和$errorInfo[2]为错误信息
    //无错误时,$errorInfo[1]和$errorInfo[2]均为空
    if(!empty($errorInfo[1])){
        //抛出错误异常
        throw new PDOException($errorInfo[2],$errorInfo[1]);
    }
    */
    //方式二:自动抛出错误异常,放在sql语句执行之前
    //设置PDO::ATTR_ERRMODE(静默模式[默认]、警告模式、异常处理模式[推荐])
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    //准备sql语句
    //$sql01="insert into cms_user(username,password) values('admin02','1234')";
    //$sql02="delete from cms_user where id=2";
    //$sql03="update cms_user set username='admin' where id=1";
    //$sql04="select1 * from cms_user";
    //执行sql语句
    //exec  处理增、删、改语句,返回受影响行数
    //query  处理查询语句
    //$pdo->exec($sql01);
    //返回最近一次插入行的ID或序列值
    //echo $pdo->lastInsertId();
    //$pdo->exec($sql02);
    //$pdo->exec($sql03);
    /*
    $data=$pdo->query($sql04);
    foreach ($data as $key=>$val) {
        echo $val['id']."
";
        echo $val['username']."
";
        echo $val['password']."
";
    }
    */


    //预处理
    //方式一
    /*
    //1.准备参数,依次为下面要处理的sql语句中?占位符对应的字段值
    $id=1;
    $username='autumn';
    //2.创建预处理对象
    $stmt=$pdo->prepare("delete from cms_user where id=? and username=?");
    //3.绑定参数,$id、$username为引用传参,参数赋值可在前可在后
    //绑定参数标识符从1开始,有几个参数变量,就依次绑定几次
    $stmt->bindParam(1,$id);
    $stmt->bindParam(2,$username);
    //绑定值,变量值的赋值只能在前,不能在后,作用等同于bindParam()
    //$stmt->bindValue(1,$id);
    //$stmt->bindValue(2,$username);
    //4.执行对象
    $stmt->execute();
    */
    //方式二
    /*
    $id=1;
    $username='autumn';
    $stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");
    $stmt->bindParam(":id",$id);
    $stmt->bindParam(":username",$username);
    $stmt->execute();
    */
    //方式三(推荐)
    //若使用“?”作为占位符
    //$stmt=$pdo->prepare("delete from cms_user where id=? and username=?");
    //$arr=array(1,'autumn');
    //若使用“:字段名称”作为占位符
    /*
    $stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");
    $arr=array("id"=>1,"username"=>"autumn");
    $stmt->execute($arr);
    echo $stmt->rowCount();  //受影响行数
    */
    $stmt=$pdo->prepare("select * from cms_user where id>:id");
    $arr=array("id"=>3);
    $stmt->execute($arr);
    $data=$stmt->fetchAll(PDO::FETCH_ASSOC);
    echo $stmt->rowCount();  //也可获取查询的记录行数
    echo "<pre>";
    var_dump($data);
    echo "</pre>";


    //执行事务处理
    /*
    //1.开启事务
    $pdo->beginTransaction();
    //2.执行sql语句
    $aff01=$pdo->exec("update cms_user set username='admin01' where id=1");
    //sql语句本身有错误而无法执行时会自动抛出错误异常,而当sql语句可执行后受影响行数为0时,需要手动抛出异常
    if($aff01==0){
        throw new PDOException("受影响行数为0!");
    }
    $aff02=$pdo->exec("insert into cms_user(username,password) values('admin02','0000')");
    if($aff02==0){
        throw new PDOException("受影响行数为0!");
    }
    //3.执行事务
    $pdo->commit();
    */


    //关闭数据库连接
    $pdo=null;


}catch(PDOException $e){
    //4.回滚事务
    //$pdo->rollBack();

    //异常处理
    //$e->getCode();//异常号
    //$e->getMessage();//异常信息
    echo "(".$e->getCode().")".$e->getMessage();
}
原文地址:https://www.cnblogs.com/zhouwanqiu/p/9629181.html