我尝试做的是通过php PDO事务一次更新多个记录。阅读this SO article后,我得出了将多个更新作为事务运行的结论。考虑到一次可能有多达500个帖子,这种方法似乎更合适。用户的一个操作可能需要更新所有500个。
这是最好的方法还是使用上述SO文章中提到的CASE方法?
以下是我尝试进行多次更新的代码,但它实际上并没有更新记录。它作为事务运行时无声地失败,但是手动运行sql本身就可以......
public function transaction_updatePosition($numPosts, $params) {
// Begin Transaction
$this->db->startTransaction();
try {
// Temp set
$sql = '';
// Loop and create sql
for ($i = 0; $i < $numPosts; $i += 1) {
$sql .= 'UPDATE posts SET position = ? WHERE user_id = ? AND post_id = ?;';
}
// Run query
if (!$this->db->connection->prepare($sql)->execute($params)) {
// Throw error
throw new Exception('Could not update positions.');
}
// Commit Transaction
$this->db->commitTransaction();
return true;
} catch (PDOException $e) {
// Rollback Transaction
$this->db->rollbackTransaction();
return false;
}
}
答案 0 :(得分:4)
我不知道$params
数组中的内容,但假设它包含嵌套的关联数组,
try {
$sql = 'UPDATE posts SET position = ? WHERE user_id = ? AND post_id = ?';
$stmt = $this->db->connection->prepare($sql);
// Loop and execute
foreach ($params as $row){
$stmt->execute([$row['position'],$row['user_id'],$row['post_id']]);
}
// Commit Transaction
$this->db->commitTransaction();
return true;
} catch (PDOException $e) {
// Rollback Transaction
$this->db->rollbackTransaction();
// make sense of an exception thrown
throw $e;
}
为了使此代码有效,您必须确保使用ERRMODE_EXCEPTION。