在事务中间重定向是正常的事情吗?

时间:2016-07-25 23:24:16

标签: php pdo

这是一个交易结构:

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() (甚至在查询之后)之前重定向脚本时,这些查询都不会起作用。我的意思是没有变化

1 个答案:

答案 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");
}