當我插入一行時,表格自動的'id'字段增加。我想插入一行然後獲取該ID。PHP/MySQL插入行然後得到'id'
我會這樣做,就像我說的那樣,但有沒有一種方法可以做到這一點,而不必擔心插入行和獲取ID之間的時間?
我知道我可以查詢數據庫中與輸入的信息相匹配的行,但有很大的變化會有重複,唯一的區別是id。
當我插入一行時,表格自動的'id'字段增加。我想插入一行然後獲取該ID。PHP/MySQL插入行然後得到'id'
我會這樣做,就像我說的那樣,但有沒有一種方法可以做到這一點,而不必擔心插入行和獲取ID之間的時間?
我知道我可以查詢數據庫中與輸入的信息相匹配的行,但有很大的變化會有重複,唯一的區別是id。
$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);
無論你做什麼,都不要插入,然後執行「SELECT MAX(id) FROM mytable
」。就像你說的那樣,這是一種競爭條件,沒有必要。 mysqli_insert_id()
已具有此功能。
MySQL函數LAST_INSERT_ID()
正好滿足您的需求:它檢索在期間插入的本次會話。因此,即使存在其他進程(例如,其他人正在調用完全相同的腳本),將值插入到同一個表中也是安全的。
PHP功能mysql_insert_id()
與調用SELECT LAST_INSERT_ID()
和mysql_query()
的做法相同。
對於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();
我只想補充有關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。
由於@NaturalBornCamper表示,應使用mysql_insert_id is now deprecated並且應該使用而不是。這些選項現在可以使用PDO或mysqli。 NaturalBornCamper在他的回答中解釋了PDO,因此我將使用mysqli_insert_id來演示如何使用MySQLi(MySQL 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
一個例子。
$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。 希望這有助於。
嘗試這樣你就可以得到答案:
<?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中刪除。
我發現上面的鏈接的答案http://php.net/manual/en/function.mysql-insert-id.php
答案是:
mysql_query("INSERT INTO tablename (columnname) values ('$value')");
echo $Id=mysql_insert_id();
另一種可能的答案是:
當你定義的表,用列和數據,它會有。列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,獲取它創建後,以前的答案是正確的部分。
PDO等價物是PDO :: lastInsertId(http://us3.php.net/manual/en/pdo.lastinsertid.php)。 – 2009-05-22 11:18:30
酷 - 不知道這存在! – 2009-09-19 16:05:51
該鏈接將我帶到俄語版本的mysql_insert_id @ php.net:P – Alisso 2012-08-07 16:05:32