14.数据库抽象层PDO

14.数据库抽象层PDO-四曲博客
14.数据库抽象层PDO
此内容为免费阅读,请登录后查看
0
免费阅读

什么是PDO

  • PDO就是一个数据库访问抽象层,作用是统一各种数据库的访问接口,能够轻松的在不同数据库之间进行切换
  • 对于不同的数据库,PDO并不是通过PDO扩展本身来执行的,必须针对不同的数据库服务器使用特定的PDO驱动程序访问,切换数据库,只需要重新加载PDO驱动程序就可以了,以下是不同数据库的PDO驱动程序名称表

image-20201031210928381

创建PDO对象

  • 在使用构造方法创建PDO对象时,需要指定数据库服务器进行连接

image-20201031213044872

  1. 第一个参数是数据源名(DSN),用来定义一个确定的的数据库和必须用到的驱动程序,DSN的PDO命名惯例为PDO驱动程序的名称,后面为一个冒号,在后面是可选的驱动程序的数据库连接变量信息,如主机名、端口、数据库名

image-20201031213234165

  1. 第二个参数为连接数据库的用户名和密码,最后一个参数需要指定一个数组,从来指定连接所需的额外选项 ,传递附加调优的参数到PDO或底层驱动程序

以多种方式调用构造方法

  • 利用数据库名称和主机名,连接MySQL数据库
<html>
    <head><title>云端留言板</title></head>
    <body>
        <?php
            $dsn="mysql:dbname=siqu;host=127.0.0.1";
            $username="siqu";
            $password="siqu123";

            try{
                $pdo_object=new PDO($dsn,$username,$password);
                echo "连接成功";              
            }catch(PDOException $e){
                echo "连接失败".$e->getMessage();
            }
        ?>
    </body>
</html>
  • 将参数存放在文件中,并在构造函数中引用
  • 引用php.ini文件
  1. 将DSN信息赋值给一个pdo.dsn.aliasname的配置参数,aliasname是构造函数中DSN的别名,在调用构造方法时,在第一个参数中使用别名即可
  • PDO与连接有关的选项,将这些选项传递到构造方法的第四个参数中,附加调优参数

image-20201031214837905

PDO对象中的成员方法

image-20201031214921896

使用PDO对象

调整PDO的行为属性

  • getAttribute():该方法只需要提供一个参数,传递一个参数的属性名称,如果成功执行,则返回该属性所指定的值
  • setAttribute():第一个参数:属性名,第二个参数:属性值,

处理PHP程序和数据库之间的数据类型转换

PDO在某种程度上是对数据类型不可知的,因此它将任何数据都表示为字符串,如果集合资源中包含一个NULL值的数据,除了oracle与MySQL以外,其他的数据库都不会将空字符串转换为NULL,因此PDO提供了一个程序级属性PDO_ATTR_ORACLE_NULLS,该属性默认为False,设置为True后,会模拟这个行为,将空字符串转换为NULL值

PDO的错误处理

  • PDO::ERRMODE_SILENT:默认模式,在发生错误时不会进行任何操作,PDO将只设置错误代码,开发人员可以通过errorCode()和errorInfo()方法对语句和数据库对象进行检查
  • PDO::ERRMODE_WARNING:可以使常规的PHP错误处理程序捕获该警告
  • PDO::ERRMODE_EXCEPTION:PDO会抛出一个PDOException,并设置,以反映错误代码和错误信息

使用PDO执行SQL语句

  • PD0::exec()方法,该方法主要应用于没有select语句的情况下,成功执行后,返回受影响的行数,

  • PD0::query()方法,该方法主要用于select语句,成功执行后,返回一个PDOStatent对象,如果想要了解获取数据总行数,则可以使用PDOStatement对象当中的rowCount()方法获得

    
    <html>
    <head><title>使用PDO</title></head>
    <body>
        <?php
            $dsn="mysql:dbname=siqu;host=127.0.0.1";
            $username="siqu";
            $password="siqu123";
    
            try{
                $pdo_object=new PDO($dsn,$username,$password);
                echo "连接成功"."<br/>";              
            }catch(PDOException $e){
                echo "连接失败".$e->getMessage();
            }
    
            $select="select * from users";
    
            #运行sql语句
            $pdoStatement_object=$pdo_object->query($select);
    
            #输出结果
            foreach ($pdoStatement_object as $row) {
                echo "id:".$row["id"]."<br/>";
                echo "username:".$row["username"]."<br/>";
            }
    
        ?>
    
    </body>
    </html>
  • 可以使用PDO过滤掉一些特殊字符,可以使用quote()方法来实现

image-20201031223148346

PDO对预处理语句的支持

  • 在有的时候,PHP经常会执行除了参数以外,其他部分都相同的SQL语句,对于这种情况PDO提供了一种名为预处理语句的机制,能够大大节省开销,提高速度

