zoukankan      html  css  js  c++  java
  • PHP PDO学习小结

    1、PDO概述

    PDO(PHP Data Object),是一种以纯面向对象方式实现的数据库操作扩展。

    PDO库中有3个类:PDO、PDOStatement、PDOException

    PDO常用方法:

    • PDO::__construct() :实例化PDO对象
    • PDO::exec():SQL写操作,返回影响行数
    • PDO::query():SQL读操作,返回PDOStatement类对象(结果集)
    • PDO::errorCode()、PDO::errorInfo():获取错误编码和错误描述信息
    • PDO::lastInsertId()获取插入操作的最后一个id

    2、PDO实例化对象

    PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

    • dsn:包含了请求连接到数据库基本信息的字符串:$dsn='mysql:host=localhost;port=3306;dbname=demo';
    • username:用户名
    • password:密码
    • drivers:PDO属性设置,是关联数组,利用PDO内部常量进行设置,一般不用设置
    new PDO('mysql:host=localhost;port=3306;dbname=demo','root','root');

    3、SQL语句执行和出错判定

    $dsn = 'mysql:host=localhost;port=3306;dbname=demo';
    $user = 'root';
    $password = 'root';
    
    $pdo = new PDO($dsn, $user, $password);
    echo '<pre>';
    $sql = "set names utf8";
    $row = $pdo->exec($sql);
    var_dump($row);
    if($row === false){   //因为$row可能为0,故要判断全等
        die("SQL Error: {$pdo->errorCode()} {$pdo->errorInfo()[2]}");
    }
    
    $sql = 'select * from students';
    $stmt = $pdo->query($sql) or die("SQL Error: {$pdo->errorCode()} {$pdo->errorInfo()[2]}");
    var_dump($stmt);

    4、数据库查询结果集处理

    获取结果集下一行:
    mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

    获取结果集所有行:

    array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] )

    fetch_style:控制下一行如何返回给调用者,下面是fetch_style的部分取值

    • PDO::FETCH_ASSOC:返回一个索引为结果集列名的数组
    • PDO::FETCH_BOTH(默认):返回一个索引为结果集列名和以0开始的列号的数组
    • PDO::FETCH_NUM:返回一个索引为以0开始的结果集列号的数组
    • PDO::FETCH_OBJ:返回一个属性名对应结果集列名的匿名对象 
    function pdo_fatch($stmt,$all = true){
        if($all){
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }else{
            return $stmt->fetch(PDO::FETCH_ASSOC);
        }
    }

    5、PDO事务

    事务:一种原子操作,批量执行多条命令,只有每一条命令都成功执行才能提交结果,否则回滚结果;

    • PDO::beginTransaction():开启事务
    • PDO::exex():执行事务
    • PDO::rollBack():回滚所有操作
    • PDO::commit():提交事务执行结果
    $dsn = 'mysql:host=localhost;port=3306;dbname=demo';
    $user = 'root';
    $password = 'chz';
    $pdo = new PDO($dsn, $user, $password);
    
    $pdo->beginTransaction() or die('开启事务失败!');
    $pdo->exec("insert into students values(null,'tst1',23)");
    //设置回滚点
    $pdo->exec('savepoint sp1');
    $pdo->exec("insert into students values(null,'tst2',32)");
    $pdo->exec('rollback to sp1');
    
    $pdo->commit();
    //$pdo->rollback();

    也可以直接使用底层SQL语句实现事务

    $pdo->exec('start transaction');  //开启事务
    $pdo->exec('commit');               //提交事务
    $pdo->exec('rollback');              //回滚事务

    6、PDO错误机制

    PDO提供3种错误机制,是通过PDO常量PDO::ATTR_ERRMODE来选择的

    • PDO::ERRMODE_SILENT:静默模式,不处理出错(默认模式)
    • PDO::ERRMODE_WARNING:警告模式,出错后给出错误提示
    • PDO::ERRMODE_EXCEPTION:异常模式,出错后交给PDOException对象处理

    PDO::setAttribute()函数可以设置错误处理机制

    $dsn = 'mysql:host=localhost;port=3306;dbname=demo';
    $user = 'root';
    $password = 'chz';
    $pdo = new PDO($dsn, $user, $password);
    $pdo->exec("set names utf8");
    //使用默认模式
    $sql = "insert int students values()";
    $pdo->exec($sql);       //不会报错
    //切换到警告模式
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
    $sql = "insert int students values()";
    $pdo->exec($sql);       //给出警告Fatal error: Uncaught PDOException: SQLSTATE[42000]
    //切换到异常模式
    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $sql = "insert int students values()";
    try{
        $pdo->exec($sql);       
    }catch(PDOException $e){
        die("代码运行错误:file:{$e->getFile()} line {$e->getLine()} {$e->getMessage()}"); //异常处理
    }

    此外也可以在PDO实例化时提供第四个参数设定错误处理模式,数据库连接时也应该进行异常处理:

    $dsn = 'mysql:host=localhost;port=3306;dbname=demo';
    $user = 'root';
    $password = 'chz';
    $drivers = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );
    try{
        $pdo = new PDO($dsn, $user, $password, $drivers);
    }catch(PDOException $e){
        die("数据库连接失败!{$e->getMessage()}");
    }
    $sql = "set names utf8";
    try{
        $pdo->exec($sql);       
    }catch(PDOException $e){
        die("代码运行错误:file:{$e->getFile()} line {$e->getLine()} {$e->getMessage()}");
    }

    7、PDO预处理

    常用函数:

    • PDO::prepare():发送预处理指令,只需提供sql语句,不需要prepare 预处理名字 from,成功返回PDOStstement对象
    • PDOStatement::bindParam():绑定参数,只能绑定变量(引用传递)
    • PDOStatement::bindValue():绑定参数值(值传递)
    • bool PDOStatement::execute():执行预处理,也可以绑定参数值

    占位符:使用mysql原生占位符问号(?)或使用PDO特定预处理参数指令冒号加参数名(:name)

    //使用问号占位符占位
    $pre_sql = "select * from students where id=?";
    $stmt = $pdo->prepare($pre_sql);
    $stmt->bindValue(1,20);     //1表示第一个占位符,20是占位符取值
    $stmt->execute();
    print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    
    //execute函数使用索引数组绑定参数
    $stmt->execute(array(22));
    print_r($stmt->fetchAll(PDO::FETCH_ASSOC)); 
    
    //使用冒号加参数名占位
    $pre_sql = "select * from students where age between :min and :max";
    $stmt = $pdo->prepare($pre_sql);
    //值传递绑定参数方式
    $min = 2;  $max = 4;
    $stmt->bindValue(':min',$min);
    $stmt->bindValue(':max',$max);
    for($i = 0; $i < 3; $i++){
        $stmt->execute();
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC)); //每次执行结果都一样
        $min += 2;  $max += 2;
    }
    //引用传递绑定参数方式
    $min = 2;  $max = 4;
    $stmt->bindParam(':min',$min);
    $stmt->bindParam(':max',$max);
    for($i = 0; $i < 3; $i++){
        $stmt->execute();
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC)); //每次执行结果会根据$min和$max变化而变化
        $min += 2;  $max += 2;
    }
    
    //execute函数使用关联数组绑定参数
    $stmt->execute(array(':min'=>3,':max'=>6));
    print_r($stmt->fetchAll(PDO::FETCH_ASSOC)); 
  • 相关阅读:
    使用库项目实现Android程序代码的复用 java程序员
    编译触摸tslib出错:libtool: link: only absolute runpaths are allowed java程序员
    Linux下的TFTP软件的安装设置(TQ210)ubuntu11.10 java程序员
    拥有超过1200个PNG格式图标的免费图标集 Cosmo Mini java程序员
    Android Develop Training中文翻译06《Starting Another Activity》 java程序员
    周记二
    周记三
    周记
    周记
    周记
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10400073.html
Copyright © 2011-2022 走看看