2009-05-22 31 views
182

Trường 'id' của 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 đó nhận được ID đó.PHP/MySQL chèn hàng rồi nhận 'id'

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

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

Trả lời

239
$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". Giống như bạn nói, đó là một điều kiện chủng tộc và không cần thiết. mysqli_insert_id() đã có chức năng này.

+54

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

+0

Tuyệt vời - không biết điều này đã tồn tại! –

+0

liên kết dẫn tôi đến phiên bản tiếng Nga của mysql_insert_id @ php.net: P – Alisso

37

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

Chức năng PHP mysql_insert_id() cũng giống như gọi SELECT LAST_INSERT_ID() với mysql_query().

+2

NB 'vang mysql_insert_id();. mysql_query ('SELECT LAST_INSERT_ID (600)'); vang mysql_insert_id(); mysql_query ('SELECT LAST_INSERT_ID()'); ' ' mysql_insert_id() 'thứ hai không phản ánh 600, ở đâu là' mysql_query ('SELECT LAST_INSERT_ID()') 'sẽ. Để có được' mysql_insert_id() 'để phản ánh thay đổi bạn phải làm đầu tiên chèn hoặc cập nhật (có thể ảnh hưởng đến 0 hàng) Xem đoạn cuối cùng của: [http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id] (http://dev.mysql.com/doc /refman/5.0/en/information-functions.html#function_last-insert-id) – Cliffordlife

+2

điều này nên được ông chấp nhận trả lời imho - cùng với @ Cliffordlife của 'NB' – RozzA

25

Với trang web của PHP, mysql_insert_id hiện không còn được dùng nữa và chúng tôi phải sử dụng PDO. Để làm điều này với PDO, 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 hoặc PDO * hoặc * MySQLi (mà Tôi mô tả trong một câu trả lời ở đây). So sánh tốt: http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059 – Luke

7

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

Khi nhập nhiều hơn một hàng vào thời điểm đó, nó không trả lại Id cuối cùng, nhưng Id đầu tiên của tập hợ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(); 

gì xảy ra ở đây là tôi đẩy trong my_table hai hàng mới. Id của bảng là tự động tăng. Ở đây, đối với cùng một người dùng, tôi thêm hai hàng với một khác nhau varNumb.

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

+0

dính vào 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

19

Như @NaturalBornCamper đã nói, mysql_insert_id is now deprecated và nên không sử dụng. Các tùy chọn bây giờ là sử dụng PDO hoặc mysqli. NaturalBornCamper giải thích PDO trong câu trả lời của mình, vì vậy tôi sẽ chỉ cách làm thế nào để làm điều đó với MySQLi (MySQL Improved) sử dụ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 các tài liệu PHP để biết thêm ví dụ: http://php.net/manual/en/mysqli.insert-id.php

+0

Cảm ơn bạn đã đánh 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

+0

Đây là những gì tôi thường sử dụng – JVE999

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. Hy vọng điều này sẽ hữu ích.

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

Có một cái nhìn tại liên kết sau:

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

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

Cũng xin có một lưu ý rằng tiện ích này là không được chấp nhận trong PHP 5.5 và bị xóa trong PHP 7.0

1

Tôi tìm thấy câu trả lời trong các liên kết ở trên http://php.net/manual/en/function.mysql-insert-id.php

Câu trả lời là:

mysql_query("INSERT INTO tablename (columnname) values ('$value')");   
echo $Id=mysql_insert_id(); 
+0

không an toàn 'mysql' câu trả lời, không bao giờ sử dụng nó. – RozzA

-1

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

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

Bằng phương pháp này, bạn không phải lo lắng về số 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ẽ rất 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, để lấy nó sau khi tạo, các câu trả lời trước đó là đúng.

+0

đây không phải là một câu trả lời có thể ở tất cả, OP đã tuyên bố họ đang sử dụng tự động tăng (tự động tăng). OP muốn truy xuất id được tạo tự động. – RozzA

+0

Xin lỗi, nhưng bạn có ý gì với OP? – neoSmith

+0

người đã đặt câu hỏi - poster gốc – RozzA

Các vấn đề liên quan