codeigniter aktif kaydında sorgu eklemeden sonra son ekleme kimliği nasıl alınır


160

Bir MySQL tabloya form alanları eklemek için kullanılan bir ekleme sorgusu (etkin kayıt stili) var. Benim sorgu dönüş değeri olarak ekleme işlemi için son otomatik artan kimliği almak istiyorum ama onunla bazı sorunlar var.

Kontrolörün içinde:

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

Ve iç 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();
}

Modelde add_post dönüşü olarak hiçbir şey almıyorum


4
Merak edenler için, db->insert_id()döner falsebir sonra db->trans_complete(). insert_id()İşlemi tamamlamadan önce aldığınızdan emin olun .
pbarney


Herkes lütfen kopya olarak işaretleyin.
kishor10d

Yanıtlar:


282

Bunu dene

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

   return  $insert_id;
}

Birden fazla kesici uç kullanmanız durumunda

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

1
İşlemlerin gereksiz kullanımı. @ Crowlix'in cevabı daha özlü.
Abraham Philip

1
@Abraham eşzamanlı uçlar ne olacak?
Shekhar Joshi

3
@ShekharJoshi afaik insert_id () işlevleri, kullandığınız db nesnesi tarafından gerçekleştirilen son ekin kimliğini döndürür. Bu, eşzamanlı uçları işlemelidir, değil mi? Yanılıyorsam lütfen beni düzeltin.
Abraham Philip

Codeigniter belirli bir nesne tarafından hangi satırların eklendiğini nasıl bilebilir?
Shekhar Joshi

3
@ShekharJoshi Nesnelerle ilgili değil, CI'nin insert_id () yöntemi, girilen son kimliği MySQL'in last_insert_id () yöntemine göre döndürür . Bu nedenle, son eklenen kimlikler için işlemlere gerek yoktur.
Sebastianb

65

Burada bir işleme gerek yoktur, bu yeterli olmalıdır:

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

1
eşzamanlı uçlar ne olacak?
Pimin Konstantin Kefaloukos

9
@mander insert_id () öğesinin çağrıldığı db nesnesi tarafından gerçekleştirilen son ekin kimliğini döndürdüğüne inanıyorum. Eşzamanlı kesici uçların varlığında bile, bu her zaman bu özel db nesnesinin yaptığı inserte karşılık gelen kimliği döndüreceği anlamına gelmez mi?
Abraham Philip


10

Gönderen belgeler :

) (This-> db-> insert_id, $

Veritabanı eklemeleri gerçekleştirilirken ekleme kimlik numarası.

Bu nedenle, böyle bir şey kullanabilirsiniz:

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

3
Lütfen sadece bir bağlantı vermeyin, ancak çözümü burada özetlemeye çalışın
abarisone

0

Veri ekleme işlemi üzerinden İşlem başlatmış olduğunuzdan, İlk önce işlemin tamamlanıp tamamlanmadığını kontrol edin. işleme başladıktan sonra işlemin durumuna göre işlem veya geri alma işlemi gerçekleştirilmelidir;

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

Yukarıda, zaman damgasını alsanız bile başarılı işlemle ilgili verileri taahhüt ettik


0

Sadece bu konuyu tamamlamak için: Tablonuzu birincil anahtar ve otomatik artışla ayarladıysanız, kimliği manuel olarak arttırma işlemini atlayabilirsiniz.

Bu örneğe göz atın

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

Şimdi satır ekleyebilirsiniz

$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

MySQL PHP sürücüsünü kullanarak, tamamladıktan sonra insert_id elde edemezsiniz.

Gerçek çözüm şudur:

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

Kod yapısı için kaynak: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.