Як отримати ідентифікатор останньої вставки після введення запиту в активний запис коду


160

У мене є запит на вставку (активний стиль запису), який використовується для вставки полів форми в таблицю MySQL. Я хочу отримати останній автоматично збільшений ідентифікатор для операції вставки як зворотне значення мого запиту, але у мене є деякі проблеми з цим.

Всередині контролера:

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

А всередині моделі:

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

Я нічого не отримую як повернення add_post в моделі


4
Для тих, хто цікавиться, db->insert_id()повертається falseпісля а db->trans_complete(). Переконайтеся, що ви отримаєте свої insert_id(), перш ніж завершити транзакцію.
pbarney


Будь-хто будь-ласка, позначте його як дублікат.
kishor10d

Відповіді:


282

Спробуйте це

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

   return  $insert_id;
}

У випадку декількох вставок, які ви можете використовувати

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

1
Необхідне використання транзакцій. @ Відповідь Кроулікса більш коротка.
Авраам Філіп

1
@Abraham, що з одночасними вставками?
Шехар Джоші

3
@ShekharJoshi afaik функції insert_id () повертає ідентифікатор останньої вставки, виконаної об'єктом db, який ви використовуєте. Це має обробляти паралельні вставки, чи не так? Будь ласка, виправте мене, якщо я помиляюся.
Авраам Філіп

Як кодигнатор знає, які рядки були додані певним об'єктом?
Шехар Джоші

3
@ShekharJoshi Справа не в об'єктах, CI's insert_id () повертає останній вставлений ідентифікатор відповідно до last_insert_id () MySQL , що зберігає останній вставлений ідентифікатор на основі з'єднання. Через це трансакції не потрібні для останніх вставлених ідентифікаторів.
Себастьянб

65

Тут транзакція не потрібна, цього має бути достатньо:

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

1
як щодо одночасних вставок?
Пімін Костянтин Кефалукос

9
@mander Я вважаю, що insert_id () повертає ідентифікатор останньої вставки, виконаної об'єктом db, на який він викликається. Навіть за наявності одночасних вставок, чи не означає це, що він завжди повертає ідентифікатор, відповідний вставці, зробленому саме цим db-об'єктом?
Авраам Філіп


10

З документації :

$ this-> db-> insert_id ()

Ідентифікаційний номер вставки при виконанні вставок у базу даних.

Тому ви можете використовувати щось подібне:

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

3
Будь ласка, не вказуйте лише посилання, але спробуйте узагальнити рішення тут
abarisone

0

оскільки ви ініціювали транзакцію над введенням даних, Перша перевірка транзакції завершена чи ні. щойно ви розпочали транзакцію, її слід здійснити або відкатати відповідно до стану транзакції;

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

у вищесказаному ми ввели дані про успішну транзакцію, навіть якщо ви отримаєте часову позначку


0

Просто для завершення цієї теми: Якщо ви налаштуєте свою таблицю за допомогою первинного ключа та автоматичного збільшення, ви можете опустити процес збільшення вручну ідентифікатора.

Ознайомтеся з цим прикладом

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

Тепер ви можете вставити рядки

$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

Використовуючи драйвер mysqli PHP, ви не зможете отримати insert_id після здійснення.

Справжнє рішення таке:

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

Джерело для структури коду: https://codeigniter.com/user_guide/database/transaction.html#running-transaction-manually


-1

Ви повинні використовувати $lastId = $this->db->insert_id();


приятель, якого ви можете використовувати вище, щоб отримати ідентифікатор останньої вставки
Pawan Kr

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.