我几天前发现了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());
}
答案 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而不是消失。