我需要重定向到单独的页面才能显示错误。标题("位置:errorpage.php?errorcode = 11");之后似乎没有用。
<?php
$db = new PDO("mysql:host=localhost;dbname=mydbase;charset=utf8", "user", "password");
try {
$db->beginTransaction();
$db->exec("SOME QUERY");
$db->commit();
}
catch(PDOException $ex) {
$db->rollBack();
//Something went wrong so I need to redirect
header("Location: errorpage.php?errorcode=11");
}
答案 0 :(得分:2)
PDO's error handling有点不寻常。它具有抛出实际异常,发出PHP警告或只是沉默的模式。
默认是默认值。这里发生的事情是没有抛出任何异常,因为你没有配置PDO来抛出一个。因此,永远不会输入catch
块,永远不会调用header()
。设置$db
对象以抛出异常:
// Ensure PHP's native error handling is showing
// on screen (to catch problems with header() itself)
error_reporting(E_ALL);
// Always in development, disabled in production
ini_set('display_errors', 1);
$db = new PDO("mysql:host=localhost;dbname=mydbase;charset=utf8", "user", "password");
// Turn on exceptions for PDO so the try/catch is meaningful
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$db->beginTransaction();
$db->exec("SOME QUERY");
$db->commit();
}
catch(PDOException $ex) {
$db->rollBack();
//Something went wrong so I need to redirect
header("Location: errorpage.php?errorcode=11");
// Always make an explicit call to exit() after a redirection header.
exit();
}
关于PDO::exec()
:
我知道这是示例代码,但exec()
通常不是正确的使用方法。如果您正在执行DDL语句,那么事务将不起作用,因为MySQL不支持该事务,并且如果您使用任何用户输入执行INSERT/UPDATE/DELETE
之类的操作,那么您应该prepare()/execute()
创建一个相反,注射安全预备声明。