मैं PHP में एक MySQL तालिका की अंतिम सम्मिलित आईडी कैसे प्राप्त करूं?


93

मेरे पास एक तालिका है जिसमें नया डेटा अक्सर डाला जाता है। मुझे तालिका की अंतिम आईडी प्राप्त करने की आवश्यकता है। मैं यह कैसे कर सकता हूँ?

क्या यह समान है SELECT MAX(id) FROM table?


1
हां, आप यह क्वेरी तालिका की अंतिम आईडी वापस कर देंगे। लेकिन एक शर्त यह है कि आईडी प्राथमिक कुंजी होनी चाहिए। इसलिए आप पश्चाताप से बच सकते हैं।
सतीश

7
@ सतीश: उस पद्धति की मुख्य समस्या संगामिति है
क्रिश्चियन सी। साल्वादो

3
विस्तृत करने के लिए: इसके साथ समस्या यह है कि यदि कोई व्यक्ति आपके INSERTऔर क्वेरी के बीच तालिका में कुछ सम्मिलित करता है MAX(id), तो आपको एक आईडी मिल सकती है जो आपकी अंतिम आईडी नहीं है।
deceze

3
@ इस सवाल पर एक साल बाद इस सवाल से हजारों कम विचार पूछे गए।
नफ्तली उर्फ ​​नील

3
@ ठीक है, तुम सही हो। दूसरे प्रश्न को इस एक के डुप्लिकेट के रूप में बंद किया जाना चाहिए।
जोसेलिन

जवाबों:


133

यदि आप पीडीओ का उपयोग कर रहे हैं, तो उपयोग करें PDO::lastInsertId

यदि आप मैसकली का उपयोग कर रहे हैं, तो उपयोग करें mysqli::$insert_id

यदि आप अभी भी मैसकल का उपयोग कर रहे हैं:

कृपया, mysql_*नए कोड में कार्यों का उपयोग न करें । वे अब बनाए नहीं हैं और आधिकारिक तौर पर पदावनत हैंलाल बॉक्स देखें? इसके बजाय तैयार किए गए कथनों के बारे में जानें, और PDO या MySQLi का उपयोग करें- यह लेख आपको यह तय करने में मदद करेगा कि कौन सा। यदि आप पीडीओ चुनते हैं, तो यहां एक अच्छा ट्यूटोरियल है

लेकिन अगर आपको इस्तेमाल करना है mysql_insert_id


इसके साथ समस्या यह है कि यदि आपके पास बहुत सारे आवेषण हो रहे हैं (जैसे कि आपका डेटाबेस भी कुछ लॉग करता है) तो आप गलत आईडी प्राप्त कर सकते हैं।
माइक

@ अगर आप के mysql_insert_id बाद सही का उपयोग नहीं करते mysql_query। यदि निश्चित रूप से आप बीच में एक ही कनेक्शन पर कई अन्य प्रश्नों को निष्पादित करते हैं, तो ठीक है, वहाँ कुछ भी नहीं है जो आपकी मदद कर सकता है।
deceze

7
गारंटी के लिए आपको कभी भी गलत आईडी नहीं मिलेगी, अपने कोड को एक ट्रांजेक्शन के साथ लपेटें ।
मार्सेलो असिस

28
mysql सुनिश्चित करता है कि यह CURRENT CONNECTION की अंतिम आईडी है, इसलिए यदि आप इस कथन को सम्मिलित क्वेरी के ठीक बाद रखते हैं तो कोई समस्या नहीं होगी। आवेषण करने वाली अन्य प्रक्रियाओं के बारे में कोई चिंता नहीं है। किसी लेनदेन में इसे लपेटने की आवश्यकता नहीं है। Mysql मैनुअल कहता है: "जो आईडी जनरेट की गई थी, उसे सर्वर पर प्रति-कनेक्शन के आधार पर बनाए रखा गया है। इसका मतलब है कि किसी दिए गए क्लाइंट को फ़ंक्शन द्वारा लौटाए गए मूल्य एक AUTO_INCREMENT कॉलम को प्रभावित करने वाले सबसे हालिया बयान के लिए उत्पन्न AUTO_INCREMENT मूल्य है। उस क्लाइंट के द्वारा । यही कारण है कि आपको
woens

1
@ डिसेज़, इस पूर्वाग्रह के साथ PDOकि हम हर जगह क्या देख रहे हैं? आइए एक बार फिर से फीचर की तुलना करें। यह स्पष्ट है कि mysqliविजेता तब होता है जब आपको अपने हाथों को निचले स्तर के सामान के साथ गंदा करने की आवश्यकता होती है। दूसरे शब्दों में, भले ही कोई पीडीओ चुनता है, उसे अंततःmysqli वैसे भी उपयोग करने की आवश्यकता होगी ।
पचेरियर

