zoukankan      html  css  js  c++  java
  • PDO 用法学习

    PDO 用法学习

    PDO: php data object
    数据库访问抽象层

    基于驱动:
    1、安装扩展 php_pdo.dll
    2、安装驱动 php_pdo_mysql.dll

    linux 编译时参数:--with-pdo=mysql=/usr/local/mysql

    三个类:
    PDO类, 数据库连接有关(连接、执行sql)
    PDOStatement 准备语句,处理结果集
    PDOException 异常处理类
    一些常量

    相比mysqli方法少,常量多

    dsn:data source name(数据源)
    #部分参数可以省略,参数没有顺序
    mysql: #最短 会自动调取 php.in 中 mysql.default_host 参数信息

    dsn示例:

    mysql:host=localhost;port=3307;dbname=testdb
    mysql:unix_socket=/tmp/mysql.sock;dbname=testdb

    获取pdo对象

    $dsn = "mysql:host=127.0.0.1;port=3306;dbname=test";
    $opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0 #关闭自动提交, PDO::ATTR_TIMEOUT => 3 #设置超时时间);
    $pdo = new PDO($dsn, 'root', '', $opts);
    ee($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)); // setAttribute 可以设置属性
     

    执行sql exec() query() perpare();
    1、返回 PDOStatement 对象 query select #PDOStatement是专门用来处理结果集的
    2、返回影响行数(int) exec insert delete update

    PDO::ERRMODE_SILENT(0) :默认 不提示任何错误
    PDO::ERRMODE_WARNING(1) : 警告
    PDO::ERRMODE_EXCEPTION(2):异常(推荐使用) 用try catch捕获,也可以手动抛出异常 new PDOException($message, $code, $previous)

    复制代码
    #exec用法
    try {
        $sql = "insert into limove(`id`, `name`, `order`) values(null, 'sjk', 1)";
        $rows = $pdo->exec($sql);  //影响的条数
        $pdo->lastInsertId(); //最后插入的id
    } catch (Exception $e) {
        ee($pdo->errorInfo());
    }
    复制代码

    预处理语句(prepare)示例

    复制代码
    $dsn = "mysql:host=127.0.0.1;port=3306;dbname=test";
    $opts = array(PDO::ATTR_AUTOCOMMIT=>0, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_AUTOCOMMIT=>0);
    try {
        $pdo = new PDO($dsn, 'root', '', $opts);
    }catch(PDOException $e){
        echo $e->getMessage();
    }
    
    
    /* pdo中有两种占位符号
     *
    *  ? 参数             --- 索引数组, 按索引顺序使用
    *  名子参数           ----关联数组, 按名称使用,和顺序无关
    */
    
    
    //准备好了一条语句,并入到服务器端,也已经编译过来了,就差为它分配数据过来
    //同样适用于更新操作
    $stmt=$pdo->prepare("insert into limove(`name`, `order`) values(:name,:order)");
    
    //绑定参数,引用方式传递
    $stmt->bindParam(":name", $name);
    $stmt->bindParam(":order", $order);
    
    
    // $stmt=$pdo->prepare("insert into limove(`name`, `order`) values(?, ?)"); //所有SQL都可执行
    
    // //绑定参数,引用方式传递
    // $stmt->bindParam(1, $name, PDO::PARAM_STR);
    // $stmt->bindParam(2, $order, PDO::PARAM_INT);
    
    
    $name="wwww";
    $order = 1;
    
    if($stmt->execute()){
        echo "执行成功";
        echo "最后插入的ID:".$pdo->lastInsertId();
    }else{
        echo "执行失败!";
    }
    复制代码

    还支持执行时绑定

    复制代码
        #无序方式
        $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(:name,:price, :num, :desn)"); 
        $stmt->execute(array(":price"=>77, ":name"=>"kkk3", ":num"=>"453", ":desn"=>"aaaaaa3"));
    
        #有序方式
        $stmt=$pdo->prepare("insert into shops(name, price, num, desn) values(?, ?, ?, ?)"); //所有SQL都可执行
        $stmt->execute(array("myname1", 11.2, 55, "very good"));
    复制代码

    获取结果

    复制代码
    //获取结果
    $stmt = $pdo->prepare("select * from limove where `order` = :order");
    $stmt->execute(array(':order'=>8));
    
    //设置获取的方式
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    
    $data = array();
    
    //方式1
    //$data = $stmt->fetchAll();
    
    //方式2
    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
        $data[] = $row;
    }
    ee($data);
    复制代码
    //bindColumn 把取出的值绑定到一个变量上
    $stmt->bindColumn('name', $name);
    #所有的条数,select insert delete update
    $stmp->rowCount();

    事务举例:

    复制代码
    <?php
        try{
            $pdo=new PDO("mysql:host=localhost;dbname=xsphpdb", "root", "123456", array(PDO::ATTR_AUTOCOMMIT=>0)); #一定要关闭自动提交
            $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION); #开启异常模式
        }catch(PDOException $e){
            echo "数据库连接失败:".$e->getMessage();
            exit;
        }
    
        //执行SQL语句 exec() query()  prepare()
        //一是有结果集的query(), 执行select语句
        //exec()用来执行有影响行数的,update, delete insert, other
        //exec()返回的是影响的行数
        /*
         *
         * 事务处理
         *
         *   张三从李四那里买了一台 2000 元的电脑
         *
         *     从张三帐号中扣出 2000元
         *
         *     向李四账号中加入 2000元
         *
         *     从商品表中减少一台电脑
         *
         *     MyIsAM  InnoDB
         *
         */
    
        try{
            $pdo->beginTransaction();
            
            $price=500;
    
            $sql="update zhanghao set price=price-{$price} where id=1";
    
            $affected_rows=$pdo->exec($sql);
    
            if(!$affected_rows)
                throw new PDOException("张三转出失败");
    
            $sql="update zhanghao set price=price+{$price} where id=3";
    
    
            $affected_rows=$pdo->exec($sql);
                
            if(!$affected_rows) #发现问题手动抛出异常
                throw new PDOException("向李四转入失败");
    
            echo "交易成功!";
            $pdo->commit();
        }catch(PDOException $e){
            echo $e->getMessage();
            $pdo->rollback(); //只要捕获异常则回滚
        }
        
        //不管执行成功还是失败最后都要在关闭自动提交
        $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
        
        //设置错误报告模式 ERRMODE_SILENT    ERRMODE_WARNING
  • 相关阅读:
    机器学习笔记[保持更新]
    习题 7-3 uva211
    习题 7-2 uva225(回溯)
    习题7-1 uva 208(剪枝)
    poj2331 (IDA*)
    poj2449 (第k条最短路)
    POJ 1324(BFS + 状态压缩)
    hdu3567 八数码(搜索)--预处理
    poj 1367 robot(搜索)
    例 7-10 uva12212(迭代加深搜索)
  • 原文地址:https://www.cnblogs.com/alex-13/p/4302697.html
Copyright © 2011-2022 走看看