2012-03-11 65 views
0

我已经添加了一些服务器端验证到我的一个网页上的下拉框,当我做了网页不会工作了。我添加的代码如下:混淆为什么代码只能使用ob_start();

$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();作为我调试页面开始的一部分,突然间我的代码正常工作,但我不知道为什么,我希望社区能够抛出一个有根据的猜测。当代码停止工作时,它不会执行上面的页眉命令,当我添加ob_start()时,页面只会刷新并且不会更改位置。到页面顶部按照计划重定向页面。所以总的问题是,为什么页面不直接使用header命令而没有ob_start?我确信更多的细节和代码对于明确的答案是必要的,但我希望有人遇到过这种情况,或者有一个有教养的猜测,可能会导致我自己的答案。感谢您的任何见解。

+0

[Headers already already sent by PHP](http://stackoverflow.com/questions/8028957/headers-already-sent-by-php) – mario 2012-03-11 23:33:35

回答

2

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

+0

感谢您的快速回复。我现在正在查看有关任何违规者的代码,而且没有任何东西会跳出来。您能否给我一个“写入输出流”的例子给我和读这篇文章的其他人?这只是回声陈述? – 2012-03-11 18:22:12

+0

很难说,可能是在打开'<?php'之前的空格,或者可能是echo语句。当然,我发现找到的一种方法是使用ob_get_contents并查看缓冲区中的内容。 – dldnh 2012-03-11 18:27:49

+0

感谢您的帮助。我会看看我能否从这里弄清楚。如果我不能这样做,建议现在不要使用ob_start()作为补丁,直到我有时间回来找出问题为止?任何潜在的陷阱? – 2012-03-11 18:36:18