概述:
我有一个代码块,我正在检查条件并重定向到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块内时它重定向就好了?
我认为代码应该完全相同,我知道有关头重定向的信息.(当重定向头时,所有以下代码执行应该跳过).
设置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任何内容都不会指示.