ฉันจะรับ ID ที่แทรกล่าสุดของตาราง MySQL ใน PHP ได้อย่างไร


93

ฉันมีตารางที่ใส่ข้อมูลใหม่บ่อยๆ ฉันต้องการรับ ID สุดท้ายของตาราง ฉันจะทำเช่นนี้ได้อย่างไร?

จะคล้ายกับSELECT MAX(id) FROM table?


1
ใช่คุณแบบสอบถามนี้จะส่งคืน id สุดท้ายของตาราง แต่มีเงื่อนไขอย่างหนึ่งคือ ID ต้องเป็นคีย์หลัก ดังนั้นคุณสามารถหลีกเลี่ยงการกลับใจ
sathish

7
@sathish: ปัญหาหลักของวิธีการที่เป็นเห็นพ้องด้วย
Christian C. Salvadó

3
เพื่ออธิบายรายละเอียด: ปัญหาคือถ้ามีคนอื่นแทรกบางอย่างลงในตารางระหว่างคุณINSERTและแบบสอบถามสำหรับMAX(id)คุณอาจได้รับรหัสที่ไม่ใช่รหัสสุดท้ายของคุณ
หลอกลวง

3
@Jocelyn คำถามนั้นถูกถามในหนึ่งปีต่อมาโดยมีจำนวนการดูน้อยกว่าคำถามนี้
Naftali aka Neal

3
@ นีลคุณพูดถูก คำถามอื่นควรปิดว่าซ้ำกับคำถามนี้
Jocelyn

คำตอบ:


134

หากคุณใช้ PDO ให้ใช้PDO::lastInsertIdไฟล์.

หากคุณกำลังใช้ MySQLi mysqli::$insert_idใช้

หากคุณยังคงใช้ Mysql:

กรุณาอย่าใช้mysql_*ฟังก์ชั่นในรหัสใหม่ พวกเขาจะไม่เก็บรักษาไว้และมีการยกเลิกอย่างเป็นทางการ เห็นกล่องสีแดงไหม เรียนรู้เกี่ยวกับคำสั่งที่เตรียมไว้แทนและใช้ PDOหรือ MySQLi -บทความนี้จะช่วยคุณตัดสินใจเลือก หากคุณเลือกที่ PDO,นี่คือการสอนที่ดี

แต่ถ้าต้องใช้mysql_insert_id.


ปัญหาของสิ่งนี้คือถ้าคุณมีส่วนแทรกจำนวนมากเกิดขึ้น (เช่นฐานข้อมูลของคุณบันทึกบางอย่างด้วย) คุณจะได้รับ ID ที่ไม่ถูกต้อง
ไมค์

@ ไมค์ไม่ได้ถ้าคุณใช้mysql_insert_id ทันทีหลังจากที่mysql_queryคุณ หากแน่นอนว่าคุณดำเนินการค้นหาอื่น ๆ ในการเชื่อมต่อเดียวกันระหว่างกันก็ไม่มีอะไรที่จะช่วยคุณได้
หลอกลวง

7
การรับประกันคุณจะไม่ได้รับรหัสผิดห่อรหัสของคุณด้วยการทำธุรกรรม
Marcelo Assis

28
mysql ตรวจสอบให้แน่ใจว่านี่เป็นรหัสสุดท้ายของการเชื่อมต่อปัจจุบันดังนั้นจะไม่มีปัญหาหากคุณใส่คำสั่งนี้ทันทีหลังข้อความค้นหาแทรก ไม่ต้องกังวลกับกระบวนการอื่น ๆ ในการทำเม็ดมีดไม่จำเป็นต้องห่อสิ่งนี้ในธุรกรรม คู่มือ mysql ระบุว่า: "ID ที่สร้างขึ้นจะถูกเก็บรักษาไว้ในเซิร์ฟเวอร์ตามการเชื่อมต่อแต่ละครั้งซึ่งหมายความว่าค่าที่ฟังก์ชันส่งคืนไปยังไคลเอ็นต์ที่กำหนดคือค่า AUTO_INCREMENT แรกที่สร้างขึ้นสำหรับคำสั่งล่าสุดที่มีผลต่อคอลัมน์ AUTO_INCREMENT โดยลูกค้ารายนั้นนี่คือเหตุผลที่คุณไม่ควรใช้ select MAX (ID)
woens

1
@deceze อะไรคืออคติที่PDOเราเห็นทุกที่? มาดูการเปรียบเทียบคุณสมบัติอีกครั้ง ชัดเจนว่าmysqliเป็นผู้ชนะเมื่อคุณต้องทำให้มือของคุณสกปรกด้วยของที่มีระดับต่ำ กล่าวอีกนัยหนึ่งแม้ว่าใครจะเลือก PDO แต่ในที่สุดเขาก็ต้องใช้mysqliอยู่ดี
Pacerier

52

มีฟังก์ชั่นที่จะทราบว่า ID สุดท้ายที่แทรกอยู่ในการเชื่อมต่อปัจจุบันคืออะไร

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

การใช้maxเป็นความคิดที่ไม่ดีเพราะอาจทำให้เกิดปัญหาได้หากใช้โค้ดของคุณพร้อมกันในสองเซสชันที่ต่างกัน

