как получить последний идентификатор вставки после запроса вставки в активной записи codeigniter


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
Ненужное использование транзакций. Ответ @ Crowlix является более кратким.
Авраам Филипп

1
@ Абрахам, а как насчет одновременных вставок?
Шехар Джоши,

3
@ShekharJoshi afaik Функции insert_id () возвращают идентификатор последней вставки, выполненной объектом db, который вы используете. Это должно обрабатывать одновременные вставки, не так ли? Пожалуйста, поправьте меня, если я ошибаюсь.
Авраам Филипп

Как codeigniter узнает, какие строки были добавлены конкретным объектом?
Шехар Джоши

3
@ShekharJoshi Речь идет не об объектах, CI 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, для которого она была вызвана. Даже при наличии одновременных вставок, разве это не означает, что он всегда возвращает идентификатор, соответствующий вставке, сделанной этим конкретным объектом БД?
Авраам Филипп


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

Используя PHP-драйвер mysqli, вы не можете получить 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/transactions.html#running-transactions-manually


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.