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()

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/two-bees/p/10917048.html
Copyright © 2011-2022 走看看