Как получить последний идентификатор вставки после вставки запроса в активную запись codeigniter
У меня есть запрос вставки (активный стиль записи), используемый для вставки полей формы в таблицу MySQL. Я хочу получить последний auto-incremented id для операции insert как возвращаемое значение моего запроса, но у меня есть некоторые проблемы с ним.
Внутри контроллера:
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 в модели
Ответы
Ответ 1
Попробуйте это
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();
Ответ 2
Здесь транзакция не нужна, это должно быть достаточно:
function add_post($post_data) {
$this->db->insert('posts',$post_data);
return $this->db->insert_id();
}
Ответ 3
$id = $this->db->insert_id();
Ответ 4
В документации :
$this- > db- > insert_id()
Идентификационный номер вставки при вставке базы данных.
Следовательно, вы можете использовать что-то вроде этого:
$lastid = $this->db->insert_id();
Ответ 5
потому что вы инициировали транзакцию через вставку данных, поэтому: первая проверка транзакции завершена или нет. после запуска транзакции ее следует зафиксировать или откатить в соответствии со статусом транзакции;
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();
}
}''
Выше мы зафиксировали данные об успешной транзакции, даже если вы получили временную метку.
Ответ 6
Просто чтобы закончить эту тему:
Если вы настроили свою таблицу с помощью первичного ключа и автоматического увеличения, вы можете пропустить процесс ручного увеличения идентификатора.
Посмотрите этот пример
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']
]);
Ответ 7
**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;
}
Ответ 8
Используя 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
Ответ 9
Вы должны использовать $lastId = $this->db->insert_id();