PHP / MySQL插入行然后得到'id'

时间:2009-05-22 11:07:02

标签: php mysql

当我插入一行时,我的表格的'id'字段会自动增加。我想插入一行,然后获取该ID。

我会像我说的那样做,但有没有办法可以做到这一点而不用担心插入行和获取ID之间的时间?

我知道我可以在数据库中查询与输入的信息相匹配的行,但是会有重复的更改,唯一的区别是id。

10 个答案:

答案 0 :(得分:248)

$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()已具备此功能。

答案 1 :(得分:39)

MySQL函数LAST_INSERT_ID()可以满足您的需求:它检索此会话期间插入的ID 。因此,使用它是安全的,即使有其他进程(例如,其他人调用完全相同的脚本)将值插入到同一个表中。

PHP函数mysql_insert_id()与使用SELECT LAST_INSERT_ID()调用mysql_query()的方法相同。

答案 2 :(得分:28)

对于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();

答案 3 :(得分:20)

正如@NaturalBornCamper所说,mysql_insert_id is now deprecated并且应该。选项现在使用PDO或mysqli。 NaturalBornCamper在他的回答中解释了PDO,因此我将使用MySQL Improved MySQLi 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);

查看PHP文档以获取更多示例:http://php.net/manual/en/mysqli.insert-id.php

答案 4 :(得分: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,这意味着不是 last 行的id,而是第一行的id在最后一个请求中添加了。

答案 5 :(得分: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。 希望这可以帮助。

答案 6 :(得分: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中删除

答案 7 :(得分:1)

我在上面的链接http://php.net/manual/en/function.mysql-insert-id.php

中找到了答案

答案是:

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

答案 8 :(得分:0)

尝试一下...对我有用!

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

答案 9 :(得分:-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的部分,在创建之后获取它,之前的答案是正确的。