2015-01-03 27 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命令 –

相关问题