了解PDOStatement对象

  • 该对象不是通过NEW关键字实例化出来的,而是通过prepare()方法返回得来的,与query()语句不同的是,query()语句返回的PDOStatement对象只是一个结果集对象,而prepare()方法返回的PDOStatement对象则能定义和执行参数化的SQL命令,

image-20201031223759950

image-20201031223812570

准备语句

  • 使用占位符来替代具体的参数数据,先让PDO进行预处理,
  1. 命名参数作为占位符的INSERT查询如下:

image-20201031224202487

2.使用“?”作为占位符

image-20201031224243020

绑定参数

  • 通过PDOStatement对象方法bindParam()方法来绑定参数替换占位符

image-20201031224436904

  1. 第一个参数是必选项,如果使用名称参数,那么将名称字符串作为第一个参数提供,如果是问号占位符,则使用索引偏移量,索引偏移量从1开始,按整数方式递增
  2. 第二个参数也是必选项,提供给所指定占位符的值,由于该参数是按引用传递的,所以不能给具体的数值
  3. 第三个参数是可选项,显示的为当前绑定的参数设置数据类型

image-20201031224828165

  1. 第四个参数length是可选项,用于指定数据类型的长度
  2. 第五个参数是driver_options是可选项,通过该参数提供任何数据库驱动程序特定的选项

执行准备好的语句

  • 在绑定参数之后,使用PDOStatement对象的extcute()方法,执行语句即可

    PDO应用
    
        ";              
            }catch(PDOException $e){
                echo "连接失败".$e->getMessage();
            }

            #设置预处理语句
            $pdostatement_object=$pdo_object->prepare("INSERT INTO users (username) VALUES (?)");

            $name_array=array("ling","li","yang","wang");

            for($i=0;$ibindParam(1,$name);

                #设置参数内容
                $name=$name_array[$i];

                #执行语句
                $pdostatement_object->execute();
            }

            echo "执行完成";
        ?>
    
  • 如果有多个占位符需要输入,那么可以使用索引数组的方式进行,省去绑定环节

    PDO应用
    
        ";              
            }catch(PDOException $e){
                echo "连接失败".$e->getMessage();
            }

            #设置预处理语句
            $pdostatement_object=$pdo_object->prepare("INSERT INTO user (name,age) VALUES (?,?)");

            #执行语句,如果使用命名参数,则使用关联索引,如:"name"=>"siqu"
            #如果使用问号占位符,则一一对应即可
            $pdostatement_object->execute(array("siqu",25));
            $pdostatement_object->execute(array("yang",34));

            echo "执行完成";
        ?>
    

获取数据

  • fetch()方法,PDOStatement类中的fetch()方法,可以将结果集中当前记录以某种方式返回,并将指针移向下一行,当达到末尾时返回False

image-20201031231708544

  1. 第一个参数设置

image-20201031232443676

  1. 第二个参数,可选,用来确定当对象是一个可滚动的游标时应该获取哪一行
  2. 第三个参数,可选,提供一个整数,表示要获取的行相对于当前游标位置的偏移

    PDO应用
    
        ";              
            }catch(PDOException $e){
                echo "连接失败".$e->getMessage();
            }

            #设置预处理语句
            $pdostatement_object=$pdo_object->query("SELECT * FROM user");

            while($array=$pdostatement_object->fetch(PDO::FETCH_NUM)){
                echo "id:".$array[0]."
"; echo "name:".$array[1]."
"; echo "age:".$array[2]."

"; } // 运行结果: // 连接成功 // id:1 // name:siqu // age:25 // id:2 // name:yang // age:34 ?>
  • fetchAll(),只需要调用一次,就获取所有行,返回一个二维数组

image-20201031233201580

  1. 第一个参数,与上一个函数一直
  2. 第二个参数,需要提供一个整数索引,当在fetchALL中第一个参数指定PDO::FETCH_COLUMN值时,从结果集中返回通过该参数提供的索引所指定列的所有值

    PDO应用
    
        ";              
            }catch(PDOException $e){
                echo "连接失败".$e->getMessage();
            }

            #设置预处理语句
            $pdostatement_object=$pdo_object->query("SELECT * FROM user");

            $array=$pdostatement_object->fetchAll(PDO::FETCH_NUM);

            foreach ($array as $key => $value) {
                echo "id:".$array[$key][0]."
"; echo "name:".$array[$key][1]."
"; echo "age:".$array[$key][2]."

"; } // 运行结果: // 连接成功 // id:1 // name:siqu // age:25 // id:2 // name:yang // age:34 ?>
  • setFetchModel()方法,一次性设置以上两个函数的输出模式
© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片