ฟังก์ชันนั้นเรียกว่าmysql_insert_id


2
mysql _ (... ) เลิกใช้งานแล้วในเวอร์ชัน PHP> = 5.5
Iago

ใช่ฉันเพิ่งจำได้ :)
Iago


19

ด้วยPDO :

$pdo->lastInsertId();

กับMysqli :

$mysqli->insert_id;

กรุณาอย่าใช้mysql_*ฟังก์ชั่นในรหัสใหม่ พวกเขาจะไม่เก็บรักษาไว้และมีการยกเลิกอย่างเป็นทางการ เห็นกล่องสีแดงไหม เรียนรู้เกี่ยวกับคำสั่งที่เตรียมไว้แทนและใช้ PDOหรือ MySQLi -บทความนี้จะช่วยคุณตัดสินใจเลือก หากคุณเลือกที่ PDO,นี่คือการสอนที่ดี



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
ขอบคุณที่แจ้งให้ทราบ ฉันได้แก้ไขโค้ดแล้วจริงๆแล้วมันคือ $ link (ตัวแปรที่ถือการเชื่อมต่อ)
Sandhu

3

เพื่อรับ id ที่แทรกล่าสุดใน codeigniter หลังจากดำเนินการค้นหาการแทรกเพียงใช้ฟังก์ชันเดียวที่เรียกinsert_id()บนฐานข้อมูลมันจะส่งคืน id ที่แทรกล่าสุด

เช่น:

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

ในบรรทัดเดียว

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

2

คุณสามารถรับ ID ที่แทรกล่าสุดได้โดยใช้ฟังก์ชัน php ในตัว mysql_insert_id();

$id = mysql_insert_id();

คุณยังได้รับรหัสล่าสุดโดย

$id = last_insert_id();

5
นอกจากนี้ยังไม่ถูกต้องเนื่องจากแนะนำให้ใช้ไลบรารีที่เลิกใช้แล้ว จริงๆลบสิ่งนี้
STT LCU

@STTLCU ตัวอย่างใดที่นี่เลิกใช้งาน?
TheBlackBenzKid

@TheBlackBenzKid ทั้งคู่เพราะมันขึ้นอยู่กับฟังก์ชัน mysql_ *
STT LCU

@ ราหุล $ id = last_insert_id (); ไม่ทำงานเนื่องจากอาจเลิกใช้งานแล้ว
Esha

2

ใช้งาน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

ฉันชอบใช้ไวยากรณ์ MySQL บริสุทธิ์เพื่อรับรหัส auto_increment สุดท้ายของตารางที่ฉันต้องการ

php mysql_insert_id () และ mysql last_insert_id () ให้เฉพาะ ID ธุรกรรมล่าสุด

หากคุณต้องการ auto_incremented ID สุดท้ายของตารางใด ๆ ในสคีมาของคุณ (ไม่ใช่เฉพาะรายการสุดท้าย) คุณสามารถใช้คำค้นหานี้ได้

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

แค่นั้นแหละ.


ฉันสงสัยมากเกี่ยวกับเรื่องนี้เนื่องจาก SQL นี้ผิดในบริบทของคำถาม .... นอกจากนี้วิธีนี้ยังรู้สึกว่ามีแนวโน้มที่จะเกิดสภาวะการแข่งขันที่เป็นไปได้เมื่อไคลเอนต์สองรายขึ้นไปเรียกใช้ SQL นี้ในเวลาเดียวกัน ... ฉันไม่แน่ใจ ข้อมูลคอลัมน์นี้อัปเดตเร็วเพียงใดหลังจากการแทรกซึ่งทำให้ฉันสงสัยอย่างเต็มที่ .. ฟังก์ชัน PHP ที่สามารถรับ id สุดท้ายนั้นขึ้นอยู่กับระดับการเชื่อมต่อ / เซสชัน (ทำมากหรือน้อยเช่นเดียวกับLAST_INSERT_ID ()ของ MySQL ) ซึ่งทำให้สภาพการแข่งขันประหยัด
Raymond Nijland

1

เป็นเรื่องน่าเศร้าที่จะไม่เห็นคำตอบพร้อมตัวอย่าง

ใช้Mysqli :: $ 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. เฉพาะอย่างยิ่งถ้าผมใช้วิธีการจัดเก็บที่ดำเนินINSERTs ดังนั้นจึงมีอีกวิธีหนึ่งในการทำธุรกรรม:

<?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();
?>

-1

ฉันเหนื่อย

mysqli_insert_id($dbConnectionObj)

สิ่งนี้จะส่งคืน ID ที่แทรกล่าสุดของการเชื่อมต่อปัจจุบันดังนั้นหากคุณจัดการการเชื่อมต่ออย่างถูกต้องสิ่งนี้ควรใช้งานได้ ทำงานให้ฉันอย่างน้อย


1
นี่คือคำตอบเดียวกับที่นี่stackoverflow.com/a/41564156/5468463
Vega

ด้วยคะแนนโหวตเชิงลบโพสต์ที่ซ้ำซ้อนนี้อาจถูกลบออกโดยชุมชนแทนที่จะรบกวนผู้ดูแล
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.