【问题标题】:PHP/MySQL insert row then get 'id'PHP/MySQL 插入行然后获取 'id'
【发布时间】:2010-10-28 04:42:03
【问题描述】:

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

我会照我说的去做,但是有没有一种方法可以让我不用担心插入行和获取 id 之间的时间?

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    $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() 已经有这个功能了。


    另一种方法是一次运行两个查询,并使用MySQLLAST_INSERT_ID() 方法,其中两个表都被同时修改(并且PHP 不需要任何ID),例如:

    mysqli_query($link, "INSERT INTO my_user_table ...;
      INSERT INTO my_other_table (`user_id`) VALUES (LAST_INSERT_ID())");
    

    注意,每个连接都单独跟踪 ID(因此,已经防止了冲突)。

    【讨论】:

    • PDO 等价物是 PDO::lastInsertId (us3.php.net/manual/en/pdo.lastinsertid.php)。
    • 如果同时有 10000 个异步插入,它仍然有效吗?
    • @zie1ony 是的,它适用于一百万个异步插入,因为 MySQL 符合 ACID。许多异步插入中的每个单独插入都在其自己的 isolated 会话中,当您从 PHP(或 MySQL 中的 LAST_INSERT_ID())调用 mysql_insert_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.\
    • 需要重写我曾经写过的所有东西-_-
    【解决方案2】:

    对于 PHP 的网站,mysql_insert_id 现在已弃用,我们必须使用PDOMySQLi(请参阅@Luke's answer for MySQLi)。要使用 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();
    

    【讨论】:

    • 我们可以选择使用 PDO MySQLi(我在此处的另一个答案中对此进行了描述)。一个很好的比较:code.tutsplus.com/tutorials/…
    【解决方案3】:

    试试这个...它对我有用!

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

    【讨论】:

      【解决方案4】:

      另一个可能的答案是:

      当您定义表格时,它会包含列和数据。列 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的部分,创建后获取它,之前的答案是正确的。

      【讨论】:

      • 这根本不是一个可能的答案,OP 已经声明他们正在使用自动增量(自动增加)。 OP 想要检索自动生成的 id。
      • 好的,再次阅读后我注意到问题不仅在于生成 id,OP 还想要获取该 id。感谢您的定义:D
      【解决方案5】:

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

      答案是:

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

      【讨论】:

      • insecure mysql 回答,永远不要使用它。
      【解决方案6】:

      试试这样你就能得到答案:

      <?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】:

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

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

        【讨论】:

        • NB 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
        【解决方案8】:

        一个例子。

            $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-&gt;insert_id; 将显示最后插入的行的ID。 希望这可以帮助。

        【讨论】:

          【解决方案9】:

          正如@NaturalBornCamper 所说,mysql_insert_id is now deprecated 应该被使用。现在的选项是使用 PDO 或 mysqli。 NaturalBornCamper 在他的回答中解释了 PDO,所以我将展示如何使用 MySQLi (MySQL Improved) 使用 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

          【讨论】:

          • 感谢您的关注。我真的更喜欢 Javascript 的点符号而不是 PHP 的箭头符号。 ://
          【解决方案10】:

          我只想补充一点关于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,这意味着不是最后行的id,而是添加的第一行的id在最后一个请求中。

          【讨论】:

          • 一次只执行一项操作 - 似乎是所有使用方法的总体答案,以避免意外行为
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-14
          • 2016-11-25
          • 2011-06-01
          • 2011-09-23
          • 1970-01-01
          相关资源
          最近更新 更多