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

Dev Afghanistan
sumber
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();
Sudz
sumber
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();
}
Crowlix
sumber
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
29
$id = $this->db->insert_id();
Simon Carlson
sumber
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();
Md.Jewel Mia
sumber
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

PANTAI KISHOR
sumber
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']
        ]);
Fabus
sumber
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;
}
nitol arafat
sumber
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

Tristan CHARBONNIER
sumber
-1

Anda harus menggunakan $lastId = $this->db->insert_id();

Pawan Kr
sumber
sobat bisa kamu gunakan di atas untuk mendapatkan id insert terakhir
Pawan Kr
1
duplikat jawaban
Rohit Dhiman