多个MYSQL更新在PDO事务中失败

时间:2016-05-06 19:12:58

标签: mysql pdo

我尝试做的是通过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;
    }
}

1 个答案:

答案 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。