如果PDO事务失败,如何重定向到页面?

时间:2015-01-03 14:38:14

标签: php mysql sql pdo

我需要重定向到单独的页面才能显示错误。标题("位置:errorpage.php?errorcode = 11");之后似乎没有用。

<?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");
}

1 个答案:

答案 0 :(得分: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()创建一个相反,注射安全预备声明。

相关问题