PHP退出后不加载页面的其余部分;

时间:2011-08-28 01:18:28

标签: php html

我是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 &quot;$page&quot; does not exist.</h1>\n");
    // echo("<h1>New Page: $page</h1>\n");
    // $text = "<p></p>";
    // problem here
    exit;
  }

2 个答案:

答案 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 &quot;$page&quot; 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

它可以很好地处理更结构化的代码(跳出函数),很难。

也许这应该是一个评论,谁知道。