53

यह जानने के लिए एक फ़ंक्शन है कि वर्तमान कनेक्शन में अंतिम आईडी क्या डाली गई थी

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

अधिकतम का उपयोग करना एक बुरा विचार है क्योंकि इससे समस्याएं हो सकती हैं यदि आपका कोड दो अलग-अलग सत्रों में एक ही समय में उपयोग किया जाता है।

उस फ़ंक्शन को mysql_insert_id कहा जाता है


2
mysql _ (...) को PHP> = 5.5 संस्करण में चित्रित किया गया है।
Iago

हां, मैं बस उसे याद कर रहा हूं। :)
इगो


18

पीडीओ के साथ :

$pdo->lastInsertId();

मैसकली के साथ :

$mysqli->insert_id;

कृपया, mysql_*नए कोड में कार्यों का उपयोग न करें । वे अब बनाए नहीं हैं और आधिकारिक तौर पर पदावनत हैंलाल बॉक्स देखें? इसके बजाय तैयार किए गए कथनों के बारे में जानें, और PDO या MySQLi का उपयोग करें- यह लेख आपको यह तय करने में मदद करेगा कि कौन सा। यदि आप पीडीओ चुनते हैं, तो यहां एक अच्छा ट्यूटोरियल है



8

आपने जो लिखा है, वह आपको सबसे बड़ा idमानकर चलता है कि वे अद्वितीय और ऑटो-इन्क्रीमेंटेड थे जो ठीक मान लेंगे कि आप समसामयिक मुद्दों को आमंत्रित करने के साथ ठीक हैं।
चूंकि आप MySQL को अपने डेटाबेस के रूप में उपयोग कर रहे हैं, इसलिए एक विशिष्ट फ़ंक्शन है LAST_INSERT_ID()जो केवल वर्तमान कनेक्शन पर काम करता है जो सम्मिलित करता है।
PHP के लिए एक विशिष्ट कार्य भी कहा जाता है प्रदान करता है mysql_insert_id


6

कोशिश करें कि यह ठीक काम करे:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

1
ध्यान देने के लिए धन्यवाद। मैंने कोड को संपादित किया है, वास्तव में यह $ कड़ी है (कनेक्शन पकड़े हुए चर)
संधू

3

आप अंतर्निहित php फ़ंक्शन द्वारा नवीनतम सम्मिलित आईडी प्राप्त कर सकते हैं mysql_insert_id();

$id = mysql_insert_id();

आप भी नवीनतम आईडी प्राप्त करें

$id = last_insert_id();

4
इसके अलावा, यह गलत है क्योंकि यह एक पदावनत पुस्तकालय का उपयोग करने का सुझाव दे रहा है। वास्तव में, इसे हटाएं
STT LCU

@STTLCU यहाँ कौन सा स्निपेट पदावनत है?
TheBlackBenzKid

@ TheBlackBenzKid दोनों, क्योंकि वे mysql_ * फ़ंक्शंस पर आधारित हैं
STT LCU

@Rahul $ id = last_insert_id (); काम नहीं कर रहा है क्योंकि इसके पदावनत हो सकते हैं।
ईशा

3

कोडाइनाइटर में अंतिम सम्मिलित आईडी प्राप्त करने के लिए, सम्मिलित क्वेरी को निष्पादित करने के बाद insert_id()डेटाबेस पर कॉल किए गए एक फ़ंक्शन का उपयोग करें, यह अंतिम सम्मिलित आईडी वापस कर देगा

उदाहरण के लिए:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

एक पंक्ति में

echo $this->db->insert('mytable',$data)->insert_id();

3

इसका उपयोग करना ठीक है mysql_insert_id(), लेकिन इसका उपयोग करने के बारे में एक विशिष्ट नोट है, आपको इसे INSERT क्वेरी के क्रियान्वयन के बाद कॉल करना होगा, इसका मतलब एक ही स्क्रिप्ट सत्र में है। यदि आप इसका उपयोग करते हैं अन्यथा यह सही ढंग से काम नहीं करेगा।


2

साफ और सरल -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

नोट: यदि आप एक स्टेटमेंट mysqli के साथ कई इन्सर्ट करते हैं :: insert_id सही नहीं होगा।

टेबल:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

अब अगर तुम करते हो:

insert into xyz (name) values('one'),('two'),('three');

Mysqli :: insert_id 1 नहीं 3 होगा।

सही मान प्राप्त करने के लिए:

mysqli::insert_id + mysqli::affected_rows) - 1

यह दस्तावेज़ है, लेकिन यह थोड़ा अस्पष्ट है।


1

