como obter o último ID de inserção após inserir consulta no registro ativo do codeigniter

160

Eu tenho uma consulta de inserção (estilo de registro ativo) usada para inserir os campos do formulário em uma tabela MySQL. Desejo obter o último ID auto-incrementado para a operação de inserção como o valor de retorno da minha consulta, mas tenho alguns problemas com ela.

Dentro do controlador:

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

Não recebo nada como o retorno do add_post no modelo

Afghan Dev
fonte
4
Para quem está se perguntando, db->insert_id()retorna falseapós a db->trans_complete(). Certifique-se de obter o seu insert_id()antes de concluir a transação.
Pbarney
Qualquer pessoa, por favor, marque-a como duplicada.
kishor10d

Respostas:

281

Tente isto

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

   return  $insert_id;
}

No caso de várias inserções, você pode usar

$this->db->trans_start();
$this->db->trans_complete();
Sudz
fonte
1
Uso desnecessário de transações. A resposta da @ Crowlix é mais concisa.
Abraham Philip
1
@Abraham e as inserções simultâneas?
Shekhar Joshi
3
@ShekharJoshi após as funções insert_id () retornam o ID da última inserção executada pelo objeto db que você está usando. Isso deve lidar com inserções simultâneas, não é? Por favor me corrija se eu estiver errado.
Abraham Philip
Como o codeigniter sabe quais linhas foram adicionadas por um objeto específico?
Shekhar Joshi
3
@ShekharJoshi Não se trata de objetos, o insert_id () do CI retorna o último ID inserido conforme last_insert_id () do MySQL , que mantém o último ID inserido em uma base por conexão. Por esse motivo, as transações não são necessárias para os últimos IDs inseridos.
Sebastianb
65

Uma transação não é necessária aqui, isso deve ser suficiente:

function add_post($post_data) {
    $this->db->insert('posts',$post_data);
    return $this->db->insert_id();
}
Crowlix
fonte
1
e as inserções simultâneas?
Pimin Konstantin Kefaloukos
9
@ commander Eu acredito que insert_id () retorna o ID da última inserção executada pelo objeto db no qual é chamado. Mesmo na presença de inserções simultâneas, isso não significa que sempre retorna o ID correspondente à inserção que esse objeto db específico fez?
Abraham Philip
29
$id = $this->db->insert_id();
Simon Carlson
fonte
10

A partir da documentação :

$ this-> db-> insert_id ()

O número de identificação da inserção ao executar inserções de banco de dados.

Portanto, você pode usar algo como isto:

$lastid = $this->db->insert_id();
Md.Jewel Mia
fonte
3
Por favor, não dão apenas um link, mas tentar resumir a solução aqui
abarisone
0

porque você iniciou a transação pela inserção de dados, a primeira verificação da transação foi concluída ou não. depois de iniciar a transação, ela deve ser confirmada ou revertida de acordo com o status da transação;

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

acima, confirmamos os dados da transação bem-sucedida, até você obtém o carimbo de data e hora

KISHOR PANT
fonte
0

Apenas para concluir este tópico: Se você configurar sua tabela com chave primária e incremento automático, poderá omitir o processo de incrementar manualmente o ID.

Confira este exemplo

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

Agora você pode inserir linhas

$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
fonte
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
fonte
0

Usando o driver PHP do mysqli, você não pode obter o insert_id após o commit.

A solução real é esta:

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

Origem da estrutura do código: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually

Tristan CHARBONNIER
fonte
-1

Você deve usar $lastId = $this->db->insert_id();

Pawan Kr
fonte
Amigo, você pode usar acima para obter última inserção id
Pawan Kr
1
resposta duplicada
Rohit Dhiman