我的问题有点简单,或者可能是我身边的一个愚蠢的错误。但我不知道我在php中使用PDO时会得到意想不到的结果。
代码就是这样,
try
{
$_pdo = get_pdo_instance();
$_pdo->beginTransaction();
//query 1
$_pdo->query("some query"); // I have error in query 3 but this query 1 is still executed.
//query 2
$_pdo->query("some query"); // only executes when there are no errors.
//query 3
$_pdo->query("some wrong query"); // let's say I have an error in this sql
$_pdo->commit();
}
catch(Exception $ex)
{
$_pdo->rollback();
}
我现在正在解释这个问题,
在给定的示例中,我在query 3
中有一些sql错误,因此没有查询应该运行,因为它们都属于单个事务。
但在我的情况下,即使query 1
块中存在错误,try
也会一直运行。
也许它很简单,但我不知道为什么会这样。
编辑: 功能定义,
function get_pdo_instance()
{
try
{
$conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
die('ERROR: ' . $e->getMessage());
}
return $conn;
}
答案 0 :(得分:0)
异常仅用于PHP错误。在上面的代码中,您尝试捕获MySQL错误。当PHP读取你的try块时,一切看起来都很好,因此没有异常可以捕获。 您可以使用PDO和MySQL进行错误检查,如:
if(!$_pdo->query("some query")) {
// Do something
}
答案 1 :(得分:0)
请参阅PDO Error Handling的文档。你需要启用异常提升。
try {
$_pdo = get_pdo_instance();
$_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$_pdo->beginTransaction();
$_pdo->query("some query");
$_pdo->query("some query");
$_pdo->query("some wrong query");
$_pdo->commit();
}
catch(Exception $ex) {
$_pdo->rollback();
}
答案 2 :(得分:0)
这是我的解决方案,
我抓住Exception
,而在这种情况下,我必须抓住PDOException
。
我想这解决了我的问题,但我还没有完全测试过这个问题。我会发布更新,如果有的话。