$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 不需要任何 ID),例如:
mysqli_query($link, "INSERT INTO my_user_table ...;
INSERT INTO my_other_table (`user_id`) VALUES (LAST_INSERT_ID())");
请注意,每个连接都单独跟踪 ID(因此,已经防止了冲突)。
MySQL 函数 LAST_INSERT_ID()
可以满足您的需要:它检索在 此会话 期间插入的 id。因此使用它是安全的,即使有其他进程(例如,其他人调用完全相同的脚本)将值插入到同一个表中。
PHP 函数 mysql_insert_id()
与使用 mysql_query()
调用 SELECT LAST_INSERT_ID()
的作用相同。
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
至于 PHP 的网站,mysql_insert_id 现在已弃用,我们必须使用 PDO 或 MySQLi(有关 MySQLi,请参阅 @Luke's answer)。要使用 PDO 执行此操作,请执行以下操作:
$db = new PDO('mysql:dbname=database;host=localhost', 'user', 'pass');
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)');
$statement->execute([':name' => 'Bob', ':city' => 'Montreal']);
echo $db->lastInsertId();
正如@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
我只想添加一个关于 lastInsertId()
的小细节;
当一次输入多行时,不会返回最后一个Id,而是返回last inserts集合的第一个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,表示不是last行的id,而是最后添加的第一行的id要求。
一个例子。
$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();
mysql
答案,永远不要使用它。
试试这个……它对我有用!
$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);
}
另一个可能的答案是:
当您定义表格时,它会包含列和数据。列 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的部分,在创建后获取它,之前的答案是正确的。
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.
\