แถวแทรก PHP / MySQL แล้วรับ 'id'


192

ฟิลด์ 'id' ของตารางอัตโนมัติของฉันเพิ่มขึ้นเมื่อฉันแทรกแถว ฉันต้องการแทรกแถวจากนั้นรับ ID นั้น

ฉันจะทำตามที่ฉันพูด แต่มีวิธีที่ฉันสามารถทำได้โดยไม่ต้องกังวลเกี่ยวกับเวลาระหว่างการแทรกแถวและรับรหัสหรือไม่

ฉันรู้ว่าฉันสามารถสืบค้นฐานข้อมูลสำหรับแถวที่ตรงกับข้อมูลที่ป้อน แต่มีการเปลี่ยนแปลงสูงจะมีการทำซ้ำโดยมีความแตกต่างเพียงอย่างเดียวคือ id

คำตอบ:


255
$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db');
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')");
$id = mysqli_insert_id($link);

mysqli_insert_id()ดู

ไม่ว่าคุณจะทำอะไรก็ตามอย่าใส่แล้วทำ " SELECT MAX(id) FROM mytable" อย่างที่คุณพูดมันเป็นสภาพการแข่งขันและไม่จำเป็นต้องมี mysqli_insert_id()มีฟังก์ชั่นนี้แล้ว


58
เทียบเท่า PDO คือ PDO :: lastInsertId ( us3.php.net/manual/th/pdo.lastinsertid.php )
Matthew Flaschen

11
มันยังใช้งานได้ไหมหากมี async 10,000 เม็ดในเวลาเดียวกัน?
zie1ony

16
@ zie1ony ใช่มันจะใช้งานได้กับการแทรก async นับล้านเพราะ MySQL เป็นไปตามข้อกำหนดของกรด การแทรกแต่ละครั้งจากแทรก async จำนวนมากอยู่ในเซสชันแยกต่างหากของตัวเองซึ่งเป็นที่มาของ ID เมื่อคุณเรียก mysql_insert_id () จาก PHP ของคุณ (หรือ LAST_INSERT_ID () ใน MySQL)
rodrigo-silveira

7
ในเอกสารมีบางอย่างที่ควรทราบ: mysql_insert_id() will convert the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT (64 bits) the conversion may result in an incorrect value. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query. For more information about PHP's maximum integer values, please see the integer documentation.\
Elbek

7
จำเป็นต้องเขียนทุกอย่างที่ฉันเคยเขียน -_-
de_nuit

39

ฟังก์ชั่น MySQL LAST_INSERT_ID()ทำสิ่งที่คุณต้องการ: มันจะเรียกคืน ID ที่ถูกแทรกในระหว่างเซสชันนี้ ดังนั้นจึงปลอดภัยที่จะใช้แม้ว่าจะมีกระบวนการอื่น (ตัวอย่างเช่นผู้ที่เรียกใช้สคริปต์เดียวกันนี้) ใส่ค่าลงในตารางเดียวกัน

ฟังก์ชั่น PHP mysql_insert_id()ไม่เช่นเดียวกับการเรียกด้วยSELECT LAST_INSERT_ID()mysql_query()


2
NB echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); ครั้งที่สองmysql_insert_id()ไม่ได้สะท้อน 600 ซึ่งเป็นไปตามที่mysql_query('SELECT LAST_INSERT_ID()')ต้องการ ในการรับmysql_insert_id()เพื่อแสดงถึงการเปลี่ยนแปลงคุณต้องทำการแทรกหรืออัพเดตก่อน (ซึ่งอาจมีผลต่อ 0 แถว) ดูย่อหน้าสุดท้ายของ: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

สำหรับเว็บไซต์ของ PHP ตอนนี้ mysql_insert_id เลิกใช้แล้วและเราต้องใช้ PDO เมื่อต้องการทำสิ่งนี้กับ PDO ให้ดำเนินการดังนี้:

$db = new PDO('mysql:dbname=database;host=localhost', 'user', 'pass');
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)');
$statement->execute( array(':name' => 'Bob', ':city' => 'Montreal') );

echo $db->lastInsertId();

4
เรามีตัวเลือกให้ใช้ PDO หรือ MySQLi (ซึ่งฉันอธิบายในคำตอบอื่นที่นี่) การเปรียบเทียบที่ดี: code.tutsplus.com/tutorials/ …
ลูกา

20

ตามที่ @NaturalBornCamper กล่าวว่าmysql_insert_id ตอนนี้เลิกใช้แล้วและไม่ควรใช้ ตอนนี้ตัวเลือกต่าง ๆ จะใช้ PDO หรือ mysqli NaturalBornCamper อธิบาย PDO ในคำตอบของเขาดังนั้นฉันจะแสดงวิธีการที่จะทำกับMySQLi ( MySQL ปรับปรุง ) โดยใช้mysqli_insert_id

