วิธีการรับรหัสแทรกครั้งสุดท้ายหลังจากแทรกแบบสอบถามในบันทึกที่ใช้งาน 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
@Abraham สิ่งที่เกี่ยวกับการแทรกเกิดขึ้นพร้อมกัน?
Shekhar Joshi

3
@ShekharJoshi afaik ฟังก์ชั่น insert_id () จะส่งกลับรหัสของการแทรกครั้งสุดท้ายที่ดำเนินการโดยวัตถุ db ที่คุณใช้ สิ่งนี้ควรจัดการกับส่วนที่แทรกพร้อมกันหรือไม่ โปรดแก้ไขฉันหากฉันผิด
อับราฮัมฟิลิป

Codeigniter รู้ได้อย่างไรว่าแถวใดที่ถูกเพิ่มโดยวัตถุใดวัตถุหนึ่ง
Shekhar Joshi

3
@ShekharJoshi ไม่ได้เกี่ยวกับวัตถุ insert_id () ของ CI จะส่งคืน id ที่แทรกล่าสุดตามlast_insert_idของ MySQL ซึ่งเก็บรหัสที่แทรกล่าสุดตามการเชื่อมต่อ ด้วยเหตุนี้การทำธุรกรรมจึงไม่จำเป็นสำหรับรหัสที่แทรกล่าสุด
Sebastianb

65

ไม่จำเป็นต้องทำธุรกรรมที่นี่สิ่งนี้น่าจะพอ:

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

1
สิ่งที่เกี่ยวกับการแทรกเกิดขึ้นพร้อมกัน?
Pimin Konstantin Kefaloukos

9
@ มาตรฐานฉันเชื่อว่า insert_id () คืนค่า id ของส่วนแทรกล่าสุดที่ดำเนินการโดยวัตถุ db ที่ถูกเรียกใช้ แม้ในที่ที่มีการแทรกเกิดขึ้นพร้อมกันสิ่งนี้จะไม่ได้หมายความว่ามันจะส่งกลับรหัสที่สอดคล้องกับการแทรกวัตถุฐานข้อมูลนี้ทำขึ้น?
อับราฮัมฟิลิป


10

จากเอกสาร :

$ this-> db-> insert_id ()

หมายเลข 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

เพียงเพื่อทำให้หัวข้อนี้เสร็จสมบูรณ์: หากคุณตั้งค่าตารางของคุณด้วยคีย์หลักและการเพิ่มอัตโนมัติคุณสามารถละเว้นกระบวนการเพิ่ม 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.