zoukankan      html  css  js  c++  java
  • 学习PDO啦

    通过查找资料对PDO有了一定的了解,PDO(PHP Data Object )为PHP数据对象,为PHP访问数据库提供了一个轻量级的借口,但PDO本生不能实现访问数据库的任何功能,只能通过数据库的PDO驱动来访问数据库。

    预定义与常量

    常量在编译PHP或在运行时动态载入时可用。

    PDO::FETCH_ASSOC (integer) 指定获取方式——返回关联数组

    PDO::FETCH_NUM (integer)指定获取方式——返回索引数组

    PDO::FETCH_CLASS 指定获取方式——对象的属性返回

    $stmt->fetchAll(PDO::FETCH_CLASS)

    连接与管理

    连接是通过实例PDO而建立的,也可是它的基类,构造函数参数用于指定数据库源(必填)、用户名、密码。在连接是出错误,将抛出一个PDOException异常对象,如果想处理错误状态,可以捕获异常,或者留给通过set_exception_hander()设置的应用程序全局异常处理程序。

    关闭连接可以通过设置  实例对象为 null 即可。

    <?php
    try {
        $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    
        $dbh = null;
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
    ?>

    事务与自动提交

    通过PDO数据驱动连接上数据库,可以开始事务操作。事务支持四大特性:原子性,持久性,一致性,隔离性(ACID),通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。

    事务通常是通过把一批更改“积蓄”起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。

    try {
        $pdo_obj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
        $pdo_obj->beginTransaction();
        $pdo_obj->exec("insert into test (user , age) values('wwww' ,1)");
        $pdo_obj->exec("insert into test (user , age) values('344' ,2')");
        $pdo_obj->commit();
        echo  'tansaction iS ok';
    }catch (Exception $exception){
        $pdo_obj->rollBack();
        echo "Failed: " . $exception->getMessage();
    }

    提醒一句:PDO 仅在驱动层检查是否具有事务处理能力。如果某些运行时条件意味着事务不可用,且数据库服务接受请求去启动一个事务,PDO::beginTransaction() 将仍然返回 TRUE 而且没有错误

    预处理与存储过程

    预处理语即PDOStatement,很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。预处理语句可以带来两大好处:

         查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。

         提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

    try {
        $pdo_obj = new  PDO($dsn, $user, $pass);;
        $select_sql = "select * from test ";
        $stmt = $pdo_obj->prepare($select_sql);
        $stmt->execute();
        atch(Exception $exception){
            echo "Failed: " . $exception->getMessage();
        }

    在进行拼接SQL语句时可以通过命名占位符或问号占位符,绑定一个PHP变量到预处理SQL语句中,同样也可以通过列明或列号绑定结果集中一列到PHP变量中

    $insert_sql = "insert into test (user , age) values(:user ,:age)";
    //绑定一个php变量用作预处理的SQL语句中的对应 命名占位符或问号占位符 bindValue()不支持问号占位符
    $stmt->bindParam(':user', $name);
    $stmt->bindParam(':age', $name);
     $stmt = $pdo_obj->prepare($insert_sql);
     $stmt->execute(); 
    
    //绑定结果集中一列到一个PHP变量中
     //通过列名绑定
    $stmt->bindColumn('user',$name_bind);
        //通过列好绑定
    $stmt->bindColumn(2,$age_bind);
    
    

    错误与错误处理

    PDO提供了三种不同的处理模式,以满足不同分格的开发:

    PDO::ERRMODE_SILENT 默认模式PDO只将设置的错误代码

    DO::ERRMODE_WARNING 除设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。如果只是想看看发生了什么问题且不中断应用程序的流程。

    PDO::ERRMODE_EXCEPTION 除设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息

    可以通过PDOStatement::setFetchMode(为语句设置默认的获取模式) 和 PDOStatement::setAttribute(设置语句属性)来设置错误处理模式。

    PDO查询选择

      • int  PDO::exec(string $statement) 在一个单独的函数调用中执行一条 SQL 语句,返回受此语句影响的行数。不会从一条 SELECT 语句中返回结果。
      • public  PDOStatement PDO::query(string $statement) 对于在程序中只需要发出一次的 SELECT 语句,返回一个PDOStatement object。
      • public  PDOStatement PDO::prepare(string $statement) 对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。
  • 相关阅读:
    CentOS 7部署KVM之三基本管理
    CentOS 7部署KVM之二安装配置
    CentOS 7部署KVM之一架构介绍
    DOM 事件流
    渐进增强与优雅降级
    (三)跟我一起玩Linux网络服务:DHCP服务配置之主服务器配置
    (二)跟我一起玩Linux网络服务:BIND的自动部署(附上完整的代码)
    责任链模式--行为模式
    装饰模式--- 结构型模式
    elastic-job+zookeeper实现分布式定时任务调度的使用(springboot版本)
  • 原文地址:https://www.cnblogs.com/webph/p/6528969.html
Copyright © 2011-2022 走看看