Làm thế nào để có được id chèn cuối cùng sau khi chèn truy vấn trong bản ghi hoạt động codeigniter


160

Tôi có một truy vấn chèn (kiểu bản ghi hoạt động) được sử dụng để chèn các trường biểu mẫu vào bảng MySQL. Tôi muốn lấy id tăng tự động cuối cùng cho hoạt động chèn làm giá trị trả về của truy vấn của mình nhưng tôi gặp một số vấn đề với nó.

Bên trong bộ điều khiển:

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);
}

Và mô hình bên trong:

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

Tôi không nhận được gì khi sự trở lại của add_post trong mô hình


4
Đối với những người đang tự hỏi, db->insert_id()trở về falsesau a db->trans_complete(). Hãy chắc chắn rằng bạn nhận được insert_id()trước khi bạn hoàn thành giao dịch.
pbarney


Bất cứ ai xin vui lòng đánh dấu nó là trùng lặp.
kishor10d

Câu trả lời:


281

Thử cái này

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

   return  $insert_id;
}

Trong trường hợp có nhiều chèn bạn có thể sử dụng

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

1
Sử dụng không cần thiết các giao dịch. Câu trả lời của @ Crowlix ngắn gọn hơn.
Abraham Philip

1
@Abraham những gì về chèn đồng thời?
Shekhar Joshi

3
@ShekharJoshi afaik các hàm insert_id () trả về id của lần chèn cuối cùng được thực hiện bởi đối tượng db bạn đang sử dụng. Điều này sẽ xử lý chèn đồng thời, không nên? Vui long sửa cho tôi nêu tôi sai.
Áp-ra-ham Philip

Làm thế nào để codeigniter biết những hàng nào được thêm bởi một đối tượng cụ thể?
Shekhar Joshi

3
@ShekharJoshi Không phải là về các đối tượng, insert_id () của CI trả về id được chèn cuối cùng theo last_insert_id () của MySQL , giữ id được chèn cuối cùng trên cơ sở mỗi kết nối. Do đó, các giao dịch không cần thiết cho id được chèn cuối cùng.
Sebastianb

65

Một giao dịch không cần thiết ở đây, điều này sẽ đủ:

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

1
những gì về chèn đồng thời?
Pimin Konstantin Kefaloukos

9
@mander Tôi tin rằng insert_id () trả về id của lần chèn cuối cùng được thực hiện bởi đối tượng db mà nó được gọi. Ngay cả khi có sự chèn đồng thời, điều này có nghĩa là nó luôn trả về id tương ứng với việc chèn đối tượng db cụ thể này được thực hiện?
Áp-ra-ham Philip


10

Từ tài liệu :

$ this-> db-> insert_id ()

Số ID chèn khi thực hiện chèn cơ sở dữ liệu.

Do đó, bạn có thể sử dụng một cái gì đó như thế này:

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

3
Vui lòng không chỉ cung cấp một liên kết mà hãy thử tóm tắt giải pháp tại đây
abarisone

0

bởi vì bạn đã bắt đầu Giao dịch qua việc chèn dữ liệu, nên lần đầu tiên kiểm tra giao dịch đã hoàn thành hay chưa. một khi bạn bắt đầu giao dịch, nó sẽ được cam kết hoặc phục hồi theo trạng thái của giao dịch;

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();
  }
}``

ở trên, chúng tôi đã cam kết dữ liệu về giao dịch thành công ngay cả khi bạn nhận được dấu thời gian


0

Chỉ cần hoàn thành chủ đề này: Nếu bạn thiết lập bảng của mình với khóa chính và tự động tăng, bạn có thể bỏ qua quá trình tăng id thủ công.

Kiểm tra ví dụ này

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 . ';');

Bây giờ bạn có thể chèn hàng

$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

Sử dụng trình điều khiển PHP mysqli, bạn không thể có được insert_id sau khi bạn cam kết.

Giải pháp thực sự là đây:

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 );
  }
}

Nguồn cho cấu trúc mã: https://codeigniter.com/user_guide/database/transilities.html#rasty-transilities-maningly


-1

Bạn phải dùng $lastId = $this->db->insert_id();


bạn thân bạn có thể sử dụng ở trên để nhận id chèn cuối cùng
Pawan Kr

1
câu trả lời trùng lặp
Rohit Dhiman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.