मैं अपनी पसंद की तालिका के अंतिम auto_increment id प्राप्त करने के लिए एक शुद्ध MySQL सिंटैक्स का उपयोग करना पसंद करता हूं।

php mysql_insert_id () और mysql last_insert_id () केवल अंतिम लेनदेन आईडी दें।

यदि आप अपने स्कीमा में किसी भी तालिका की अंतिम स्वत: संवर्धित आईडी चाहते हैं (न केवल अंतिम लेनदेन एक), तो आप इस क्वेरी का उपयोग कर सकते हैं

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

बस।


मुझे इस बारे में संदेह है, क्योंकि यह एसक्यूएल प्रश्न के संदर्भ में केवल गलत है .... साथ ही यह विधि संभव दौड़ की स्थिति के लिए प्रवण महसूस करती है जब दो या अधिक ग्राहक एक ही समय में इस एसक्यूएल को निष्पादित करते हैं ... मुझे यकीन नहीं है कितनी तेजी से इस कॉलम डेटा को एक डालने के बाद अद्यतन किया जाता है जो मुझे संदेहपूर्ण बनाता है ..। PHP फ़ंक्शन जो अंतिम आईडी प्राप्त कर सकते हैं, कनेक्शन / सत्र स्तर (MySQL के LAST_INSERT_ID () ) के समान है जो इसे रेस कंडीशन सेव बनाता है
रेमंड निजलैंड

1

एक उदाहरण के साथ कोई जवाब नहीं देखना दुखद है।

मैसकली का उपयोग :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

PDO :: lastInsertId का उपयोग करना :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

MySQLiलेन-देन का उपयोग करना मैं कभी-कभी प्राप्त करने में सक्षम नहीं था mysqli::$insert_id, क्योंकि यह 0. लौटा था। खासकर अगर मैं संग्रहीत प्रक्रियाओं का उपयोग कर रहा था, तो यह निष्पादित हो रहा है INSERT। इसलिए लेनदेन के भीतर एक और तरीका है:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

Mysqli का उपयोग करें क्योंकि mysql निंदनीय है

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

0

मैंने कोशिश की

mysqli_insert_id ($ dbConnectionObj)

यह वर्तमान कनेक्शन की अंतिम सम्मिलित आईडी लौटाता है इसलिए यदि आप अपने कनेक्शन को ठीक से प्रबंधित कर रहे हैं तो यह काम करना चाहिए। मेरे लिए कम से कम काम किया।


0

कृपया पीडीपी का उपयोग करें और फिर यह प्रयास करें

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();


-1

इस सभी चर्चा से मैं यह मानता हूं कि अधिकतम आईडी की जांच करने का कारण यह जानना है कि आईडी क्या होनी चाहिए .. (यदि मेरी अधिकतम आईडी 5 है तो अगला 5 + 1 = 6 होगा)।

>> अगर यह कारण नहीं है, तो मेरी सबसे अच्छी माफी

यदि आपके CHECK और INSERT के बीच कोई और INSERT की जानकारी देता है तो मामला आपको गलत आईडी देगा।

तो यह हल किया जा सकता है अगर आप हैश बनाएंगे जिसमें टाइमस्टैम्प या अन्य अद्वितीय मूल्य शामिल हो सकते हैं।

फिर उसी फ़ंक्शन में आप खाली मान और अपने हैश के साथ अपनी जानकारी सम्मिलित कर सकते हैं। यदि आपके पास AUTO_INCRECEMENT चयनित है, तो ID बनाएगा।

फिर उसी फ़ंक्शन में आपके पास अभी भी आपका हैश होगा और आप उसी हैश के साथ आईडी की तलाश कर सकते हैं। और फिर आप mysql UPDATE के साथ रिक्त मानों को पूरा कर सकते हैं।

इसमें कुछ और कनेक्शन शामिल हैं, लेकिन यह अभी भी इसे करने का एक तरीका है ...

इसे हल करना सौभाग्य है।


-2

यदि आपकी तालिका में उपयोगकर्ता का नाम, Emp_ID जैसे AUTO INCREMENT कॉलम है, तो आप इस क्वेरी का उपयोग अंतिम सम्मिलित रिकॉर्ड प्राप्त करने के लिए कर सकते हैं * FROM table_name से जहां UserID = (MAX_ का चयन करें) (PHPID) से ( PHP में ) PHP कोड में।

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

फिर आप अपनी आवश्यकता के अनुसार प्राप्त डेटा का उपयोग कर सकते हैं


पासवर्ड को एन्क्रिप्ट न करें , जब हमलावर को डीबी मिलता है तो उसे एन्क्रिप्शन कुंजी भी मिलेगी।
ज़ाफ १

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.