cómo obtener la última identificación de inserción después de la consulta de inserción en el registro activo codeigniter

160

Tengo una consulta de inserción (estilo de registro activo) utilizada para insertar los campos de formulario en una tabla MySQL. Quiero obtener la última identificación de incremento automático para la operación de inserción como el valor de retorno de mi consulta, pero tengo algunos problemas con ella.

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

Y dentro del modelo:

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

No obtengo nada como el regreso de add_post en el modelo

Dev afgano
fuente
44
Para aquellos que se preguntan, db->insert_id()regresa falsedespués de a db->trans_complete(). Asegúrese de obtener insert_id()los suyos antes de completar la transacción.
pbarney
Cualquiera, por favor márquelo como duplicado.
kishor10d

Respuestas:

282

Prueba esto

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

   return  $insert_id;
}

En caso de múltiples inserciones, puede usar

$this->db->trans_start();
$this->db->trans_complete();
Sudz
fuente
1
Uso innecesario de transacciones. La respuesta de @ Crowlix es más concisa.
Abraham Philip
1
@Abraham, ¿qué pasa con las inserciones concurrentes?
Shekhar Joshi
3
@ShekharJoshi afaik las funciones insert_id () devuelve la identificación de la última inserción realizada por el objeto db que está utilizando. Esto debería manejar inserciones concurrentes, ¿no? Por favor corrígeme si estoy equivocado.
Abraham Philip
¿Cómo sabe codeigniter qué filas fueron agregadas por un objeto en particular?
Shekhar Joshi
3
@ShekharJoshi No se trata de objetos, el insert_id () de CI devuelve la última identificación insertada según MySQL's last_insert_id () , que mantiene la última identificación insertada por conexión. Debido a esto, las transacciones no son necesarias para la última identificación insertada.
Sebastianb
65

Aquí no se necesita una transacción, esto debería ser suficiente:

function add_post($post_data) {
    $this->db->insert('posts',$post_data);
    return $this->db->insert_id();
}
Crowlix
fuente
1
¿Qué pasa con las inserciones concurrentes?
Pimin Konstantin Kefaloukos
9
@mander Creo que insert_id () devuelve la identificación de la última inserción realizada por el objeto db al que se llama. Incluso en presencia de inserciones concurrentes, ¿no significa esto que siempre devuelve la identificación correspondiente a la inserción que realizó este objeto db en particular?
Abraham Philip
29
$id = $this->db->insert_id();
Simon Carlson
fuente
10

De la documentación :

$ this-> db-> insert_id ()

El número de ID de inserción cuando se realizan inserciones de bases de datos.

Por lo tanto, podría usar algo como esto:

$lastid = $this->db->insert_id();
MD Joya Mia
fuente
3
No proporcione solo un enlace, sino intente resumir la solución aquí
abarisone
0

porque ha iniciado la Transacción sobre la inserción de datos, entonces, Primero verifique que la transacción se haya completado o no. una vez que comience la transacción, debe confirmarse o revertirse de acuerdo con el estado de la transacción;

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

en lo anterior, hemos comprometido los datos de la transacción exitosa incluso si recibe la marca de tiempo

KISHOR PANT
fuente
0

Solo para completar este tema: si configura su tabla con la clave principal y el incremento automático, puede omitir el proceso de incrementar manualmente la identificación.

Mira este ejemplo

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

Ahora puedes insertar filas

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

Usando el controlador mysqli PHP, no puede obtener el insert_id después de confirmar.

La verdadera solución es 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 );
  }
}

Fuente para la estructura del código: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually

Tristan CHARBONNIER
fuente
-1

Debes usar $lastId = $this->db->insert_id();

Pawan Kr
fuente
amigo que puedes usar arriba para obtener la última identificación de inserción
Pawan Kr
1
respuesta duplicada
Rohit Dhiman