// First, connect to your database with the usual info...
$db = new mysqli($hostname, $username, $password, $databaseName);
// Let's assume we have a table called 'people' which has a column
// called 'people_id' which is the PK and is auto-incremented...
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')");
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with:
$lastInsertedPeopleId = $db->insert_id;
// OR
$lastInsertedPeopleId = mysqli_insert_id($db);

ตรวจสอบเอกสารประกอบ PHP สำหรับตัวอย่างเพิ่มเติม: http://php.net/manual/en/mysqli.insert-id.php


ขอบคุณสำหรับการจับที่ ฉันชอบสัญกรณ์ดอทของ Javascript มากกว่าสัญกรณ์ลูกศรของ PHP : /
ลุค

7

ผมแค่อยากจะเพิ่มรายละเอียดเล็ก ๆ เกี่ยวกับการlastInsertId();

เมื่อป้อนมากกว่าหนึ่งแถวในเวลานั้นจะไม่ส่งคืนรหัสล่าสุดแต่เป็นรหัสแรกของการรวบรวมการแทรกล่าสุด

ลองพิจารณาตัวอย่างต่อไปนี้

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES
     (1, :userid),
     (2, :userid)';
$sql->addNewNames = $db->prepare($sql);
addNewNames->execute(array(':userid' => $userid));

echo $db->lastInsertId();

สิ่งที่เกิดขึ้นคือฉันกดmy_tableสองแถวใหม่ ID ของตารางเป็นการเพิ่มอัตโนมัติ varNumbที่นี่สำหรับผู้ใช้เดียวกันผมเพิ่มสองแถวที่มีที่แตกต่างกัน

ค่าที่สะท้อนในตอนท้ายจะเท่ากับ id ของแถวที่varNumb=1ซึ่งไม่ได้หมายความว่า id ของแถวสุดท้ายแต่เป็น id ของแถวแรกที่ถูกเพิ่มเข้ามาในคำขอสุดท้าย


ติดกับการดำเนินการครั้งละครั้ง - ดูเหมือนว่าจะเป็นคำตอบโดยรวมสำหรับวิธีการทั้งหมดที่ใช้เพื่อหลีกเลี่ยงพฤติกรรมที่ไม่คาดคิด
RozzA

1

ตัวอย่าง.

    $query_new = "INSERT INTO students(courseid, coursename) VALUES ('', ?)";
    $query_new = $databaseConnection->prepare($query_new);
    $query_new->bind_param('s', $_POST['coursename']);
    $query_new->execute();
    $course_id = $query_new->insert_id;
    $query_new->close();

บรรทัดรหัส $course_id = $query_new->insert_id;จะแสดง ID ของแถวที่แทรกล่าสุด หวังว่านี่จะช่วยได้


1

ลองแบบนี้คุณจะได้คำตอบ:

<?php
$con=mysqli_connect("localhost","root","","new");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')");

// Print auto-generated id
echo "New record has id: " . mysqli_insert_id($con);

mysqli_close($con);
?>

ดูลิงค์ต่อไปนี้:

http://www.w3schools.com/php/func_mysqli_insert_id.asp

http://php.net/manual/en/function.mysql-insert-id.php

นอกจากนี้โปรดทราบว่าส่วนขยายนี้เลิกใช้แล้วใน PHP 5.5 และลบออกใน PHP 7.0



0

ลองนี่สิ ... มันใช้งานได้สำหรับฉัน!

$sql = "INSERT INTO tablename (row_name) VALUES('$row_value')";
    if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    $msg1 = "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    $msg_error = "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

-1

อีกคำตอบที่เป็นไปได้คือ:

เมื่อคุณกำหนดตารางด้วยคอลัมน์และข้อมูลมันจะมี รหัสคอลัมน์สามารถมีคุณสมบัติAUTO_INCREMENT

โดยวิธีนี้คุณจะได้ไม่ต้องกังวลเกี่ยวกับIDก็จะได้รับการทำโดยอัตโนมัติ

ตัวอย่างเช่น (นำมาจากw3schools )

CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)

หวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน

แก้ไข: นี่เป็นเพียงส่วนหนึ่งที่คุณกำหนดวิธีสร้างรหัสอัตโนมัติเพื่อให้ได้มาหลังจากสร้างขึ้นคำตอบก่อนหน้านี้ก่อนหน้านั้นถูกต้อง


นี่ไม่ใช่คำตอบที่เป็นไปได้เลย OP ระบุว่าพวกเขากำลังใช้การเพิ่มอัตโนมัติ (เพิ่มอัตโนมัติ) OP ต้องการดึง ID ที่สร้างขึ้นโดยอัตโนมัติ
RozzA

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