comment obtenir le dernier identifiant d'insertion après l'insertion d'une requête dans l'enregistrement actif de codeigniter


160

J'ai une requête d'insertion (style d'enregistrement actif) utilisée pour insérer les champs de formulaire dans une table MySQL. Je veux obtenir le dernier identifiant auto-incrémenté pour l'opération d'insertion comme valeur de retour de ma requête, mais j'ai quelques problèmes avec cela.

À l'intérieur du contrôleur:

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

Et modèle intérieur:

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

Je n'obtiens rien comme le retour de l'add_post dans le modèle


4
Pour ceux qui se demandent, db->insert_id()revient falseaprès a db->trans_complete(). Assurez-vous de bien avoir le vôtre insert_id()avant de terminer la transaction.
pbarney


N'importe qui, veuillez le marquer comme duplicata.
kishor10d

Réponses:


282

Essaye ça

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

   return  $insert_id;
}

En cas d'inserts multiples, vous pouvez utiliser

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

1
Utilisation inutile des transactions. La réponse de @ Crowlix est plus concise.
Abraham Philip

1
@Abraham qu'en est-il des insertions simultanées?
Shekhar Joshi

3
@ShekharJoshi afaik les fonctions insert_id () retourne l'id de la dernière insertion effectuée par l'objet db que vous utilisez. Cela devrait gérer les insertions simultanées, n'est-ce pas? Corrigez-moi si j'ai tort, s'il-vous plait.
Abraham Philip

Comment codeigniter sait-il quelles lignes ont été ajoutées par un objet particulier?
Shekhar Joshi

3
@ShekharJoshi Il ne s'agit pas d'objets, insert_id () de CI renvoie le dernier identifiant inséré selon last_insert_id () de MySQL , qui conserve le dernier identifiant inséré par connexion. Pour cette raison, les transactions ne sont pas nécessaires pour le dernier identifiant inséré.
Sebastianb

65

Une transaction n'est pas nécessaire ici, cela devrait suffire:

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

1
qu'en est-il des insertions simultanées?
Pimin Konstantin Kefaloukos

9
@mander Je crois que insert_id () renvoie l'id du dernier insert effectué par l'objet db sur lequel il est appelé. Même en présence d'insertions simultanées, cela ne signifie-t-il pas qu'il retourne toujours l'identifiant correspondant à l'insertion de cet objet DB particulier?
Abraham Philip


10

De la documentation :

$ this-> db-> insert_id ()

Numéro d'identification de l'insertion lors de l'insertion de la base de données.

Par conséquent, vous pouvez utiliser quelque chose comme ceci:

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

3
S'il vous plaît ne donnez pas seulement un lien mais essayez de résumer la solution ici
abarisone

0

parce que vous avez initié la transaction au cours de l'insertion de données donc, le premier contrôle la transaction terminée ou non. une fois que vous démarrez la transaction, elle doit être validée ou annulée en fonction du statut de la transaction;

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

dans ce qui précède, nous avons validé les données sur la transaction réussie même si vous obtenez l'horodatage


0

Juste pour terminer cette rubrique: Si vous configurez votre table avec une clé primaire et une incrémentation automatique, vous pouvez omettre le processus d'incrémentation manuelle de l'ID.

Regardez cet exemple

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

Vous pouvez maintenant insérer des lignes

$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

En utilisant le pilote PHP mysqli, vous ne pouvez pas obtenir le insert_id après votre validation.

La vraie solution est la suivante:

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

Source de la structure du code: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually


-1

Tu dois utiliser $lastId = $this->db->insert_id();


copain, vous pouvez utiliser ci-dessus pour obtenir le dernier identifiant d'insertion
Pawan Kr

1
duplicate answer
Rohit Dhiman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.