cara mendapatkan id insert terakhir setelah memasukkan kueri dalam catatan aktif codeigniter


160

Saya memiliki permintaan memasukkan (gaya catatan aktif) yang digunakan untuk menyisipkan bidang formulir ke dalam tabel MySQL. Saya ingin mendapatkan id penambahan otomatis terakhir untuk operasi penyisipan sebagai nilai balik dari kueri saya, tetapi saya memiliki beberapa masalah dengannya.

Di dalam controller:

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

Dan di dalam model:

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

Saya tidak mendapatkan apa pun sebagai kembalinya add_post dalam model


4
Bagi mereka yang bertanya-tanya, db->insert_id()kembali falsesetelah a db->trans_complete(). Pastikan Anda mendapatkan milik Anda insert_id()sebelum menyelesaikan transaksi.
pbarney


Siapa pun tolong tandai sebagai duplikat.
kishor10d

Jawaban:


282

Coba ini

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

   return  $insert_id;
}

Dalam hal beberapa sisipan yang dapat Anda gunakan

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

1
Penggunaan transaksi yang tidak dibutuhkan. Jawaban @ Crowlix lebih ringkas.
Abraham Philip

1
@Abraham bagaimana dengan menyisipkan serentak?
Shekhar Joshi

3
@ShekharJoshi afaik fungsi insert_id () mengembalikan id dari insert terakhir yang dilakukan oleh objek db yang Anda gunakan. Ini harus menangani sisipan bersamaan, bukan? Harap perbaiki saya jika saya salah.
Abraham Philip

Bagaimana codeigniter tahu baris mana yang ditambahkan oleh objek tertentu?
Shekhar Joshi

3
@ShekharJoshi Ini bukan tentang objek, CI's insert_id () mengembalikan id yang dimasukkan terakhir sesuai MySQL last_insert_id () , yang membuat id yang dimasukkan terakhir dalam basis per koneksi. Karena itu, transaksi tidak diperlukan untuk id yang dimasukkan terakhir.
Sebastianb

65

Tidak diperlukan transaksi di sini, ini sudah cukup:

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

1
bagaimana dengan sisipan bersamaan?
Pimin Konstantin Kefaloukos

9
@ mander Saya percaya insert_id () mengembalikan id dari insert terakhir yang dilakukan oleh objek db dipanggil. Bahkan di hadapan sisipan serentak, bukankah ini berarti ia selalu mengembalikan id yang sesuai dengan sisipan objek db khusus ini?
Abraham Philip


10

Dari dokumentasi :

$ this-> db-> insert_id ()

Masukkan nomor ID saat melakukan sisipan basis data.

Karena itu, Anda dapat menggunakan sesuatu seperti ini:

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

3
Tolong jangan hanya memberikan tautan tetapi cobalah untuk meringkas solusinya di sini
abarisone

0

karena Anda telah memulai Transaksi melalui penyisipan data begitu, Periksa dulu transaksi selesai atau tidak. setelah Anda memulai transaksi, itu harus dilakukan atau kembalikan sesuai dengan status transaksi;

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

di atas, kami telah berkomitmen data pada transaksi yang sukses bahkan Anda mendapatkan cap waktu


0

Hanya untuk menyelesaikan topik ini: Jika Anda mengatur meja Anda dengan kunci primer dan kenaikan otomatis, Anda dapat menghilangkan proses penambahan id secara manual.

Lihatlah contoh ini

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

Sekarang Anda bisa memasukkan baris

$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

Menggunakan driver PHP mysqli, Anda tidak bisa mendapatkan insert_id setelah Anda komit.

Solusi sebenarnya adalah ini:

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

Sumber untuk struktur kode: https://codeigniter.com/user_guide/database/transactions.html#running-transactions- secara manual


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.