2014-02-17 30 views
3

如何讓php在PRG(POST-Redirect-GET)段內發生非致命錯誤時停止,以便您可以看到錯誤消息,而沒有用於重定向的後續頭(()用於清除錯誤消息?在PHP中調試PRG - 如何獲取錯誤顯示?

例Caller.htm

<form method="post" action="Callee.php"> 
    <input type="text" name="PostData" /> 
    <input type="submit" value="Go"  /> 
</form> 

例Callee.php:

<?php 
// POST section: 
if($_POST) { 

    $var = $x; // non-fatal error: $x is missing. 

    header("Location: ". $_SERVER['REQUEST_URI']. 'Query'); die; // Redirect & GET 
} 
// GET section 
// ... 

什麼情況是,在測試時,PHP報告失蹤$ X錯誤,但隨後不斷移動,擊中標題()並丟棄錯誤輸出,所以你永遠不會在屏幕上看到錯誤信息。

您可以暫時將die;(或exit;)放在標題之前,或將標題註釋掉以測試代碼。然後,當代碼正在工作時,請取出die;或將標題放回。但是,在開發過程中,這種方法並不能很好地工作,因爲我發現有很多次我錯誤地發現了一個我甚至不知道的錯誤。

有時您可以將標題向上移動到可能發生錯誤的位置。但是,在更一般的情況下,需要能夠將查詢字符串傳遞給GET部分,因此頭部必須位於POST部分的底部。

我想這可能是PHP調用E_WARNING,「運行時警告(非致命錯誤)。腳本執行沒有停止。」,但我不確定。

我運行5.4.23:

error_reporting = E_ALL | E_STRICT 
display_errors = "On"       
log_errors = "On" 
ignore_repeated_errors = "Off" 

[全部,我試圖刪除。傑克有以下答案。]

+1

你的意思是PRG(郵政,重定向,獲取)呢? –

+2

你的意思是RPG(火箭推進手雷)......你可以寫信給一個文件,日誌,電子郵件等。看看@ http://www.php.net/manual/en/function.error-log.php –

+0

@RonniSkansing你打那個兄弟:D – Vainglory07

回答

2

首先,你應該承擔的東西向右走,所以重定向應該發生try範圍:

if($_POST) { 
    try{ 

     $var = $x; //BAD CODE, $x is missing. 

     header("Location: ". $_SERVER['REQUEST_URI']); // Redirect & GET 
    } catch (Exception $e) { 
     echo $e->getMessage(); 
    } 
    exit; 
} 

現在,如果你希望你的代碼扔在警告和注意事項例外,看看ErrorException並定義自定義錯誤處理程序,將他們變成例外:

function exception_error_handler($errno, $errstr, $errfile, $errline) 
{ 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

set_error_handler("exception_error_handler"); 

上面的代碼是從文檔拍攝。

最好,你將要使用的錯誤日誌(related question):

 // ... 
    } catch (Exception $e) { 
     $logger->fatal($e); // or $this->fatal($e); 
    } 

將其組合在一起

function exception_error_handler($errno, $errstr, $errfile, $errline) 
{ 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

set_error_handler("exception_error_handler"); 

if($_POST) { 
    try{ 

     $var = $x; //BAD CODE, $x is missing. 

     header("Location: ". $_SERVER['REQUEST_URI']); // Redirect & GET 
    } catch (Exception $e) { 
     echo $e->getMessage(); // or log the exception 
    } 
    exit; 
} 
+0

+1鏈接到相關問題,給出了有關error_log限制的詳細信息 –

+0

不幸的是,在您的第一個解決方案中,雖然字面上的'BAD CODE'導致解析器停止(而且我的部分簡化了一些),但實際的測試用例: $ var = $ x;不會停止解析器。所以這個想法不能解決問題。你的第二個想法我認爲是好的,但這意味着我現在必須檢查第二個地方是否有錯誤,但我可以做到這一點。我在想一封電子郵件,所以我知道我會得到它。 –

+0

如果第三個想法能夠解決,我會讓你知道的。只看了一次。再看一遍。謝謝。 –

0

嘗試回顯您的輸入;

echo $ _SERVER ['REQUEST_URI']; 你可以看到你的輸入是否爲空:在被header()重定向之前;

+0

對不起,試了一下,但沒有奏效。不管怎麼說,還是要謝謝你。 –