2015-01-03 26 views
1

我需要重定向到單獨的頁面才能顯示錯誤。 header(「Location:errorpage.php?errorcode = 11」);以後似乎沒有工作。如果PDO事務失敗,如何重定向到頁面?

<?php 
$db = new PDO("mysql:host=localhost;dbname=mydbase;charset=utf8", "user", "password"); 
try { 
$db->beginTransaction(); 

$db->exec("SOME QUERY"); 

$db->commit(); 
} 

catch(PDOException $ex) { 
$db->rollBack(); 
//Something went wrong so I need to redirect 
header("Location: errorpage.php?errorcode=11"); 
} 
+2

如果它沒有重定向,那麼你可能在標題之前輸出。在打開'<?php'標籤後立即在文件頂部添加錯誤報告 'error_reporting(E_ALL); ini_set('display_errors',1);'看看它是否會產生任何東西,以及關於頭文件已經發送的警告。那,和/或你的查詢失敗了。 –

+0

或在頂部,在<?php'下添加'ob_start();'這將確保腳本在發送任何輸出之前完成:) – Richard87

+0

'ob_start()'可以工作,但最多是黑客攻擊。整理邏輯以防止輸出是非常受歡迎的。 –

回答

2

PDO's error handling有點不尋常。它具有拋出真正異常,發出PHP警告或者只是沉默的模式。

無聲是默認設置。這裏發生的事情是沒有拋出異常,因爲你沒有配置PDO來拋出一個。所以catch塊永遠不會被輸入,header()永遠不會被稱爲。設置您$db對象拋出異常:

// Ensure PHP's native error handling is showing 
// on screen (to catch problems with header() itself) 
error_reporting(E_ALL); 
// Always in development, disabled in production 
ini_set('display_errors', 1); 

$db = new PDO("mysql:host=localhost;dbname=mydbase;charset=utf8", "user", "password"); 

// Turn on exceptions for PDO so the try/catch is meaningful 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

try { 
    $db->beginTransaction(); 
    $db->exec("SOME QUERY"); 
    $db->commit(); 
} 

catch(PDOException $ex) { 
    $db->rollBack(); 
    //Something went wrong so I need to redirect 
    header("Location: errorpage.php?errorcode=11"); 
    // Always make an explicit call to exit() after a redirection header. 
    exit(); 
} 

關於PDO::exec()

我知道這是示例代碼,但exec()通常不使用正確的方法。如果您正在執行DDL語句,則該事務將不起作用,因爲MySQL不支持該操作,並且如果您使用任何用戶輸入執行INSERT/UPDATE/DELETE之類的操作,則應該使用prepare()/execute()來創建注入安全的預準備語句。

+0

加$ db-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);工作。我的代碼是完全相似的,除了我使用$ db-> exec(「LOCK TABLE'mydbase'」);所以不得不在我鎖定我的表後添加異常。 – styxtrooper

+0

@styxtrooper我很高興它適合你。 'exec()'適用於'LOCK TABLE'語句,但除非在那裏有其他的'INSERT/UPDATE/DELETE',這個事務不會有太大的用處。 (我懷疑你可能會這樣做,否則你爲什麼要鎖定它?) –

+0

我將爲未來的讀者留下關於exec()的部分,雖然它適合您的LOCK TABLE命令 –

相關問題