zoukankan      html  css  js  c++  java
  • php---PDO使用及总结

    再使用php进行原生框架搭建的过程中,发现即使sql语句错误,php的pdo是不会报错的,非常奇怪

    然后研究了下,发现原来pdo默认是不报错的,想要报错就要满足两个条件:

    1、需要将错误处理模式变成异常模式

      $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

    2、所有可能出错的语句都必须进行捕捉

      try{

        //code

      }catch(PDOExecption $e){

        //错误信息处理

      }

    总结:

    pdo使用:

    $pdo=new PDO("mysql:host=localhost;dbname=kong","root","");                        
    $pdo->query();//执行的是select语句,返回值是PDOStatement对象。   
    $pdo->fetchAll(PDO::FETCH_ASSOC);//通过一次调用返回全部结果,并以数组方式保存 $pdo->exec();//执行的是返回值为intl的sql语句:增加,修改,删除 
    $pdo->exective();//执行的是预处理语句 /*设置字符集 */
    $pdo->query("set names utf8");

    另外,在使用pdo返回数据的时候,如果不设置,返回的数据会出现问题。如明明是int类型,返回的确实string

    解决:

    $options = [
                    PDO::ATTR_EMULATE_PREPARES => false,
                    PDO::ATTR_STRINGIFY_FETCHES => false
                ];
                static::$pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password, $options);

      PDO::ATTR_STRINGIFY_FETCHES: 提取的时候将数值转换为字符串。 需要 bool 类型。
      PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO总是模拟预处理语句(如果为 TRUE ),或试着使用本地预处理语句(如果为 FALSE)。如果驱动不能成功预处理当前查询,它将总是回到模拟预处理语句上。 需要 bool 类型。

    注意:修改完,若发现还不起作用,是因为你用的是老的驱动php5-mysql,你应该换成php5-mysqlnd。

    常用属性及使用方式:

    设置PDO在处理数据过程中的处理方式:

      PDO::setAttribute:设置属性

      PDO::getAttribute:获取属性

    PDO::ATTR_CASE:当pdo从结果集中获取数据的时候,如何处理对应的字段的名字

      PDO::CASE_LOWER:将所有字段都小写显示

      PDO::CASE_UPPER:所有字段都大写显示

      PDO::CASE_NATURAL:原本怎么样就怎么样

        $pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_NATURAL);
        //或 $pdo->setAttribute(PDO::ATTR_CASE,1);
        var_dump(PDO::CASE_UPPER);      //1 转换为大写
        var_dump(PDO::CASE_LOWER);      //2 转换为小写
        var_dump(PDO::CASE_NATURAL);    //0 是怎样就是怎样
        $sql = "select * from user ";
        $stmt = $pdo->query($sql);
        var_dump($stmt->fetch(PDO::FETCH_ASSOC));

    PDO::ATTR_AUTOCOMMIT:设置当前连接Mysql服务器的客户端的SQL语句是否自动执行,默认是自动提交

    //自动提交属性
    var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT));    //1
    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
    var_dump($pdo->getAttribute(PDO::ATTR_AUTOCOMMIT));  //0

    PDO::ATTR_ERRMODE:错误模式,当pdo出现错误的时候到底使用哪种模式进行处理,会内部自己抛出异常,终断页面

       PDO::ERRMODE_SILENT:静默模式,默认的出错了不管

       PDO::ERRMODE_WARNING:警告模式,如果出错了就会报出警告

       PDO::ERRMODE_EXCEPTION:异常模式,如果出错会采用异常来处理(PDOException)

    var_dump($pdo->getAttribute(PDO::ATTR_ERRMODE));
    var_dump(PDO::ERRMODE_SILENT);        //0 静默模式,默认的出错了不管
    var_dump(PDO::ERRMODE_WARNING);        //1 警告模式,如果出错了就会报出警告
    var_dump(PDO::ERRMODE_EXCEPTION);    //2 异常模式,如果出错会采用异常来处理(PDOException)

    PDO::ATTR_PERSISTENT:当前对Mysql服务器的连接是否是长连接

    TRUE:是长连接(长连接的使用必须要配合:Apache(connection:keepAlive),Mysqld)

    FALSE:默认的,非长连接

    什么情况下使用长连接?

    1. 不同的脚本的执行间距非常短,同时每个脚本都要操作数据库(Mysql:mysql_pconnect()

  • 相关阅读:
    网络IO
    进程与线程
    计算机网络
    操作系统
    刷题笔记
    fasd
    线程池
    epoll反应堆
    read函数
    dup与dup2
  • 原文地址:https://www.cnblogs.com/two-bees/p/10917048.html
Copyright © 2011-2022 走看看