有時我得到一個致命的錯誤在這行PHP捕致命錯誤和重定向
$result = $db->execute($query);
$primary = $result->getRows();
致命錯誤:調用一個成員函數GetRows的()非對象
我搜索解決方案來捕獲此錯誤並重定向到索引頁面。
重寫某些東西很複雜,因爲系統是舊的。
有時我得到一個致命的錯誤在這行PHP捕致命錯誤和重定向
$result = $db->execute($query);
$primary = $result->getRows();
致命錯誤:調用一個成員函數GetRows的()非對象
我搜索解決方案來捕獲此錯誤並重定向到索引頁面。
重寫某些東西很複雜,因爲系統是舊的。
事情是這樣的:
$result = $db->execute($query);
if ($result===false) {
header("Location: errorpage.php");
exit;
}
$primary = $result->getRows();
+1使用警衛子句,而不是把你所有的成功邏輯放在巨大的if語句中。 – BlargleMonster
我無法使用標題,因爲會收到警告,表明標題已發送 – user2413939
請確保沒有其他內容被回顯或顯示在頁面上。我不會推薦,但你可以使用ob_ *或echo javascript來重定向。 –
這裏的問題是,執行()會在某些情況下返回FALSE和一個布爾值,是沒有結果的對象。
爲避免出現此錯誤,您應該始終檢查execute()的輸出(如果它甚至成功執行)。
例如:
$result = $db->execute($query);
if ($result !=== false) {
$primary = $result->getRows();
}
首先,不應該有一個錯誤無論哪種方式。
你必須修正你的代碼來糾正錯誤,而不是編寫新的代碼來處理它。
從數據庫中獲取錯誤消息以查看導致此錯誤並修復它的某些問題。
而且
我們需要知道$ db是什麼,您沒有包含$ db被初始化的代碼,或者通知我們這是什麼引用。
假設您使用的是PDO庫,PDO對象本身具有PDO :: exec()並且PDOStatement對象具有PDOStatement :: execute()。因此,我假設$ db是PDOStatement的一個實例,並且您正在調用execute()方法,該方法在失敗時返回布爾值,爲false,成功時爲true - 成功時不會返回對象。如果成功,你應該調用$ db-> fetchAll();
if (!$db->execute($query)) {
header("Location: error.php");
exit;
}
$rows = $db->fetchAll();
如果您收到錯誤消息「標題已發送」,這是因爲某些內容已經輸出。例如:
echo "hello world;";
header("Location: errorpage.php");
或:
<?php // notice the space before <?php
header("Location: errorpage.php");
?>
通常情況下,你不能捕獲錯誤......唯一的例外....幸運的是,用PHP,你可以設置不拋出異常的error_handler。(從PHP ErrorException頁面的評論)
class ErrorHandler extends Exception {
protected $severity;
public function __construct($message, $code, $severity, $filename, $lineno) {
$this->message = $message;
$this->code = $code;
$this->severity = $severity;
$this->file = $filename;
$this->line = $lineno;
}
public function getSeverity() {
return $this->severity;
}
}
function exception_error_handler($errno, $errstr, $errfile, $errline) {
throw new ErrorHandler($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler", E_ALL);
因此,對於您的具體問題,你會只是做:
try{
$result = $db->execute($query);
$primary = $result->getRows();
} catch (ErrorHandler $e){
header("Location: /index.php");
exit;
}
只是說,你的班級不是一個「處理程序」,也許你應該改變它的名字。有一個內置的例外,完全是這樣的:http://br.php.net/errorexception –
這只是一個複製過去的評論在PHP評論... – Orangepill
不要試圖趕上這,檢查是否'$ result'是一個對象/ NOT布爾。 –
可能的重複:http://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error/ – periklis
不完全,如果錯誤可以防止,它不需要是catched –