【问题标题】:CodeIgniter Transaction not working properlyCodeIgniter 事务无法正常工作
【发布时间】:2017-09-10 21:08:22
【问题描述】:

我的模型中有这个函数应该在一个事务中运行两个查询,但更新查询不起作用。

public function delete($id = null) 
{
    if($id) {
        $delete = "DELETE FROM borrowed_books 
        WHERE id = '$id'; ";

        $mod="UPDATE `books` b
              INNER JOIN `borrowed_books` a
              SET b.nr_copies=b.nr_copies+1
              WHERE b.id_book=a.id_book AND a.id = '$id'; ";

        $this->db->trans_start();
        $this->db->query($delete);
        $this->db->query($mod);
        $this->db->trans_complete();
        if ($this->db->trans_status() === FALSE) {
            return false;
        } else {
            return true;
        }
    }   

}

【问题讨论】:

  • 除了@Brian Gottier 的回答,我建议完全删除“删除”部分,只使用“更新”。另外使用 CI 表示法:例如$this->db->where('id', $id); $this->db->update('books', array('due-date' => 'a date')); 你似乎也有一个多余的 id id_book,为什么不只是 id?在您的记录中有一个名为 due-date 或其他内容的附加字段,如果该字段为空,则表示尚未借用... KISS 原则
  • @eli 如果你遇到一些错误,那么只有trans_status() 通过错误但在update 查询中没有错误,所以如果条件匹配,我将删除记录 n 更新记录。

标签: php codeigniter


【解决方案1】:

不可能更新不存在的内容。在第一个查询中,您的删除查询,您从borrowed_books WHERE id = '$id' 中删除,但紧接着您尝试更新具有相同ID,and a.id = '$id' 的非常borrowed_books 记录。它不会更新,因为没有要更新的内容。

为了清楚起见,在第二个查询中,a.id 指的是 borrowed_books 表的 id,但在删除查询(第一个查询)中,您只是删除了同样的 borrowed_books 记录,所以没有什么可加入。

【讨论】:

    【解决方案2】:

    quickfix 可能会在删除之前执行更新;

    public function delete($id = null)
    {
        if ($id) {
            $delete = "DELETE FROM borrowed_books 
            WHERE id = '$id'; ";
    
            $mod="UPDATE `books` b
                  INNER JOIN `borrowed_books` a
                  SET b.nr_copies=b.nr_copies+1
                  WHERE b.id_book=a.id_book AND a.id = '$id'; ";
    
            $this->db->trans_start();
            // execute the update
            $this->db->query($mod);
            // then delete
            $this->db->query($delete);
            $this->db->trans_complete();
            if ($this->db->trans_status() === FALSE) {
                return false;
            } else {
                return true;
            }
        }   
    }
    

    更新查询条件;它正在寻找不存在的数据,因为您删除了它。因此,如果您进行更新(然后假设条件正确,您的查询会找到结果),它将更新..

    【讨论】:

    • "快速修复" ...因为更新您要删除的内容是正确的做法。你已经得到了公认的答案……在我告诉他出了什么问题 6 小时后。这不是答案,这只是在引导某人走上糟糕的编码之路。
    【解决方案3】:

    INNER JOIN 找不到您在交易的第一步中已经删除的数据,您需要在删除之前查询特定的borrowed_books 数据并将其保存在变量中。顺便说一句,我从来没有见过有人像UPDATE .... INNER JOINin sql 这样使用UPDATE,它让你的代码很混乱,我稍微改变你的代码,我认为它更容易理解。

    public function delete($id = null)
    {
        if ($id) {
            $borrowedBook = $this->db->query('SELECT * FROM borrowed_books WHERE id=' . $id);
    
            $delete = "DELETE FROM borrowed_books 
            WHERE id = '$id'; ";
    
    
            $mod = "UPDATE books SET nr_copies = nr_copies + 1 WHERE id_book = " . $borrowedBook->id_book;
    
            $this->db->trans_start();
            // execute the update
            $this->db->query($mod);
            // then delete
            $this->db->query($delete);
            $this->db->trans_complete();
            if ($this->db->trans_status() === FALSE) {
                return false;
            } else {
                return true;
            }
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多