2013-05-29 66 views
0

有時我得到一個致命的錯誤在這行PHP捕致命錯誤和重定向

$result = $db->execute($query); 

$primary = $result->getRows(); 

致命錯誤:調用一個成員函數GetRows的()非對象

我搜索解決方案來捕獲此錯誤並重定向到索引頁面。

重寫某些東西很複雜,因爲系統是舊的。

+0

不要試圖趕上這,檢查是否'$ result'是一個對象/ NOT布爾。 –

+0

可能的重複:http://stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error/ – periklis

+1

不完全,如果錯誤可以防止,它不需要是catched –

回答

1

事情是這樣的:

$result = $db->execute($query); 

if ($result===false) { 
    header("Location: errorpage.php"); 
    exit; 
} 
$primary = $result->getRows(); 
+0

+1使用警衛子句,而不是把你所有的成功邏輯放在巨大的if語句中。 – BlargleMonster

+0

我無法使用標題,因爲會收到警告,表明標題已發送 – user2413939

+0

請確保沒有其他內容被回顯或顯示在頁面上。我不會推薦,但你可以使用ob_ *或echo javascript來重定向。 –

0

這裏的問題是,執行()會在某些情況下返回FALSE和一個布爾值,是沒有結果的對象。

爲避免出現此錯誤,您應該始終檢查execute()的輸出(如果它甚至成功執行)。

例如:

$result = $db->execute($query); 

if ($result !=== false) { 
$primary = $result->getRows(); 
} 
1

首先,不應該有一個錯誤無論哪種方式。

你必須修正你的代碼來糾正錯誤,而不是編寫新的代碼來處理它。

從數據庫中獲取錯誤消息以查看導致此錯誤並修復它的某些問題。

而且

  • 不能在一般的趕上了致命錯誤。
  • 你不應該在任何地方重定向。如果發生錯誤,必須返回'503 HTTP標題'以及普通503頁面。
0

我們需要知道$ 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(); 
-1

如果您收到錯誤消息「標題已發送」,這是因爲某些內容已經輸出。例如:

echo "hello world;"; 
header("Location: errorpage.php"); 

或:

<?php // notice the space before <?php 
header("Location: errorpage.php"); 
?> 
0

通常情況下,你不能捕獲錯誤......唯一的例外....幸運的是,用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; 
} 
+0

只是說,你的班級不是一個「處理程序」,也許你應該改變它的名字。有一個內置的例外,完全是這樣的:http://br.php.net/errorexception –

+0

這只是一個複製過去的評論在PHP評論... – Orangepill