我是PHP的新手,我无法弄清楚为什么会发生这种情况。
出于某种原因,当exit
触发时,整个页面停止加载,而不仅仅是PHP脚本。比如,它会加载页面的上半部分,但不包括脚本所在的位置。
这是我的代码:
$page = $_GET["p"] . ".htm";
if (!$_GET["p"]) {
echo("<h1>Please click on a page on the left to begin</h1>\n");
// problem here
exit;
}
if ($_POST["page"]) {
$handle = fopen("../includes/$page", "w");
fwrite($handle, $_POST["page"]);
fclose($handle);
echo("<p>Page successfully saved.</p>\n");
// problem here
exit;
}
if (file_exists("../includes/$page")) {
$FILE = fopen("../includes/$page", "rt");
while (!feof($FILE)) {
$text .= fgets($FILE);
}
fclose($FILE);
} else {
echo("<h1>Page "$page" does not exist.</h1>\n");
// echo("<h1>New Page: $page</h1>\n");
// $text = "<p></p>";
// problem here
exit;
}
答案 0 :(得分:9)
即使您的PHP代码后面有HTML代码,从Web服务器的角度来看,它仍然是一个PHP脚本。调用exit()
时,就是它的结束。 PHP将输出进程并输出不再有HTML,并且Web服务器将不再输出html。换句话说,它完全按照预期的方式工作。
如果您需要终止PHP代码执行流程而不阻止输出任何其他HTML,则需要相应地重新组织代码。
这是一个建议。如果有问题,请设置一个表示如此的变量。在随后的if()
块中,检查是否遇到以前的问题。
$problem_encountered = FALSE;
if (!$_GET["p"]) {
echo("<h1>Please click on a page on the left to begin</h1>\n");
// problem here
// Set a boolean variable indicating something went wrong
$problem_encountered = TRUE;
}
// In subsequent blocks, check that you haven't had problems so far
// Adding preg_match() here to validate that the input is only letters & numbers
// to protect against directory traversal.
// Never pass user input into file operations, even checking file_exists()
// without also whitelisting the input.
if (!$problem_encountered && $_GET["page"] && preg_match('/^[a-z0-9]+$/', $_GET["page"])) {
$page = $_GET["p"] . ".htm";
$handle = fopen("../includes/$page", "w");
fwrite($handle, $_GET["page"]);
fclose($handle);
echo("<p>Page successfully saved.</p>\n");
// problem here
$problem_encountered = TRUE;
}
if (!$problem_encountered && file_exists("../includes/$page")) {
$FILE = fopen("../includes/$page", "rt");
while (!feof($FILE)) {
$text .= fgets($FILE);
}
fclose($FILE);
} else {
echo("<h1>Page "$page" does not exist.</h1>\n");
// echo("<h1>New Page: $page</h1>\n");
// $text = "<p></p>";
// problem here
$problem_encountered = TRUE;
}
有很多方法可以解决这个问题,其中许多方法比我提供的例子更好。但这是一种非常简单的方法,可以让您调整现有代码,而无需进行太多的重组或冒险。
答案 1 :(得分:1)
在PHP 5.3+中,您可以使用goto
statement跳转到?>
之前的标签,而不是在问题中给出的示例中使用exit
。
它可以很好地处理更结构化的代码(跳出函数),很难。
也许这应该是一个评论,谁知道。