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()'可以工作,但最多是黑客攻击。整理逻辑以防止输出是非常受欢迎的。 –