2009-05-22 112 views
182

當我插入一行時,表格自動的'id'字段增加。我想插入一行然後獲取該ID。PHP/MySQL插入行然後得到'id'

我會這樣做,就像我說的那樣,但有沒有一種方法可以做到這一點,而不必擔心插入行和獲取ID之間的時間?

我知道我可以查詢數據庫中與輸入的信息相匹配的行,但有很大的變化會有重複,唯一的區別是id。

回答

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

請參閱mysqli_insert_id()

無論你做什麼,都不要插入,然後執行「SELECT MAX(id) FROM mytable」。就像你說的那樣,這是一種競爭條件,沒有必要。 mysqli_insert_id()已具有此功能。

+54

PDO等價物是PDO :: lastInsertId(http://us3.php.net/manual/en/pdo.lastinsertid.php)。 – 2009-05-22 11:18:30

+0

酷 - 不知道這存在! – 2009-09-19 16:05:51

+0

該鏈接將我帶到俄語版本的mysql_insert_id @ php.net:P – Alisso 2012-08-07 16:05:32

37

MySQL函數LAST_INSERT_ID()正好滿足您的需求:它檢索在期間插入的本次會話。因此,即使存在其他進程(例如,其他人正在調用完全相同的腳本),將值插入到同一個表中也是安全的。

PHP功能mysql_insert_id()與調用SELECT LAST_INSERT_ID()mysql_query()的做法相同。

25

對於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(); 
7

我只想補充有關lastInsertId()一個小細節;

當輸入多於一行時,它不會返回最後一個Id,而是最後一次插入的集合的第一個Id。

請看下面的例子

$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

在端部的回波值將等於所述行,其中varNumb=1,這意味着不是最後行的id的id,但在最後請求加入的第一行的id。

19

由於@NaturalBornCamper表示,應使用mysql_insert_id is now deprecated並且應該使用而不是。這些選項現在可以使用PDO或mysqli。 NaturalBornCamper在他的回答中解釋了PDO,因此我將使用mysqli_insert_id來演示如何使用MySQLiMySQL Improved)執行此操作。

// 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

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中刪除。

-1

另一種可能的答案是:

當你定義的表,用列和數據,它會有。列ID可以具有屬性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) 
) 

希望這將是一個人幫助。

編輯:這只是你定義如何生成一個自動ID,獲取它創建後,以前的答案是正確的部分。