概述:
如果条件(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块中时它会重定向?
我认为代码应该完全相同,我知道有关头重定向的信息。(当重定向头时,所有以下代码执行都应该跳过)。
答案 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中的警告:当您使用"位置"标题你必须注意它下面的代码不会被执行(你的第二个代码符合它)。