jak uzyskać ostatni identyfikator wstawiania po zapytaniu wstawiania w aktywnym rekordzie Codeigniter

160

Mam zapytanie wstawiające (aktywny styl rekordu) używane do wstawiania pól formularza do tabeli MySQL. Chcę uzyskać ostatni automatycznie zwiększany identyfikator operacji wstawiania jako wartość zwracaną przez moje zapytanie, ale mam z nim pewne problemy.

Wewnątrz kontrolera:

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

Model wewnętrzny:

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

Nic nie dostaję jako zwrot add_post w modelu

Afghan Dev
źródło
4
Dla tych, którzy się zastanawiają, db->insert_id()wraca falsepo a db->trans_complete(). Upewnij się, że otrzymałeś je insert_id()przed zakończeniem transakcji.
pbarney
Każdy, proszę, oznaczyć to jako duplikat.
kishor10d

Odpowiedzi:

282

Spróbuj tego

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

   return  $insert_id;
}

W przypadku wielu wkładek możesz użyć

$this->db->trans_start();
$this->db->trans_complete();
Sudz
źródło
1
Niepotrzebne korzystanie z transakcji. Odpowiedź @ Crowlix jest bardziej zwięzła.
Abraham Philip
1
@Abraham a co z jednoczesnymi wstawkami?
Shekhar Joshi
3
@ShekharJoshi afaik funkcje insert_id () zwracają identyfikator ostatniego wstawienia wykonanego przez obiekt db, którego używasz. Powinno to obsłużyć współbieżne wstawki, prawda? Proszę popraw mnie jeżeli się mylę.
Abraham Philip
Skąd codeigniter wie, które wiersze zostały dodane przez określony obiekt?
Shekhar Joshi
3
@ShekharJoshi Nie chodzi o obiekty, funkcja insert_id () CI zwraca ostatnio wstawiony identyfikator zgodnie z last_insert_id () MySQL , który zachowuje ostatnio wstawiony identyfikator w zależności od połączenia. Z tego powodu transakcje nie są potrzebne dla ostatnio wstawionych identyfikatorów.
Sebastianb
65

Transakcja nie jest tutaj potrzebna, to powinno wystarczyć:

function add_post($post_data) {
    $this->db->insert('posts',$post_data);
    return $this->db->insert_id();
}
Crowlix
źródło
1
co z jednoczesnymi wstawkami?
Pimin Konstantin Kefaloukos
9
@mander Uważam, że insert_id () zwraca identyfikator ostatniego wstawienia wykonanego przez obiekt db, do którego jest wywoływany. Nawet w przypadku współbieżnych wstawień, czy nie oznacza to, że zawsze zwraca identyfikator odpowiadający wstawieniu tego konkretnego obiektu db?
Abraham Philip
29
$id = $this->db->insert_id();
Simon Carlson
źródło
10

Z dokumentacji :

$ this-> db-> insert_id ()

Numer ID wstawiania podczas wstawiania do bazy danych.

Dlatego możesz użyć czegoś takiego:

$lastid = $this->db->insert_id();
Md. Jewel Mia
źródło
3
Proszę nie podawać tylko linku, ale spróbuj podsumować rozwiązanie tutaj
abarisone
0

ponieważ zainicjowałeś transakcję po wprowadzeniu danych, więc najpierw sprawdź, czy transakcja została zakończona, czy nie. po rozpoczęciu transakcji należy ją zatwierdzić lub wycofać zgodnie ze statusem transakcji;

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

w powyższym potwierdziliśmy dane dotyczące udanej transakcji, nawet jeśli otrzymasz sygnaturę czasową

SPODNIE KISHOR
źródło
0

Aby zakończyć ten temat: Jeśli konfigurujesz tabelę z kluczem podstawowym i automatyczną inkrementacją, możesz pominąć proces ręcznego zwiększania identyfikatora.

Sprawdź ten przykład

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

Teraz możesz wstawiać wiersze

$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
źródło
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
źródło
0

Używając sterownika mysqli PHP, nie możesz pobrać insert_id po zatwierdzeniu.

Prawdziwe rozwiązanie jest takie:

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

Źródło struktury kodu: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually

Tristan CHARBONNIER
źródło
-1

Musisz użyć $lastId = $this->db->insert_id();

Pawan Kr
źródło
kolego, którego możesz użyć powyżej, aby uzyskać identyfikator ostatniego wstawienia
Pawan Kr
1
powtórzona odpowiedź
Rohit Dhiman,