zoukankan      html  css  js  c++  java
  • PHP基础之PDO

    简介

    PDO(PHP Data Object)是指PHP数据对象,它定义了一个轻量级的一致接口来统一操作各种数据库。PDO提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。当选择不同的数据库时,只需要修改PDO的DSN(数据源)即可,有效的解决了早期PHP版本中各个数据库扩展互不兼容,维护性差,可移植性差的缺点。注意:从 PHP 5.1开始附带了PDO,在 PHP 5.0 中是作为一个 PECL 扩展使用。 PDO 需要PHP 5 核心的新 OO 特性,因此不能在较早版本的 PHP 上运行。
    

    基本使用

    创建测试数据表并且插入测试数据

     CREATE TABLE `book` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL COMMENT '书名',
      `author` varchar(15) DEFAULT NULL COMMENT '作者',
      `ptime` varchar(100) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    
    INSET INTO book VALUES(1,'php','leo',now()),(2,'mysql','lisi',now()),(3,'linux','ben',now()),(4,'apache','lily',now());
    

    连接数据库、执行SQL语句、处理结果集并且展示到模板

    <?php
    header('Content-type:text/html;charset=utf-8');
    //保存数据源基本信息
    $arr = array(
        'dbms' =>'mysql',
        'host' =>'localhost',
        'port' =>3306,
        'dbname' =>'mytest',
        'charset' =>'utf8',
        'user' =>'root',
        'pwd'=>123456
    );
    
    $dsn = "$arr[dbms]:host=$arr[host];port=$arr[port];dbname=$arr[dbname];charset=$arr[charset]";//php版本需大于5.3.6才能使用charset属性设置字符集
    try{
        //连接数据库、选择数据库
        $pdo = new PDO($dsn,$arr['user'],$arr['pwd']);
    
        //执行sql语句
        $sql ='SELECT * FROM book';
        $result = $pdo->query($sql);
    
        //定义空数组保存数据
        $info = array();
        //遍历结果集获取数据详细信息
        while ($row = $result->fetch()){
            $info[] = $row;
        }
    
    }catch (PDOException $e){
        //输出异常信息
        echo $e->getMessage().'<br>';
    }
    ?>
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <h2>书籍信息列表</h2>
    <table border="1" >
        <tr>
            <td>图书名称</td>
            <td>图书作者</td>
            <td>出版日期</td>
        </tr>
        <?php foreach ($info as $v):?>
        <tr>
            <td><?php echo $v['name'];?></td>
            <td><?php echo $v['author'];?></td>
            <td><?php echo $v['ptime'];?></td>
        </tr>
        <?php endforeach;?>
    </table>
    </body>
    </html>
    

    执行SQL语句

    PDO中提供了query()和exec()方法用于执行SQL语句,query()方法主要是用于有记录结果返回的操作,特别是SELECT操作,执行成功则返回一个PDOStatement类的对象,失败则返回false。exec()则主要针对没有结果集合返回的操作,如INSERT、UPDATE、DELETE等,它用于执行一条SQL语句并且返回执行后受影响的行数。
    

    处理结果集

    PDO中常用获取结果集的方式有三种:fetch()、fetchColumn()、fetchAll()
    
    1. PDO中的fetch()方法可以从结果集中获取下一行数据
    2. PDO中的fetchColumn()方法用于获取结果集中单独一列
    3. PDO中的fetchAll()方法用于返回一个包含结果集中所有行的数组
      具体的语法参数就不一一赘述了,可参看PHP手册。

    预处理语句

    PDO中的预处理语句机制可简单理解为SQL的一种编译过的模板,在执行时,只需在服务器和客户端之间传输有变化的数据即可,可以避免重复分析与编译,由于预处理语句实现了将SQL和数据的分离,因此可以防止SQL注入。以下代码演示预处理语句的使用
    
    <?php
    
    header("Content-type:text/html;charset=utf-8");
    try{
        //连接数据库
        $pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456');
    
        //预处理sql语句
        $stmt = $pdo->prepare("insert into `book`(`name`,`author`)VALUES (?,?)");
        //print_r($stmt);exit();
        //为占位符绑定变量
        $stmt->bindParam(1,$name);
        $stmt->bindParam(2,$author);
        
        // 第二种占位符使用方式
        // $stmt = $pdo->prepare("insert into `book`(`name`,`author`)VALUES (:name,:author)");
        // $stmt->bindParam(':name',$name);
        // $stmt->bindParam(':author',$author);
         
        //准备数据
        $data = array(
            array('php第一本教材','人民邮电出版社'),
            array('php第二本教材','人民邮电出版社'),
            array('php第三本教材','人民邮电出版社'),
            array('php第四本教材','人民邮电出版社'),
            array('php第五本教材','人民邮电出版社')
        );
        foreach ($data as $row){
            //为绑定的变量赋值
            $name = $row[0];
            $author = $row[1];
            //执行预处理语句
            $stmt->execute();
    
        }
    
    }catch (PDOException $e){
        echo $e->getMessage().'<br>';
    }
    

    占位符

    可以在SQL语句中添加占位符,当多次执行SQL语句时,只需要编译一次SQL语句,可以使用相同或不同的参数执行多次,可以节省资源。PDO支持两种占位符:问号占位符(?)和命名参数占位符(:参数名称),使用时需注意,同一条SQL语句只能选择一种占位符使用。
    

    参数绑定

    准备好预处理语句后可以使用bindParam()方法为占位符绑定变量参数,方法的第一个参数表示参数标识符,第二个参数用于表示参数标识符对应的变量名。
    

    excute()方法

    excute()方法有个可选参数,表示一个元素个数与预处理语句占位符数量一样多的数组,用于为预处理语句中的占位符赋值。当占位符为问号占位符时,需要给excute()方法传递一个索引数组参数,反之,当占位符为命名参数占位符时传入一个关联数组参数
    

    错误处理

    PDO错误处理机制提供了三种方案,通过设置"PDO::ATTR_ERRMODE"的值来进行不同的处理。下面分别阐述:
    
    1. PDO错误处理默认模式
      "PDO::ERRMODE_SILENT"为PDO默认的错误处理模式。在发生错误时不进行任何操作,只简单设置错误代码,可以通过PDO提供的errorCode()和errorInfo()这两个方法对语句和数据库对象进行排查。
    2. PDO错误处理WARNING模式
      如果想要查看发生了什么问题且不中断应用程序的流程,可以将PDO的错误模式设置为"PDO::ERRMODE_WARNING",当错误发生时,除了设置错误代码外,PDO还会发出一条E_WARNING信息。
    3. PDO错误处理EXCEPTION模式
      "PDO::ERRMODE_EXCEPTION"表示进行错误异常处理,可以在PDO执行SQL语句错误时,使用try...catch捕捉到PDOException异常。代码如下:
    <?php
    
    header("Content-type:text/html;charset=utf-8");
    try{
        //1.连接数据库
        $pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456');
    
        //2.设置错误处理
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_SILENT);
    
        //3.预处理SQL语句
        $stmt = $pdo->prepare('select * from books');
    
        //4.执行预处理语句
        $stmt->execute();
        echo"well-done!";
    
        //5.获取错误码
        $code = $stmt->errorCode();
    
        //6.判断执行错误
        if (!empty($code)){
            echo"<br>$code<br>";
            print_r($stmt->errorInfo());
        }
    }catch (PDOException $e){
        echo  $e->getMessage().'<br>';
    }
    

    事务处理

    PDO提供了事务处理机制,对于MySQL数据库来说支持事务的数据引擎有InnoDB和BDB两种。有三个PDO方法可以完成事务任务:beginTransaction()、commit()和rollBack()。测试代码如下:
    
    <?php
    
        header("Content-type:text/html;charset=utf-8");
        //1.连接数据库
        $pdo = new PDO('mysql:host=localhost;dbname=mytest;charset=utf8','root','123456');
        $pdo->exec('set names utf8');
        //2.设置错误处理
        $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
        //3.开启事务
        $pdo->beginTransaction();
    try{
        
        //一次操作
        $sql = "delete from book where id=3";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        
        //一次操作
        $sql = "delete from book where id=4";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        
        //一次操作
        $sql = "delete from book where id=5";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
         
        //提交
        $pdo->commit();
    }catch (PDOException $e){
        echo  $e->getMessage().'<br>';
        //回滚
        $pdo->rollBack();
    }
    
  • 相关阅读:
    redis的几种模式
    redis ,memcache的对比
    忍龙sigma 不升级武器.图书馆百人斩包爽无脑操作攻略
    浏览器刷新或者关闭事件监听 beforeunload pagehide
    Element-Ui实现分页table缓存勾中数据
    [转载]Localtunnel使您可以轻松地在本地开发计算机上共享Web服务,而不会弄乱DNS和防火墙设置。
    cmder 分成四屏
    P3709 大爷的字符串题(莫队+离散化)
    P3604 美好的每一天(莫队+前缀和)
    P4462 [CQOI2018]异或序列(莫队+前缀和)
  • 原文地址:https://www.cnblogs.com/weblm/p/6006215.html
Copyright © 2011-2022 走看看