php - PHP PDOException无法捕获

标签 php pdo error-handling

我需要有关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中的settigs(我很难解决这个问题)

新增中
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

最佳答案

文档非常不清楚,但是我进行了一些测试并得出了一些结论。这纯粹是猜测。如果我找到更多信息,我将尝试支持其中的一些主张。

  • 如果不存在host,则假定为localhost
  • 数据库名称不是必需的。我想这是可以连接到服务器并通过PDO创建新数据库的方法。
  • 如果遇到语法错误,则此后将不再考虑该字符串。

  • 有了这些假设,我们可以假设您的代码为何按其方式工作。您的DSN是:
    mysql:host-127.0.0.1;dbname=not_a_valid_dbname
    

    由于存在语法错误(-之后为host),因此未考虑任何参数,并且未选择任何数据库,且hostlocalhost。这就是为什么您不会出错的原因。但是,如果删除host参数:
    mysql:dbname=not_a_valid_dbname
    
    localhost用作主机(默认情况下已选中),但是not_a_valid_dbname尝试用作数据库,这会导致

    Caught! SQLSTATE[HY000] [1049] Unknown database '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,如预期的那样:

    Caught! SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected



    就像我说的那样,所有这些都是推测,因为我无法真正找到大部分证据。我希望这会指导您正确的方向。我会继续寻找更多信息,如果有发现,请进行编辑。

    关于php - PHP PDOException无法捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49090370/

    相关文章:

    php - laravel 4 Input::old() 为空

    php - 如果为真,则在条件内分配变量

    PHP 检查用户是否存在 PDO

    mysql - 如何过滤以相同字符开头的 mysql 选择?

    json - 检索并使用Volley错误HTTP响应代码和开关大小写来处理错误

    php - Yii2 - 重定向后 flash 不可见

    javascript - 如何在 PHP 中打印页面以使用与 window.print() 相同的打印机进行打印

    php - 如何sql查询取决于行中的字段?

    react-native - react native : Log wrong responses

    c - 用于测试错误处理程序的错误 C 代码