So erhalten Sie die letzte Einfüge-ID nach der Einfügeabfrage im aktiven Datensatz des Codeigniters


160

Ich habe eine Einfügeabfrage (aktiver Datensatzstil), mit der die Formularfelder in eine MySQL-Tabelle eingefügt werden. Ich möchte die letzte automatisch inkrementierte ID für die Einfügeoperation als Rückgabewert meiner Abfrage erhalten, habe jedoch einige Probleme damit.

Im Controller:

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

Und Innenmodell:

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

Ich bekomme nichts als die Rückgabe des add_post im Modell


4
Für diejenigen, die sich fragen, db->insert_id()kehrt falsenach a db->trans_complete(). Stellen Sie sicher, dass Sie Ihre erhalten insert_id(), bevor Sie die Transaktion abschließen.
Pbarney


Jeder markiert es bitte als Duplikat.
kishor10d

Antworten:


280

Versuche dies

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

   return  $insert_id;
}

Bei mehreren Einsätzen können Sie verwenden

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

1
Nicht benötigte Verwendung von Transaktionen. @ Crowlix Antwort ist prägnanter.
Abraham Philip

1
@Abraham was ist mit gleichzeitigen Beilagen?
Shekhar Joshi

3
@ShekharJoshi afaik Die Funktionen insert_id () geben die ID der letzten Einfügung zurück, die von dem von Ihnen verwendeten Datenbankobjekt ausgeführt wurde. Dies sollte gleichzeitige Einfügungen behandeln, nicht wahr? Bitte korrigieren Sie mich, wenn ich falsch liege.
Abraham Philip

Woher weiß der Codeigniter, welche Zeilen von einem bestimmten Objekt hinzugefügt wurden?
Shekhar Joshi

3
@ShekharJoshi Es geht nicht um Objekte, CIs insert_id () gibt die zuletzt eingefügte ID gemäß MySQLs last_insert_id () zurück , wodurch die zuletzt eingefügte ID pro Verbindung erhalten bleibt. Aus diesem Grund werden für die zuletzt eingefügten IDs keine Transaktionen benötigt.
Sebastianb

65

Eine Transaktion wird hier nicht benötigt, dies sollte ausreichen:

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

1
Was ist mit gleichzeitigen Einsätzen?
Pimin Konstantin Kefaloukos

9
@mander Ich glaube, insert_id () gibt die ID der letzten Einfügung zurück, die von dem Datenbankobjekt ausgeführt wird, für das es aufgerufen wird. Würde dies nicht bedeuten, dass selbst bei gleichzeitigen Einfügungen immer die ID zurückgegeben wird, die der Einfügung dieses bestimmten Datenbankobjekts entspricht?
Abraham Philip


10

Aus der Dokumentation :

$ this-> db-> insert_id ()

Die Einfügungs-ID-Nummer beim Durchführen von Datenbankeinfügungen.

Daher könnten Sie so etwas verwenden:

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

3
Bitte geben Sie nicht nur einen Link, sondern versuchen Sie, die Lösung hier zusammenzufassen
Abarisone

0

Da Sie die Transaktion über die Dateneinfügung so initiiert haben, überprüfen Sie zunächst, ob die Transaktion abgeschlossen ist oder nicht. Sobald Sie die Transaktion gestartet haben, sollte sie je nach Status der Transaktion festgeschrieben oder zurückgesetzt werden.

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

Oben haben wir die Daten für die erfolgreiche Transaktion festgeschrieben, auch wenn Sie den Zeitstempel erhalten


0

Nur um dieses Thema zu vervollständigen: Wenn Sie Ihre Tabelle mit Primärschlüssel und automatischer Inkrementierung einrichten, können Sie den Vorgang des manuellen Inkrementierens der ID weglassen.

Schauen Sie sich dieses Beispiel an

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

Jetzt können Sie Zeilen einfügen

$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

Mit dem mysqli PHP-Treiber können Sie die insert_id nach dem Festschreiben nicht mehr abrufen.

Die wirkliche Lösung ist folgende:

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

Quelle für die Codestruktur: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually


-1

Sie müssen verwenden $lastId = $this->db->insert_id();


Kumpel, den Sie oben verwenden können, um die letzte Einfügungs-ID zu erhalten
Pawan Kr

1
doppelte Antwort
Rohit Dhiman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.