标头位置无法重定向

Kir*_*ash 0 php redirect

概述:

我有一个代码块,我正在检查条件并重定向到page(manage_contents.php)如果condition(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}");   
    }
Run Code Online (Sandbox Code Playgroud)

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

redirect_to函数:

function redirect_to($new_location) {
        header("Location:".$new_location);  
    }
Run Code Online (Sandbox Code Playgroud)

为我工作的解决方案:

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}");   
        }
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我将所有代码放在else语句中,那么当if条件满足时它不会转到else部分,因此工作得很好.

怀疑:

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

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

Sea*_*ght 5

设置Location标题不会停止处理当前的PHP页面.你需要明确地exit:

function redirect_to($new_location)
{
    header("Location: $new_location");
    exit;
}
Run Code Online (Sandbox Code Playgroud)

在其他语言/框架(Response.Redirect想到ASP.NET )中,当前页面的执行会为您停止,但这不会发生在PHP中,文档中的header任何内容都不会指示.