我需要有关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
),因此未考虑任何参数,并且未选择任何数据库,且host
为localhost
。这就是为什么您不会出错的原因。但是,如果删除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/