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()
來創建注入安全的預準備語句。
如果它沒有重定向,那麼你可能在標題之前輸出。在打開'<?php'標籤後立即在文件頂部添加錯誤報告 'error_reporting(E_ALL); ini_set('display_errors',1);'看看它是否會產生任何東西,以及關於頭文件已經發送的警告。那,和/或你的查詢失敗了。 –
或在頂部,在<?php'下添加'ob_start();'這將確保腳本在發送任何輸出之前完成:) – Richard87
'ob_start()'可以工作,但最多是黑客攻擊。整理邏輯以防止輸出是非常受歡迎的。 –