zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    10-18 noip提高组模拟赛(codecomb)T2贪心
    vj1011:记忆化搜索
    vj1010:高精乘+细心模拟
    10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
    CODEFORCES ROUND #273 DIV2
    Unkown2
    2014.first[未填]
    Unknown
    历年noip复赛试题整合
    快速幂(模板)
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/9629181.html
Copyright © 2011-2022 走看看