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


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

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

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


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

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


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

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 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


-1

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


amigo que puedes usar arriba para obtener la última identificación de inserción
Pawan Kr

1
respuesta duplicada
Rohit Dhiman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.