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


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

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

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


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

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


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

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

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.