【问题标题】:How to view query error in PDO PHP如何在 PDO PHP 中查看查询错误
【发布时间】:2012-02-05 06:36:02
【问题描述】:
try {
    $db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW);
    $st = $db->prepare("SELECT * FROM c6ode");
}
catch (PDOException $e){
    echo $e->getMessage();
}

在上述情况下,如何检查查询的 mysql 错误?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    您需要将错误模式属性 PDO::ATTR_ERRMODE 设置为 PDO::ERRMODE_EXCEPTION。
    由于您希望prepare() 方法抛出异常,您应该禁用PDO::ATTR_EMULATE_PREPARES* 功能。否则 MySQL 服务器在执行之前不会“看到”该语句。

    <?php
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    
        $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)');
    }
    catch(Exception $e) {
        echo 'Exception -> ';
        var_dump($e->getMessage());
    }
    

    打印(以我为例)

    Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 
    1146 Table 'test.doesnotexist' doesn't exist"
    

    http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/
    EMULATE_PREPARES=true 现在似乎是 pdo_mysql 驱动程序的默认设置。 从那时起,查询缓存的事情已经修复/更改,并且使用 mysqlnd 驱动程序我对 EMULATE_PREPARES=false 没有任何问题(虽然我只是一个 php 爱好者,但不要相信我的话......)

    *) 然后是PDO::MYSQL_ATTR_DIRECT_QUERY - 我必须承认我不了解这两个属性的交互(还没有?),所以我将它们都设置了,比如

    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
        PDO::ATTR_EMULATE_PREPARES=>false,
        PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
    ));
    

    【讨论】:

      【解决方案2】:

      我使用这个没有任何额外的设置:

      if (!$st->execute()) {
          print_r($st->errorInfo());
      }
      

      【讨论】:

      • 8 年后仍然是最佳答案
      • 适合 2021 年
      【解决方案3】:

      我猜你的抱怨是异常没有触发。 PDO 很可能配置为不引发异常。启用它们:

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

      【讨论】:

      • 不行还是不行,我知道我的查询是错误的,但我想显示那个错误。
      • 您可能会发现调用new PDO(... 本身存在错误。尝试通过设置例如 error_reporting(E_ALL) 来提高 error_reporting 的级别。
      【解决方案4】:

      在测试时查看错误的快速方法:

      $error= $st->errorInfo();
      echo $error[2];
      

      【讨论】:

      • 我觉得这个方法很简单
      【解决方案5】:

      /*引发错误——BONES表不存在*/

      $sth = $dbh->prepare('SELECT skull FROM bones');
      $sth->execute();
      
      echo "\nPDOStatement::errorInfo():\n";
      $arr = $sth->errorInfo();
      print_r($arr);
      

      输出

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

      【讨论】:

      • 未捕获错误:调用未定义函数errorInfo()
      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多