MySQL事务:无论如何都提交了查询

时间:2017-03-06 18:05:59

标签: php mysql pdo transactions

我几天前发现了PDO和交易,他们很棒。今天我写了第一笔交易,但没有像预期的那样结束。为了测试它,我在两个查询中的一个中放入了一个错误的不存在的表,并且无论如何,另一个(正确的)一个都被提交。

我在一些网站上阅读了语法结构,看起来是正确的,但也许错误就在那里。表格是InnoDB。或者更好的是,phpMyAdmin进入数据库概述表,在最后一个摘要行上报告MyISAM,但列#34; 类型"每个表的行报告InnoDB;我认为这可能是因为MyISAM是服务器上的默认类型,是吗?

以下是代码:

$conn = new PDO($db->getDsn(), $db->getUsername(), $db->getPassword());

try {
    $conn->beginTransaction();
    $stmt = $conn->prepare('INSERT INTO trips (country_code, year, img, showX) VALUES (:country_code, :year, :img, :showX)');
    $stmt->execute(array(':country_code' => strtolower($country_code), ':year' => $year, ':img' => $rename_response, ':showX' => $show_hide));
    $tripID = $conn->lastInsertId();

    $stmt = $conn->prepare('INSERT INTO trips_multilang (tripID, lang, country_name) VALUES (:tripID, :lang, :country_name)');
    $stmt->execute(array(':tripID' => $tripID, ':lang' => $trip_lang, ':country_name' => strtolower($country_name)));

    $conn->commit();
} catch (PDOException $e) {
    $conn->rollBack();
    die($e->getMessage());
}

1 个答案:

答案 0 :(得分:0)

向$ db类添加另一个返回数组

的方法$db->getOptions()
return [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION];

然后将PDO调用为

$conn = new PDO($db->getDsn(), $db->getUsername(), $db->getPassword(), $db->getoptions());

之后,您的代码将开始迎头赶上 现在你正在捕捉异常,因为没有实际抛出异常。

在旁注中,您必须捕获异常,而不是PDOException以及you must re-throw an exception in case of error而不是消失。