青风百里

PHP PDO(二次学习)
一.PDO是什么?PDO是PHP Date ObjectPDO主要用来代替数据库操作类PHP同时可以操作多个数据库...
扫描右侧二维码阅读全文
29
2018/09

PHP PDO(二次学习)

一.PDO是什么?

  • PDO是PHP Date Object
  • PDO主要用来代替数据库操作类
  • PHP同时可以操作多个数据库,每个数据库都要建立一个类,比较麻烦,所以产生了PDO

二.PDO连接MySQL

    • 语法PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
    • $dsn 数据源名称,包含了连接数据库的基本信息;格式 $dsn = "dbtype:host=主机名;port=端口号;dbname=数据库名;charset=字符集"
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    var_dump($pdo);

    • object(PDO)#1 (0) { } 结果中的0表示该对象没有成员属性

    三.PDO对象常用方法

    exec()

    • 描述:执行一条 SQL 语句(可以执行增删改语句),并返回受影响的行数
    • 语法:int PDO::exec ( string $statement )
    • 注意:如果执行select语句,则返回0
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "INSERT INTO `user` (sex, age) VALUES ('男', 25)";
    $records = $pdo->exec($sql);
    echo "插入了{$records}条记录";

    query()

    • 描述:Executes an SQL statement(执行select show语句), returning a result set as a PDOStatement object
    • 语法:

      • public PDOStatement PDO::query ( string $statement )
      • public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_COLUMN , int $colno )
      • public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_CLASS , string $classname , array $ctorargs )
      • public PDOStatement PDO::query ( string $statement , int $PDO::FETCH_INTO , object $object )
    • 关于PDOStatement对象见下图
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT * FROM user";
    $PDOStatement = $pdo->query($sql);
    foreach ($PDOStatement as $rows){
        print_r($rows);
    }

    lastInsertId()

    • 描述:返回最后插入行的ID或序列值
    • 语法:string PDO::lastInsertId ([ string $name = NULL ] )
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "INSERT INTO `user` VALUES (null, '女', 90)";
    $pdo->exec($sql);
    echo "最后插入的行的id为{$pdo->lastInsertId()}";

    setAttribute

    • 描述:设置属性
    • 语法:bool PDO::setAttribute ( int $attribute , mixed $value )
    • 列举一些属性

      • PDO::ATTR_CASE:强制列名为指定的大小写

        • PDO::CASE_LOWER:强制列名小写。
        • PDO::CASE_NATURAL:保留数据库驱动返回的列名。
        • PDO::CASE_UPPER:强制列名大写
      • PDO::ATTR_DEFAULT_FETCH_MODE: 设置默认的提取模式

        • PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组
        • PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组
        • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
      • PDO::ATTR_ERRMODE:错误报告。

        • PDO::ERRMODE_SILENT: 仅设置错误代码。
        • PDO::ERRMODE_WARNING: 引发 E_WARNING 错误
        • PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。
    • 将结果集设置成关联数组,看代码
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $sql = "SELECT * FROM `user`";
    $PDOStatement = $pdo->query($sql);
    foreach ($PDOStatement as $rows){
        print_r($rows);
    }

    四.PODStatement结果集对象常用方法

    • 执行query()方法就会放回结果集对象

    fetch()

    • 描述:从结果集中获取一行数据,将指针下移
    • 语法:mixed PDOStatement::fetch ([ int $fetch_style])
    • 参数:三个常量

      • PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组
      • PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组
      • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
    • 默认提取方式,两种都有
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT * FROM `user`";
    $PDOStatement = $pdo->query($sql);
    $row = $PDOStatement->fetch();
    //$row = $PDOStatement->fetch(PDO::FETCH_ASSOC);设置获取方式为关联数组
    //$row = $PDOStatement->fetch(PDO::FETCH_NUM);设置获取方式为索引数组
    print_r($row);

    fetchAll()

    • 取到一个多维数组,类似fetch(),不多说了
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT * FROM `user`";
    $PDOStatement = $pdo->query($sql);
    $rows = $PDOStatement->fetchAll();
    print_r($rows);

    fetchColumn()

    • 描述:从结果集中返回单独的一列,每次只能取一个
    • 语法:string PDOStatement::fetchColumn ([ int $column_number = 0 ] )
    • 参数: $column_number是列的索引值,默认为0
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT count(`id`),count(`age`) FROM `user`";
    $PDOStatement = $pdo->query($sql);
    $record = $PDOStatement->fetchColumn(0);
    echo "共有{$record}个id记录<br>";

    rowCount()

    • 描述:返回受上一个 SQL 语句影响的行数
    • 语法:int PDOStatement::rowCount ( void )
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT * FROM `user`";
    $PDOStatement = $pdo->query($sql);
    $record = $PDOStatement->rowCount(0);
    echo "共有{$record}个记录<br>";

    五.PDO错误处理模式

    • PDO的错误报告模式有三种:静默模式,警告模式,异常模式;默认是静默模式
    • 静默模式(silent):当PDO执行SQL语句有错时,不显示任何错误,不推荐使用
    • 警告模式(warning):当PDO执行SQL语句有错时,按照PHP的错误等级来报告,不推荐使用
    • 异常模式(exception):当PDO执行SQL语句有错时,先抛出异常,再捕获异常
    • 怎么设置还记得吗?上面提到的PDO对象中的setAttribute()方法,参数如下

      • PDO::ATTR_ERRMODE:错误报告。

        • PDO::ERRMODE_SILENT: 仅设置错误代码。
        • PDO::ERRMODE_WARNING: 引发 E_WARNING 错误
        • PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。

    静默模式

    • 不会显示任何错误信息
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT * FROM `user` WHERE id = abc";
    $PDOStatement = $pdo->query($sql);
    • 获取错误信息的函数:PDO::errorCode()和PDOerrorCode()和PDOStatement
    • PDO.png" class="emotion-errorinfo(),调用的时候要用对象来调用,不是静态方法;但是如果没有结果集对象,就不可以使用PDOStatement来调用这两个方法
    • 这两个函数PDO对象里有,PDOStatement结果集对象中也有,所以用哪一个都可以
    • 注意">errorinfo(),获取错误描述信息
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $sql = "SELECT * FROM `user` WHERE id = abc";
    $PDOStatement = $pdo->query($sql);
    echo "错误态码为:{$pdo->errorCode()}<br>";
    echo "错误描述信息为:";
    echo "<pre>";
    print_r($pdo->errorInfo());
    echo "</pre>";

    警告模式

    • 需要人为的先设置错误的报告模式,这种模式,警告信息直接输出到网页上,这种方式不好,不推荐使用
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    $sql = "SELECT * FROM `user` WHERE id = abc";
    $PDOStatement = $pdo->query($sql);

    异常模式

    • 先把PDO异常类拿出来看看
    PDOException extends RuntimeException {
    /* 属性 */
    public array $errorInfo ;
    protected string $message ;
    protected string $code ;
    /* 继承的方法 */
    final public string Exception::getMessage ( void )
    final public Exception Exception::getPrevious ( void )
    final public int Exception::getCode ( void )
    final public string Exception::getFile ( void )
    final public int Exception::getLine ( void )
    final public array Exception::getTrace ( void )
    final public string Exception::getTraceAsString ( void )
    public string Exception::__toString ( void )
    final private void Exception::__clone ( void )
    }
    • 需要人为的先设置错误的报告模式
    <?php
    $dsn = "mysql:host=127.0.0.1;dbname=student;charset=utf8";
    $username = "root";
    $password = "";
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    try {
        $sql = "SELECT * FROM `user` WHERE id = abc";
        $PDOStatement = $pdo->query($sql);
    }catch (PDOException $e){
        echo "错误行号:".$e->getLine();
        echo "<br>错误文件:".$e->getFile();
        echo "<br>错误状态码:".$e->getCode();
        echo "<br>错误信息:".$e->getMessage();
    }

    Last modification:September 30th, 2018 at 06:59 pm

    Leave a Comment