困惑为什么代码只能用于ob_start();

时间:2012-03-11 17:59:56

标签: php

我已经在我的一个页面上的下拉框中添加了一些服务器端验证,当我这样做时,该页面将不再起作用。我添加的代码如下:

$show_form = true;        
if (isset($_POST['submit'])) {
    //All of the server side validations   
      $validator = new FormValidator();
    $validator->addValidation("hospital_name","dontselect=000","No facility was chosen");

    if ($validator->ValidateForm()) {
    // All the variables from the submission form   
    $userid = $_SESSION['user_id'];
    $hosp = $_POST['hospital_name'];
   header('Location: ../site_hospital' . $hosp . '/hospital_submitform.php?usr=' . $userid . '&&hosp=' . $hosp);
    exit;
    $show_form = false;
    } else {
    echo "<B style='color:red;'>The following errors occurred:</B>";
    $error_hash = $validator->GetErrors();
    foreach ($error_hash as $inpname => $inp_err) {
        echo "<p style='color:red;'>$inp_err</p>\n";
    }
}}        
if (true == $show_form) {

通过纯粹的机会,我添加了ob_start();作为我调试到页面开头的一部分,突然我的代码工作正常,但我不知道为什么,我希望社区可以抛出一个有根据的猜测为什么。当代码停止工作时,它不会执行上面的header命令,当我添加ob_start()时,页面只会刷新而不会改变位置。在页面顶部,页面按计划重定向。所以总的问题是为什么没有ob_start页面不能直接使用header命令?我确信更多的细节和代码对于确定的答案是必要的,但我希望有人之前遇到过这个或者有一个有根据的猜测,这可能会让我得到我自己的答案。感谢您的任何见解。

1 个答案:

答案 0 :(得分:2)

这是因为您正在写入输出流并阻止标头正常工作。一旦你开始缓冲其他输出,就删除了标题操作的障碍。