Codeigniter活动记录中的插入查询后如何获取最后的插入ID


160

我有一个插入查询(活动记录样式),用于将表单字段插入到MySQL表中。我想获取插入操作的最后一个自动递增的ID作为查询的返回值,但是我有一些问题。

控制器内部:

function add_post(){
    $post_data = array(
        'id'            => '',
        'user_id'   =>  '11330',
        'content'   =>  $this->input->post('poster_textarea'),
        'date_time' => date("Y-m-d H:i:s"),
        'status'        =>  '1'
    );
    return $this->blog_model->add_post($post_data);
}

而内部模型:

function add_post($post_data){
    $this->db->trans_start();
    $this->db->insert('posts',$post_data);
    $this->db->trans_complete();
    return $this->db->insert_id();
}

作为模型中add_post的返回,我一无所获


4
对于那些谁正在琢磨,db->insert_id()返回falsedb->trans_complete()insert_id()完成交易之前,请确保获得的。
pbarney


任何人都请将其标记为重复。
kishor10d

Answers:


281

试试这个

function add_post($post_data){
   $this->db->insert('posts', $post_data);
   $insert_id = $this->db->insert_id();

   return  $insert_id;
}

如果有多次插入,您可以使用

$this->db->trans_start();
$this->db->trans_complete();

1
不需要使用交易。@Crowlix的答案更为简洁。
亚伯拉罕·菲利普

1
@Abraham如何进行并发插入?
Shekhar Joshi

3
@ShekharJoshi afaik insert_id()函数返回您所使用的db对象执行的最后插入的id。这应该处理并发插入,不是吗?如果我错了,请纠正我。
亚伯拉罕·菲利普

Codeigniter如何知道特定对象添加了哪些行?
Shekhar Joshi 2015年

3
@ShekharJoshi与对象无关,CI的insert_id()返回根据MySQL的last_insert_id()插入的最后一个ID,该ID保持每个连接中最后插入的ID。因此,最后插入的ID不需要事务。
塞巴斯蒂安

65

这里不需要交易,就足够了:

function add_post($post_data) {
    $this->db->insert('posts',$post_data);
    return $this->db->insert_id();
}

1
并发插入呢?
Pimin Konstantin Kefaloukos 2014年

9
@mander我相信insert_id()返回由它被调用的db对象执行的最后一次插入的id。即使存在并发插入,这是否也不意味着它总是返回与该特定db对象进行的插入对应的id?
亚伯拉罕·菲利普


10

文档中

$ this-> db-> insert_id()

执行数据库插入时的插入ID号。

因此,您可以使用以下方式:

$lastid = $this->db->insert_id();

3
请不要仅给出链接,而是尝试在此处总结解决方案
abarisone 2015年

0

因为您已经通过数据插入启动了事务处理,所以,首先检查事务处理是否完成。开始交易后,应根据交易状态进行提交或回滚;

function add_post($post_data){
  $this->db->trans_begin() 
  $this->db->insert('posts',$post_data);
  $this->db->trans_complete();
  if ($this->db->trans_status() === FALSE){
    $this->db->trans_rollback();
    return 0;
  }else{
    $this->db->trans_commit();
    return $this->db->insert_id();
  }
}``

在上面,即使您获得了时间戳,我们也已将数据提交到成功的事务中


0

只需完成此主题即可:如果使用主键设置表并自动递增,则可以省略手动递增id的过程。

看看这个例子

if (!$CI->db->table_exists(db_prefix() . 'my_table_name')) {
    $CI->db->query('CREATE TABLE `' . db_prefix() . "my_table_name` (
  `serviceid` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  `hash` varchar(32) NOT NULL,
  `url` varchar(120) NOT NULL,
  `datecreated` datetime NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=" . $CI->db->char_set . ';');

现在您可以插入行

$this->db->insert(db_prefix(). 'my_table_name', [
            'name'         => $data['name'],
            'hash'            => app_generate_hash(),
            'url'     => $data['url'],
            'datecreated'     => date('Y-m-d H:i:s'),
            'active'          => $data['active']
        ]);

0
**Inside Model**
function add_info($data){
   $this->db->insert('tbl_user_info',$data);
   $last_id = $this->db->insert_id();
   return  $last_id;
}

**Inside Controller**
public function save_user_record() {
  $insertId =  $this->welcome_model->save_user_info($data);
  echo $insertId->id;
}

0

使用mysqli PHP驱动程序,提交后无法获取insert_id。

真正的解决方案是这样的:

function add_post($post_data){
  $this->db->trans_begin();
  $this->db->insert('posts',$post_data);

  $item_id = $this->db->insert_id();

  if( $this->db->trans_status() === FALSE )
  {
    $this->db->trans_rollback();
    return( 0 );
  }
  else
  {
    $this->db->trans_commit();
    return( $item_id );
  }
}

代码结构源:https : //codeigniter.com/user_guide/database/transactions.html#running-transactions-manually


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.