这是一个交易结构:
try {
$dbh_con->beginTransaction();
// queries here
$dbh_con->commit();
} catch(PDOException $e) {
$dbh_con->rollBack();
}
现在我想知道我可以在交易中使用header('Location: ../);
吗?那会发生什么?
以下是3个案例:
try {
$dbh_con->beginTransaction();
header('Location: ../mypage.php1'); // (1)
// queries here
$dbh_con->commit();
header('Location: ../mypage.php2'); // (2)
} catch(PDOException $e) {
header('Location: ../mypage.php3'); // (3)
$dbh_con->rollBack();
}
确定使用(1)
,(2)
和(3)
标准的重定向代码?在这种情况下,查询会发生什么?
根据测试,当我在commit()
(甚至在查询之后)之前重定向脚本时,这些查询都不会起作用。我的意思是没有变化
答案 0 :(得分:1)
使用header()
时,重定向不会发生。该脚本继续正常执行。只有在将第一段内容发送到浏览器时,header()
才会生效。
如果您多次设置相同的标题,则只会将最新的标题发送到浏览器(之前的设置会被覆盖)。
header('Location: /a.php');
... do some work
header('Location: /b.php');
...
//one of the lines below will cause redirection to /b.php
echo "first piece of content!"; //<- send to the browser if buffering is off
ob_flush();// <- send contents to browser if buffering is on
当然,在您的示例中,如果存在异常,catch
块标头将生效,因为它将是最后一个Location
标头集。
在脚本中多次设置相同的标头会使调试变得更加困难。一旦您有足够的信息知道将用户发送到何处,请将其设置在一个位置:
try {
$dbh_con->beginTransaction();
// queries here
$dbh_con->commit();
$uri = '/a.php';
} catch(PDOException $e) {
$uri = '/b.php';
$dbh_con->rollBack();
} finally {
header("Location: $uri");
}