我尝试使用PDO进行交易,使用以下代码
Date
但我收到以下错误(表格未更新):
try
{
$bdd = new PDO('mysql:host=HOSTNAME;dbname=DATABASENAME', 'USERNAME', 'PASSWORD');
}
catch(Exception $e)
{
die('Error : '.$e->getMessage());
}
$qry = 'UPDATE table SET field = CASE';
foreach($elements as $el){
$qry .= ' WHEN id = '. $el['id'] .' THEN '. $el['value'];
}
$qry .= ' ELSE field END, SET update_date = CASE';
foreach($elements as $el){
$qry .= ' WHEN id = '. $el['id'] .' THEN NOW()';
}
$qry .= ' ELSE update_date END';
$update = $bdd->prepare($qry);
$bdd->beginTransaction();
try {
$update->execute();
$bdd->commit();
}
catch(Exception $e) {
$bdd->rollback();
echo 'Error : '.$e->getMessage().'<br />';
echo 'N° : '.$e->getCode();
exit();
}
(106行是Fatal error: Uncaught exception 'PDOException' with message 'There is no active transaction' in script.php:106
Stack trace:
#0 script.php(106): PDO->rollBack() #1 {main} thrown in script.php on line 106
)
据我所知,它告诉我没有交易,但......应该有,$bdd->rollback();
......
感谢您提供任何帮助!
编辑:数据库引擎是MyISAM。
进一步测试后我还有其他信息:
我在问题中简化了$bdd->rollback();
,因为我认为这是无关紧要的,但似乎并非如此。我实际使用的查询是一个更长的查询,使用以下代码更新多个元素(我还修改了原始问题中的代码^):
$qry
查询的长度和/或更新行的数量似乎导致了我的问题:
$qry = 'UPDATE table SET field = CASE';
foreach($elements as $el){
$qry .= ' WHEN id = '. $el['id'] .' THEN '. $el['value'];
}
$qry .= ' ELSE field END, SET update_date = CASE';
foreach($elements as $el){
$qry .= ' WHEN id = '. $el['id'] .' THEN NOW()';
}
$qry .= ' ELSE update_date END';
会返回vardump($bdd->beginTransaction();)
(无论之前是否为{}}在bool(true)
行之后。$update = $bdd->prepare($qry)
返回vardump($bdd->beginTransaction();)
(再次,无论它是bool(false)
行之前还是之后。对于为什么以及我如何解决它的提示表示赞赏。
再次感谢
编辑2 :我将引擎切换到InnoDB。问题仍然存在。
答案 0 :(得分:1)
移动
$bdd->beginTransaction();
以上查询:
$qry = 'UPDATE table SET field = value'
$update = $bdd->prepare($qry);
编辑:
您正在使用不支持交易的MyISAM引擎。更新表以使用InnoDB。