【问题标题】:PHP PDOException not catchingPHP PDOException 未捕获
【发布时间】:2018-03-03 23:32:41
【问题描述】:

我需要一些关于 PDO 错误处理的指导。

我得到了这个代码:

<?php
$config = include('config.php');

try{
    $handler = new PDO('mysql:host-127.0.0.1;dbname=not_a_valid_dbname', $config->username, $config->password);
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Yup!';
}catch(PDOException $e){
    echo 'Caught! '.$e->getMessage();
}

如您所见,我提供了一个无效的数据库名称。此页面输出“是的!”而不是让我知道没有这样的数据库。更改 'mysql:not_valid_host' 时也是如此。只有当我更改驱动程序名称时,它才会引发错误,让我知道没有该名称的驱动程序。

我试过了:

检查 php.ini 中的设置(我很难解决这个问题)

添加

error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("display_startup_errors", 1);

添加

ini_set('display_errors',true);

还尝试在 catch 参数中添加反斜杠:

catch(\PDOException $e)

还是一样的结果。帮我破解我的代码:D

【问题讨论】:

    标签: php pdo error-handling


    【解决方案1】:

    文档很不清楚,但我做了一些测试并得出了一些结论。 纯属猜测。如果我找到更多信息,我会尝试支持其中的一些说法。

    • 如果host 不存在,则假定localhost
    • 数据库名称不是强制性的。我想,这样您就可以通过PDO 连接到服务器并创建一个新数据库。
    • 如果出现语法错误,此后将不再考虑该字符串。

    有了这些假设,我们就可以假设您的代码为什么会这样工作。您的 DSN 是:

    mysql:host-127.0.0.1;dbname=not_a_valid_dbname
    

    由于存在语法错误(host 之后的-),因此没有考虑任何参数,也没有选择 DB,hostlocalhost。这就是为什么你没有错误。但是,如果您删除了host 参数:

    mysql:dbname=not_a_valid_dbname
    

    localhost被用作主机(默认选中),但not_a_valid_dbname被尝试作为数据库,结果

    抓住了! SQLSTATE[HY000] [1049] 未知数据库'1234'

    mysql:not_valid_host 与第一个示例的情况相同。 DSN 无效,因此假定 localhost 未选择任何数据库。

    此外,您没有收到任何错误,因为没有选择实际的数据库,但您没有尝试运行查询。只要你这样做,

    try {
        $handler = new PDO('mysql:', "root", "root");
        $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $handler->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $handler->query("SELECT * FROM test");
        echo 'Yup!';
    } catch(PDOException $e) {
        echo 'Caught! '.$e->getMessage();
    }
    

    您将收到PDOException,正如预期的那样:

    抓住了! SQLSTATE[3D000]:无效的目录名称:1046 未选择数据库

    就像我说的那样,所有这些都是猜测,因为我无法找到其中大部分的具体证据。我希望这能引导你朝着正确的方向前进。如果我发现任何东西,我会继续寻找更多信息并进行编辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2015-07-08
      • 2012-06-09
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      相关资源
      最近更新 更多