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

Afghan Dev
la source
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();
Sudz
la source
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();
}
Crowlix
la source
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
29
$id = $this->db->insert_id();
Simon Carlson
la source
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();
Md.Jewel Mia
la source
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

PANTALON KISHOR
la source
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']
        ]);
Fabus
la source
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
la source
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

Tristan CHARBONNIER
la source
-1

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

Pawan Kr
la source
copain, vous pouvez utiliser ci-dessus pour obtenir le dernier identifiant d'insertion
Pawan Kr
1
duplicate answer
Rohit Dhiman