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

Afghan Dev
quelle
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
Mögliches Duplikat von CodeIgniter activerecord, letzte Einfügungs-ID abrufen?
Shaiful Islam
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();
Sudz
quelle
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();
}
Crowlix
quelle
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
29
$id = $this->db->insert_id();
Simon Carlson
quelle
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();
Md.Jewel Mia
quelle
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

KISHOR PANT
quelle
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']
        ]);
Fabus
quelle
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
quelle
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

Tristan CHARBONNIER
quelle
-1

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

Pawan Kr
quelle
Kumpel, den Sie oben verwenden können, um die letzte Einfügungs-ID zu erhalten
Pawan Kr
1
doppelte Antwort
Rohit Dhiman