कोडिग्नर एक्टिव रिकॉर्ड में इन्सर्ट क्वेरी के बाद लास्ट इन्सर्ट आईडी कैसे प्राप्त करें


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()रिटर्न । लेन-देन पूरा करने से पहले सुनिश्चित करें कि आप अपना प्राप्त कर लें । falsedb->trans_complete()insert_id()
पब्ने १ney


कोई भी इसे डुप्लिकेट के रूप में चिह्नित करें।
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
@ समब्रश समवर्ती आवेषण के बारे में क्या?
शेखर जोशी

3
@ShekharJoshi af_ik सम्मिलित करें_id () फ़ंक्शन आपके द्वारा उपयोग किए जा रहे db ऑब्जेक्ट द्वारा की गई अंतिम प्रविष्टि की आईडी लौटाता है। यह समवर्ती आवेषण संभालना चाहिए, है ना? कृपया मुझे सुधारें अगर मैं गलत हूं।
अब्राहम फिलिप

कोडिगन को कैसे पता चलता है कि किसी विशेष वस्तु द्वारा कौन सी पंक्तियों को जोड़ा गया था?
शेखर जोशी

3
@ShekharJoshi यह ऑब्जेक्ट्स के बारे में नहीं है, CI का सम्मिलित_id () MySQL के last_insert_id () के अनुसार अंतिम सम्मिलित आईडी देता है , जो अंतिम सम्मिलित आईडी को प्रति-कनेक्शन आधार में रखता है। इस वजह से, अंतिम सम्मिलित आईडी के लिए लेनदेन की आवश्यकता नहीं है।
सेबस्टियनब

65

लेन-देन की यहाँ आवश्यकता नहीं है, यह पर्याप्त होना चाहिए:

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

1
समवर्ती आवेषण के बारे में क्या?
पिमिन कोंस्टेंटिन केफालकोस

9
@ मैं मानता हूं कि 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 ड्राइवर का उपयोग करने के बाद, आप डालने के बाद सम्मिलित नहीं कर सकते।

असली समाधान यह है:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.