我正在使用以下脚本来使用 PHP 使用数据库:
try{
$db = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$db, $user, $pass, $options);
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
现在,我想使用这个数据库句柄来使用这个代码做一个请求:
try{
$query = $db->prepare("INSERT INTO users (...) VALUES (...);");
$query->execute(array(
'...' => $...,
'...' => $...
));
}
catch(Exception $e){
$GLOBALS['errors'][] = $e;
}
问题来了:
- 当与数据库的连接正常时,一切正常,
- 当连接失败但我不使用数据库时,我有
$GLOBALS['errors'][]
数组,之后脚本仍在运行, - 当与数据库的连接失败时,我收到以下 fatal error :
Notice: Undefined variable: db in C:\xampp\htdocs[...]\test.php on line 32
Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs[...]\test.php on line 32
注意:第 32 行是 $query = $db->prepare(...)
指令。
也就是说,脚本崩溃了,try/catch 好像也没用了。你知道为什么第二次 try/catch 不起作用以及如何解决吗?
感谢您的帮助!
编辑:有一些非常好的回复。我已经验证了一个不是我想要做的,但这可能是最好的方法。
最佳答案
try
/catch
block 仅适用于抛出的异常(throw Exception
或 Exception
的子类必须是称为)。您无法使用 try
/catch
捕获 fatal error 。
如果您的数据库连接无法建立,我认为这是致命的,因为您可能需要您的数据库在页面上做任何有意义的事情。
如果无法建立连接,PDO
将抛出异常。您的具体问题是 $db
在您尝试使用它调用方法时未定义,因此您得到一个致命的空指针(有点)。而不是像其他人建议的那样跳过 if ($db == null)
箍,你应该修复你的代码以确保 $db
在你需要它或者有一种不那么脆弱的方法来确保在使用它的代码中可以使用数据库连接。
如果您真的想“捕获” fatal error ,请使用 set_error_handler
,但这仍然会停止脚本执行 fatal error 。
关于PHP try/catch 和 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928487/