codeigniterアクティブレコードの挿入クエリの後に最後の挿入IDを取得する方法


160

フォームフィールドをMySQLテーブルに挿入するために使用する挿入クエリ(アクティブレコードスタイル)があります。クエリの戻り値として、挿入操作の最後に自動インクリメントされたIDを取得したいのですが、いくつか問題があります。

コントローラーの内部:

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()戻ります。トランザクションを完了する前に、必ずを取得してください。falsedb->trans_complete()insert_id()
pbarney 2016


誰でも重複としてマークしてください。
kishor10d 2017年

回答:


281

これを試して

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
@Abraham同時挿入はどうですか?
Shekhar Joshi 2015年

3
@ShekharJoshiから、insert_id()関数は、使用しているdbオブジェクトによって実行された最後の挿入のIDを返します。これは同時挿入を処理するはずですよね?私が間違っていたら訂正してください。
アブラハムフィリップ

codeigniterは、特定のオブジェクトによって追加された行をどのようにして知るのですか?
Shekhar Joshi 2015

3
@ShekharJoshiオブジェクトではなく、CIのinsert_id()は、最後に挿入されたIDを接続ごとに保持するMySQLのlast_insert_id()に従って最後に挿入されたIDを返します。このため、最後に挿入されたIDのトランザクションは必要ありません。
Sebastianb

65

ここではトランザクションは必要ありません。これで十分です:

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

1
同時挿入はどうですか?
Pimin Konstantin Kefaloukos 2014

9
@mander insert_id()は、呼び出されたdbオブジェクトによって実行された最後の挿入のIDを返すと思います。同時挿入が存在する場合でも、これは常にこの特定のdbオブジェクトが作成した挿入に対応するIDを返すことを意味しませんか?
アブラハムフィリップ


10

ドキュメントから:

$ this-> db-> insert_id()

データベース挿入を実行するときの挿入ID番号。

したがって、次のようなものを使用できます。

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

3
リンクだけではなく、ここで解決策を要約してみてください
アバリゾン

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

このトピックを完了するためだけに:主キーと自動インクリメントを使用してテーブルをセットアップする場合、IDを手動でインクリメントするプロセスを省略できます。

この例を確認してください

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/transactions.html#running-transactions-manually


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.