2012-03-11 39 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