如果 PDO 事务失败,如何重定向到一个页面?
how to redirect to a page if PDO transaction fails?
我需要重定向到一个单独的页面来显示错误。 header("Location: 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");
}
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()
改为创建注入安全的准备语句。
我需要重定向到一个单独的页面来显示错误。 header("Location: 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");
}
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()
改为创建注入安全的准备语句。