• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • PDOStatement::errorInfo()

    (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

    获取跟上一次语句句柄操作相关的扩展错误信息

    说明

    PDOStatement::errorInfo(void): array

    返回值

    PDOStatement::errorInfo()返回一个关于上一次语句句柄执行操作的错误信息的数组。该数组包含下列字段:

    ElementInformation
    0SQLSTATE 错误码(一个由5个字母或数字组成的在 ANSI SQL 标准中定义的标识符)。
    1具体驱动错误码。
    2具体驱动错误信息。

    范例

    显示连接到DB2数据库的 PDO_ODBC 连接的 errorInfo()的字段

    <?php
    /* 激发一个错误 --  BONES 数据表不存在 */
    $sth = $dbh->prepare('SELECT skull FROM bones');
    $sth->execute();
    echo "\nPDOStatement::errorInfo():\n";
    $arr = $sth->errorInfo();
    print_r($arr);
    ?>
    

    以上例程会输出:

    PDOStatement::errorInfo():
    Array
    (
        [0] => 42S02
        [1] => -204
        [2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N  "DANIELS.BONES" is an undefined name.  SQLSTATE=42704
    )
    

    参见

    • PDO::errorCode() 获取跟数据库句柄上一次操作相关的 SQLSTATE
    • PDO::errorInfo() Fetch extended error information associated with the last operation on the database handle
    • PDOStatement::errorCode() 获取跟上一次语句句柄操作相关的 SQLSTATE
    If your query is successful, PDO::errorInfo() still returns an array. For MySQL 5.x, I get the following...
    Array
    (
      [0] => 00000
      [1] => 
      [2] => 
    )
    Seriously errorInfo is your friend. Use it.
    If these look like your google searches then you need errorInfo
    "no database error showing in php"
    "pdo selects from database but wont insert"
    "pdo insert not working"
    "isnt pdo just a big hype, should I go back to mysql?"
    "how much do surgeons make?"
    Trust me it will definitely save you hours of insanity if you make it a habit to use it in development. Forget E-ALL, it failed me since well, E-ALL apparently doesn't know that I didn't set a default value in my MySQL table and my query wasnt adding anything to it. So always do this
    <?php
      $sql = 'do something on a mysql table where foo = :bar';
      $stmt = prepare($sql);
      $stmt->bindValue(':bar', $foo, PDO::PARAM_[DATA TYPE]);
      $stmt->execute(); 
      
      // very important during development. But take it off in production 
      $foo_arr = $stmt->errorInfo(); 
      print_r($foo_arr);
      //Sample print_r return
      /*
      Array(
        [0] => HY000
        [1] => 1364
        [2] => Field 'phone' doesn't have a default value
      )
      Never have I been so happy to see an error
      */
    ?>
    While its common practice for any decent developer to always watch out and try to catch for errors, even the best of us make mistakes. This is not a replacement for exceptions, but the simplicity is priceless.
    Ansi sql state Error codes can be found here:
    https://docs.oracle.com/cd/F49540_01/DOC/server.815/a58231/appd.htm
    Sorry, my example below is not correct, this is a correction:
    <?php
    $listOfUsers = $db->query('SELECT name from uesrs');
    $errorInfo = $listOfUsers->errorInfo();
    if($errorInfo[0] != 0)
      die($errorInfo[2]);
    ?>