come ottenere l'ultimo ID di inserimento dopo l'inserimento della query nel record attivo di codeigniter


160

Ho una query di inserimento (stile di record attivo) utilizzata per inserire i campi del modulo in una tabella MySQL. Voglio ottenere l'ultimo ID auto-incrementato per l'operazione di inserimento come valore di ritorno della mia query ma ho dei problemi con esso.

All'interno del 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);
}

E modello interno:

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

Non ottengo nulla come il ritorno di add_post nel modello


4
Per coloro che si chiedono, db->insert_id()ritorna falsedopo a db->trans_complete(). Assicurati di ottenere il tuo insert_id()prima di completare la transazione.
barbar


Per favore, contrassegnalo come duplicato.
kishor10d,

Risposte:


282

Prova questo

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

   return  $insert_id;
}

In caso di inserti multipli è possibile utilizzare

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

1
Uso non necessario delle transazioni. La risposta di @ Crowlix è più concisa.
Abraham Philip,

1
@Abraham per quanto riguarda gli inserti simultanei?
Shekhar Joshi,

3
@ShekharJoshi afaik le funzioni insert_id () restituisce l'id dell'ultimo inserimento eseguito dall'oggetto db che stai utilizzando. Questo dovrebbe gestire inserimenti simultanei, non è vero? Per favore correggimi se sbaglio.
Abraham Philip,

Come fa il codeigniter a sapere quali righe sono state aggiunte da un particolare oggetto?
Shekhar Joshi,

3
@ShekharJoshi Non si tratta di oggetti, insert_id () di CI restituisce l'ultimo ID inserito come last_insert_id () di MySQL , che mantiene l'ultimo ID inserito in una base per connessione. Per questo motivo, le transazioni non sono necessarie per gli ultimi ID inseriti.
Sebastianb

65

Non è necessaria una transazione qui, questo dovrebbe essere sufficiente:

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

1
che dire degli inserti simultanei?
Pimin Konstantin Kefaloukos,

9
@mander Credo che insert_id () restituisca l'id dell'ultimo inserimento eseguito dall'oggetto db su cui viene chiamato. Anche in presenza di inserimenti simultanei, ciò non significherebbe che restituisce sempre l'id corrispondente all'inserto creato da questo particolare oggetto db?
Abraham Philip,


10

Dalla documentazione :

$ This-> db-> insert_id ()

Il numero ID di inserimento quando si eseguono inserimenti di database.

Pertanto, è possibile utilizzare qualcosa del genere:

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

3
Per favore non dare solo un link ma prova a sintetizzare qui la soluzione
abarisone,

0

perché hai avviato la Transazione sull'inserimento dei dati in modo tale, Il primo controlla la transazione completata o meno. una volta avviata la transazione, è necessario eseguire il commit o il rollback in base allo stato della transazione;

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

in quanto sopra, abbiamo impegnato i dati sulla transazione di successo anche se si ottiene il timestamp


0

Solo per completare questo argomento: se imposti la tabella con chiave primaria e incremento automatico, puoi omettere il processo di incremento manuale dell'ID.

Dai un'occhiata a questo esempio

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

Ora puoi inserire le righe

$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

Utilizzando il driver mysqli PHP, non è possibile ottenere insert_id dopo aver eseguito il commit.

La vera soluzione è questa:

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

Fonte per la struttura del codice: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.