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


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

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

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


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

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ą


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

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

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


-1

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


kolego, którego możesz użyć powyżej, aby uzyskać identyfikator ostatniego wstawienia
Pawan Kr

1
powtórzona odpowiedź
Rohit Dhiman,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.