【问题标题】:How to get all inserted records ids in codeigniter?如何在codeigniter中获取所有插入的记录ID?
【发布时间】:2019-03-20 03:03:28
【问题描述】:

如何在 codeigniter 中获取所有插入的记录 id ?我正在使用 insert_batch 函数插入多条记录,但 codeigniter $this->db->insert_id() 函数仅返回最后一条记录 id。 //但我需要所有插入的记录ID。如果有人有想法,请帮忙。

//In codeigniter this function returns only last inserted record id.

function insertStudent(){

    $data[] = array('firstname'=>'firstname1','lastname'=>'lastname1');

    $data[] = array('firstname'=>'firstname2','lastname'=>'lastname2');

    $result = $this->db->insert_batch( 'student', $data );

    return $this->db->insert_id();

}

【问题讨论】:

标签: php codeigniter codeigniter-3


【解决方案1】:

这可以通过使用 first id 和 count 来实现。

  1. 获取您正在插入的数据的计数。 (例如,您的示例中为 2)
  2. 通过$this->db->insert_id() 获取第一个插入ID(例如30)
  3. 现在通过 = first record id - (count - 1) 获取最后插入记录的 id(例如 30 + (2-1) = 31)

现在您可以查询以获取 id 的 30 和 31 之间的数据。

【讨论】:

  • 是的,这是最后一种方法。但是是否有任何函数可以返回 codeigniter 中所有插入的记录 id?或者我们可以修改 insert_id() 函数以返回多个 id。
  • 您可以修改,但不建议侵入核心文件。
  • 很简单,但如果你最终可能让你的代码在多主数据库方案之上运行,它就不会像预期的那样工作,因为自动增量字段将被抵消而不是顺序的
  • @JavierLarroulet 同意。考虑到这里的通用场景,它不会引起任何问题。
【解决方案2】:

如果您绝对必须为每个插入的行提供 insert_id,那么最简单、最防故障的方法是循环多个插入,而不是制作一个大的胖插入。

循环遍历多个插入将允许您获取所有 insert_id。如果其中一行插入失败并且数据库因此而拒绝它们,它还可以让您不会丢失所有数据。

【讨论】:

  • 是的,但它会起作用。在循环内插入查询对性能不利。
  • 实际上有很多“如果”。除非您在接近容量的情况下运行数据库服务器并在每次通过时进行数千次插入,否则时间差异和资源影响差异可以忽略不计。这其中没有必杀技,总会有取舍。制作多个插入可能有一些缺点,但如果做得正确,它并不是邪恶的。直到最近,我管理着一个小型数据库服务器,它每分钟更新几次,每次通过大约 6000 次插入。处理时间从未超过 500 毫秒
【解决方案3】:

我最好的解决方案是更新 DB_driver.php。

  • 发件人
public function is_write_type($sql)
{
  return (bool) (preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s+/i', $sql);
}
  • 收件人:
public function is_write_type($sql)
{
  return (bool) (preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX)\s+/i', $sql) && !preg_match('/ RETURNING /i', $sql));
}

【讨论】:

    【解决方案4】:

    真正安全的方法是:

    1. 在您的表中添加一列code
    2. 在批量插入[id session user]-[current time stamp]之前创建一个代码就足够了。
    3. 将具有该代码的所有元素批量插入code
    4. 查询Select 搜索该代码,您将在批量插入时插入所有元素

    【讨论】:

      【解决方案5】:

      这是一个有效的方法:

      由于您的记录有结果 ID,我假设它们也会自动递增。

      如果是这种情况,您这样做并仍然使用insert_batch

      这是你要做的:

      1. 您计算要插入的项目数:

        $count = count($data);
        
      2. 运行批量插入:

        $this->db->insert_batch('student', $data);
        
      3. 获取第一个插入的批次 ID:

        $first_id = $this->db->insert_id();
        
      4. 将计数(减 1)添加到您的插入 ID 以获取最后一条记录 ID。

        $last_id = $first_id + ($count-1);
        

      给你!您现在有了插入记录的第一个和最后一个 ID,并且通过扩展,还有介于两者之间的所有其他内容。

      【讨论】:

        【解决方案6】:
        function insertStudent(){
        
            $data[] = array('firstname'=>'firstname1','lastname'=>'lastname1');
        
            $data[] = array('firstname'=>'firstname2','lastname'=>'lastname2');
        
            $result = $this->db->insert_batch( 'student', $data );
        
            $a= $this->db->get('student');
            $data = $a->result_array();
            echo($data[0]['id']);
        
        }
        

        希望这会对你有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-02
          • 1970-01-01
          • 2016-11-26
          • 2020-03-04
          • 1970-01-01
          • 2012-06-21
          • 2014-10-05
          • 2016-02-20
          相关资源
          最近更新 更多