PHP / MySQLは行を挿入してから 'id'を取得します


192

行を挿入すると、テーブルの 'id'フィールドが自動的に増加します。行を挿入してから、そのIDを取得します。

私は言ったようにそれを行いますが、行を挿入してからIDを取得するまでの時間を気にせずにできる方法はありますか?

入力した情報と一致する行をデータベースでクエリできることはわかっていますが、IDが異なるだけで重複が大きく変化します。

回答:


255
$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()すでにこの機能を備えています。


58
同等のPDOはPDO :: lastInsertId(us3.php.net/manual/en/pdo.lastinsertid.php)です。
Matthew Flaschen、2009年

11
同時に10000の非同期挿入がある場合でも機能しますか?
zie1ony 2012

16
@ zie1onyはい、MySQLはACIDに準拠しているため、100万回の非同期挿入で機能します。多くの非同期挿入からの個々の挿入は、それ自体の分離されたセッション内にあります。これは、PHPからmysql_insert_id()(またはMySQLのLAST_INSERT_ID())を呼び出すときにIDが取得される場所です
rodrigo-silveira

7
文書には注意事項があります: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.\
Elbek '20

7
これまでに書いたすべての内容を書き直す必要がある-_-
de_nuit 2013

39

MySQL関数LAST_INSERT_ID()は必要なことだけを行います。この関数は、このセッション中に挿入されたIDを取得します。そのため、同じテーブルに値を挿入する他のプロセス(たとえば、まったく同じスクリプトを呼び出す他のプロセス)がある場合でも、安全に使用できます。

PHP関数mysql_insert_id()は、での呼び出しSELECT LAST_INSERT_ID()と同じmysql_query()です。


2
注意 echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); :2番目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
Cliffordlife

28

PHPのWebサイトに関しては、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();

4
PDO または MySQLi を使用するオプションがあります(これについては、ここで別の回答で説明します)。良い比較:code.tutsplus.com/tutorials/...
ルーク

20

@NaturalBornCamperが言ったように、mysql_insert_idは非推奨になり、使用すべきでありませ。オプションは、PDOまたはmysqliを使用することです。NaturalBornCamperが彼の回答でPDOを説明したので、mysqli_insert_idを使用して、MySQLiMySQL改善)でそれを行う方法を示します。

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


それをキャッチしてくれてありがとう。PHPの矢印表記よりも、Javascriptのドット表記の方が好きです。:/
Luke

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_table2つの新しい行を押し込むことです。テーブルのIDは自動インクリメントです。ここでは、同じユーザーに対して、異なるの2つの行を追加していますvarNumb

最後にエコーされる値は、行のIDと等しくなりますvarNumb=1。つまり、は、最後の行のIDではなく、最後のリクエストで追加された最初の行のIDを意味します。


一度に1つの操作に固執する-予期しない動作を回避するために、使用されるすべての方法に対する全体的な答えのようです
RozzA

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で削除されたことにも注意してください。



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

-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を生成する方法を定義する部分にすぎません。作成後に取得するには、前の以前の答えが正しいです。


これはまったく可能な答えではありません。OPはすでに自動インクリメント(自動インクリメント)を使用していると述べています。OPは、自動生成されたIDを取得したいと考えています。
RozzA 16

さて、もう一度読んだ後、問題はIDを生成するだけではなく、OPもそのIDを取得したいことに気付きました。定義をありがとう:D
neoSmith
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.