标头位置无法重定向

时间:2015-07-02 16:31:05

标签: php redirect

概述:

如果条件(manage_contents.php)满足,那么我正在检查条件并重定向到页面(mysqli_num_rows($pages_set)>0)的代码块,因此if条件之后的所有内容都不应该执行标题已被重定向。

if(mysqli_num_rows($pages_set)>0) {
    $_SESSION["message"] = "can't delete a subject with pages";
    redirect_to("manage_contents.php?subject={$current_subject["id"]}");    
}

    $id = $current_subject["id"];

    //Standard delete query
    $query = "DELETE FROM subjects WHERE id = {$id} LIMIT 1";
    $result = mysqli_query($connection,$query);

    if($result && mysqli_affected_rows($connection)==1) {
        $_SESSION["message"] = "Subjects deleted";
        redirect_to("manage_contents.php");
    }else{
        $_SESSION["message"]="Subject deletion failed";
        redirect_to("manage_contents.php?subject={$id}");   
    }

但是如果我执行上面的代码,那么代码不会重定向(即使if条件满足)并执行if循环旁边的任何内容。

redirect_to function:

function redirect_to($new_location) {
        header("Location:".$new_location);  
    }

为我工作的解决方案:

if(mysqli_num_rows($pages_set)>0) {
        $_SESSION["message"] = "can't delete a subject with pages";
        redirect_to("manage_contents.php?subject={$current_subject["id"]}");    
    } else {

        $id = $current_subject["id"];

        //Standard delete query
        $query = "DELETE FROM subjects WHERE id = {$id} LIMIT 1";
        $result = mysqli_query($connection,$query);

        if($result && mysqli_affected_rows($connection)==1) {
            $_SESSION["message"] = "Subjects deleted";
            redirect_to("manage_contents.php");
        }else{
            $_SESSION["message"]="Subject deletion failed";
            redirect_to("manage_contents.php?subject={$id}");   
        }
}

所以,如果我将所有代码放在else语句中,那么当if条件满足时它就不会进入else部分,因此工作正常。

的疑问:

如果我只是将代码留在else部分之外,为什么标题不会重定向?为什么当代码在else块中时它会重定向?

我认为代码应该完全相同,我知道有关头重定向的信息。(当重定向头时,所有以下代码执行都应该跳过)。

2 个答案:

答案 0 :(得分:5)

设置Location标头不会停止处理当前的PHP页面。您需要明确exit

function redirect_to($new_location)
{
    header("Location: $new_location");
    exit;
}

在其他语言/框架中(想到ASP.NET的Response.Redirect),当前页面的执行会停止,但这不会在PHP中发生,the documentation for header中没有任何内容表示不是。

答案 1 :(得分:0)

查看http://php.net/manual/en/function.header.php中的警告:当您使用"位置"标题你必须注意它下面的代码不会被执行(你的第二个代码符合它)。