Hàng chèn PHP / MySQL sau đó nhận 'id'


192

Trường 'id' trong bảng của tôi tự động tăng khi tôi chèn một hàng. Tôi muốn chèn một hàng và sau đó lấy ID đó.

Tôi sẽ làm điều đó như tôi đã nói, nhưng có cách nào tôi có thể làm điều đó mà không phải lo lắng về thời gian giữa việc chèn hàng và nhận id không?

Tôi biết tôi có thể truy vấn cơ sở dữ liệu cho hàng khớp với thông tin đã nhập, nhưng có một sự thay đổi cao sẽ có các bản sao, với sự khác biệt duy nhất là id.

Câu trả lời:


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

Xem mysqli_insert_id().

Dù bạn làm gì, đừng chèn và sau đó thực hiện " SELECT MAX(id) FROM mytable". Như bạn nói, đó là một điều kiện cuộc đua và không cần. mysqli_insert_id()đã có chức năng này.


58
Tương đương PDO là PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen

11
Nó vẫn hoạt động nếu có 10000 chèn async cùng một lúc?
zie1ony

16
@ zie1ony Có, nó sẽ hoạt động với hàng triệu lần chèn không đồng bộ vì MySQL tuân thủ ACID. Mỗi lần chèn riêng lẻ từ nhiều phần chèn không đồng bộ nằm trong phiên riêng biệt của nó , đó là nơi ID xuất phát khi bạn gọi mysql_insert_id () từ PHP của bạn (hoặc LAST_INSERT_ID () trong MySQL)
Rodrigo-silveira

7
Trên tài liệu có một điều cần lưu ý: 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
cần viết lại mọi thứ tôi từng viết -_-
de_nuit

39

Hàm MySQL LAST_INSERT_ID()thực hiện đúng những gì bạn cần: nó lấy id được chèn trong phiên này . Vì vậy, nó an toàn để sử dụng, ngay cả khi có các quy trình khác (ví dụ người khác gọi cùng một tập lệnh) chèn các giá trị vào cùng một bảng.

Hàm PHP mysql_insert_id()thực hiện tương tự như gọi SELECT LAST_INSERT_ID()với 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()'); Thứ hai mysql_insert_id()không phản ánh 600, như mysql_query('SELECT LAST_INSERT_ID()')ý muốn. Để có được mysql_insert_id()phản ánh thay đổi, trước tiên bạn phải thực hiện thao tác chèn hoặc cập nhật (có thể ảnh hưởng đến 0 hàng). Xem đoạn cuối của: http://dev.mysql.com/doc/refman/5.0/en/inif-fifts.html#feft_last-insert-id
Cliffordlife

28

Đối với trang web của PHP, mysql_insert_id hiện không được dùng nữa và chúng tôi phải sử dụng PDO. Để thực hiện việc này với PDO, hãy tiến hành như sau:

$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
Chúng tôi có tùy chọn sử dụng PDO hoặc MySQLi (mà tôi mô tả trong câu trả lời khác ở đây). Một so sánh tốt: code.tutsplus.com/tutorials/ từ
Luke

20

Như @NaturalBornCamper đã nói, mysql_insert_id hiện không được dùng nữakhông nên sử dụng. Các tùy chọn hiện đang sử dụng PDO hoặc mysqli. NaturalBornCamper đã giải thích PDO trong câu trả lời của anh ấy, vì vậy tôi sẽ chỉ cho bạn cách thực hiện với MySQLi ( MySQL Cải tiến ) bằng 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);

Kiểm tra tài liệu PHP để biết thêm ví dụ: http://php.net/manual/en/mysqli.insert-id.php


Cảm ơn đã nắm bắt điều đó. Tôi thực sự thích ký hiệu chấm của Javascript hơn ký hiệu mũi tên của PHP. : /
Luke

7

Tôi chỉ muốn thêm một chi tiết nhỏ liên quan lastInsertId() ;

Khi nhập nhiều hơn một hàng tại thời điểm đó, nó không trả về Id cuối cùng mà là Id đầu tiên của bộ sưu tập các lần chèn cuối cùng.

Hãy xem xét ví dụ sau

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

Điều xảy ra ở đây là tôi đẩy vào my_tablehai hàng mới. Id của bảng là tự động tăng. Ở đây, cho cùng một người dùng, tôi thêm hai hàng với một hàng khác nhauvarNumb .

Giá trị được lặp lại ở cuối sẽ bằng id của hàng trong đó varNumb=1, có nghĩa không phải là id của hàng cuối cùng , mà là id của hàng đầu tiên được thêm vào trong yêu cầu cuối cùng.


Bám sát một thao tác tại một thời điểm - dường như là câu trả lời chung cho tất cả các phương pháp được sử dụng, để tránh các hành vi không mong muốn
RozzA

1

Một ví dụ.

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

Dòng mã $course_id = $query_new->insert_id;sẽ hiển thị ID của hàng được chèn cuối cùng. Hi vọng điêu nay co ich.


1

Hãy thử như thế này bạn có thể nhận được câu trả lời:

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

Hãy xem các liên kết sau:

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

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

Ngoài ra, vui lòng lưu ý rằng tiện ích mở rộng này không được hỗ trợ trong PHP 5.5 và đã bị xóa trong PHP 7.0



0

Hãy thử điều này ... nó làm việc cho tôi!

$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

Một câu trả lời khác có thể sẽ là:

Khi bạn xác định bảng, với các cột và dữ liệu sẽ có. Id cột có thể có thuộc tính AUTO_INCREMENT .

Theo phương pháp này, bạn không phải lo lắng về id , nó sẽ được thực hiện tự động .

Ví dụ: (lấy từ 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)
)

Hy vọng điều này sẽ hữu ích cho một ai đó.

Chỉnh sửa: Đây chỉ là phần mà bạn xác định cách tạo ID tự động, để có được nó sau khi tạo, các câu trả lời trước đó là đúng.


Đây hoàn toàn không phải là một câu trả lời, OP đã nói rằng họ đang sử dụng tính năng tăng tự động (tăng tự động). OP muốn lấy id đó được tạo tự động.
RozzA

Được rồi, sau khi đọc lại tôi đã nhận thấy rằng vấn đề không chỉ là tạo id, OP còn muốn lấy id đó. Cảm ơn định nghĩa: D
neoSmith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.