PHP PDOException没有捕获
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP PDOException没有捕获相关的知识,希望对你有一定的参考价值。
我需要一些关于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();
}
如您所见,我提供了一个无效的数据库名称。这个页面输出'Yup!'而不是让我知道没有这样的数据库。更改'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 param中添加反斜杠:
catch(PDOException $e)
结果仍然相同。帮我打破我的代码:D
文档很不清楚,但我做了一些测试并得出了一些结论。这是纯粹的猜测。如果我找到更多信息,我会尝试支持其中一些声明。
- 如果不存在
host
,则假设为localhost
。 - 数据库名称不是必需的。我想,这是你可以连接到服务器并通过
PDO
创建一个新数据库。 - 如果您有语法错误,则此后将停止考虑该字符串。
有了这些假设,我们可以假设您的代码按原样运行。您的DSN是:
mysql:host-127.0.0.1;dbname=not_a_valid_dbname
因为有一个语法错误(-
之后的host
),所以没有考虑任何参数,并且没有选择DB,host
是localhost
。这就是为什么你没有错误。但是,如果删除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未选择任何数据库
就像我说的那样,所有这些都是猜测,因为我无法在大多数情况下找到具体的证据。我希望这能指导你朝着正确的方向前进。如果我找到任何东西,我会继续寻找更多信息并进行编辑。
以上是关于PHP PDOException没有捕获的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:未捕获的异常“PDOException”,带有消息“SQLSTATE [42000]:语法错误或访问冲突 PHP 和 PDO
PHP 致命错误:未捕获的 PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误
未捕获的异常“PDOException”消息“无效的数据源名称”