PHPで最後に挿入されたMySQLテーブルのIDを取得するにはどうすればよいですか?


93

新しいデータが頻繁に挿入されるテーブルがあります。テーブルの最後のIDを取得する必要があります。これどうやってするの?

に似ていSELECT MAX(id) FROM tableますか?


1
はい、このクエリはテーブルの最後のIDを返します。ただし、1つの条件は、IDが主キーである必要があることです。だから悔い改めを避けることができます。
09

7
@sathish:その方法の主な問題は並行性です。
CMS

3
詳しく説明すると、問題は、誰かがINSERTとのクエリの間にテーブルに何かを挿入した場合最後のIDでMAX(id)はないIDを取得する可能性があることです。
だます

3
@Jocelynその質問は、この質問よりも数千少ないビューで1 年後に尋ねられました。
Naftali別名Neal

3
@ニール、あなたは正しい。他の質問は、この質問の重複としてクローズする必要があります。
Jocelyn、

回答:


133

PDOを使用している場合は、を使用しますPDO::lastInsertId

Mysqliを使用している場合は、を使用しますmysqli::$insert_id

Mysqlをまだ使用している場合:

mysql_*新しいコードでは関数を使用しないでください。それらはもはや保守されておらず、正式に非推奨になっています。赤い箱見えますか?学ぶプリペアドステートメントの代わりに、および使用 PDOまたは MySQLiをする -この記事は、あなたがどれを決めるのに役立ちます。PDOを選択する場合こちらが良いチュートリアルです。

ただし、必要な場合はを使用してくださいmysql_insert_id


これの問題は、多くの挿入が発生している場合(データベースも何かをログに記録している場合など)、誤ったIDを取得する可能性があることです。
マイク、

あなたが使用していない場合は@マイクmysql_insert_id 直後あなたmysql_query。もちろん、その間に同じ接続で他のいくつかのクエリを実行する場合、そこに役立つものは何もありません。
だます

7
保証するために、間違ったIDを取得することはありません。コードをTRANSACTIONでラップしてください。
Marcelo Assis

28
mysqlは、これが現在の接続の最後のIDであることを確認するため、このステートメントを挿入クエリの直後に配置しても問題はありません。挿入を実行する他のプロセスについて心配する必要はありません。これをトランザクションでラップする必要はありません。mysqlマニュアルによると、「生成されたIDは接続ごとにサーバーで維持されます。これは、関数によって特定のクライアントに返される値が、AUTO_INCREMENTカラムに影響を与える最新のステートメントに対して生成される最初のAUTO_INCREMENT値であることを意味しますで、そのクライアント。これは、あなたがすべき理由ですない MAX(ID)を選択使用
woens

1
@deceze、PDOどこにでもあるこの偏見とは何ですか?機能比較をもう一度見てみましょう。mysqli低レベルのもので手を汚す必要があるときにそれが勝者であることは明らかです。つまり、PDOを選択したとしても、最終的にmysqliとにかく使用する必要があります。
Pacerier、2015年

53

現在の接続に挿入された最後のIDを知るための関数があります

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

さらに、コードを2つの異なるセッションで同時に使用すると問題が発生する可能性があるため、maxを使用することはお勧めできません。

その関数はmysql_insert_idと呼ばれます


2
mysql _(...)は、PHPバージョン5.5以降では非推奨です。
イアゴ2014年

うん、私はただそれを覚えています。:)
Iago 2014年


18

PDO

$pdo->lastInsertId();

Mysqli

$mysqli->insert_id;

mysql_*新しいコードでは関数を使用しないでください。それらはもはや保守されておらず、正式に非推奨になっています。赤い箱見えますか?学ぶプリペアドステートメントの代わりに、および使用 PDOまたは MySQLiをする -この記事は、あなたがどれを決めるのに役立ちます。PDOを選択する場合こちらが良いチュートリアルです。



8

あなたが書いたものは、idそれらがユニークで自動インクリメントされていると仮定して最大の結果をもたらしますが、同時実行性の問題を招くのに問題がないと仮定すると問題ありません。
MySQLをデータベースとして使用しているためLAST_INSERT_ID()、挿入を行った現在の接続でのみ機能する特定の関数があります。
PHPは、そのための特定の関数を提供していますmysql_insert_id


6

これはうまくいくはずです:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

1
お気づきありがとうございます。私はコードを編集しましたが、実際は$ link(接続を保持する変数)です
Sandhu

3

組み込みのphp関数により、最新の挿入されたIDを取得できます mysql_insert_id();

$id = mysql_insert_id();

あなたも最新のIDを取得します

$id = last_insert_id();

4
また、非推奨のライブラリを使用することを推奨しているため、これは誤りです。本当に、これを削除します
STT LCU 2013

@STTLCUここでどのスニペットが非推奨ですか?
TheBlackBenzKid 2014年

@TheBlackBenzKidは両方ともmysql_ *関数に基づいているため
STT LCU

@Rahul $ id = last_insert_id(); 廃止予定のように機能していません。
Esha、

3

codeigniterで最後に挿入されたIDを取得するには挿入クエリを実行した後insert_id()、データベースで呼び出された関数を1つだけ使用すると、最後に挿入されたIDが返されます

例:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

一列に

echo $this->db->insert('mytable',$data)->insert_id();

3

を使用mysql_insert_id()してもかまいませんが、使用に関する特定の注意事項が1つあります。INSERTスクリプトを実行した後で、同じスクリプトセッションで呼び出す必要があります。他の方法で使用すると、正しく機能しません。


2

クリーンでシンプル-

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

注:1つのステートメントで複数の挿入を行う場合、mysqli :: insert_idは正しくありません。

テーブル:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

今あなたがするなら:

insert into xyz (name) values('one'),('two'),('three');

mysqli :: insert_idは3ではなく1になります。

正しい値を取得するには、次のようにします。

mysqli::insert_id + mysqli::affected_rows) - 1

これは文書化されていますが、少しあいまいです。


1

純粋なMySQL構文を使用して、必要なテーブルの最後のauto_increment IDを取得することを好みます。

php mysql_insert_id()およびmysql last_insert_id()は、最後のトランザクションIDのみを提供します。

スキーマ内の任意のテーブルの最後のauto_incremented ID(最後のトランザクション1だけでなく)が必要な場合は、このクエリを使用できます

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

それでおしまい。


このSQLは質問のコンテキストで単に間違っているので、私はこれについて疑わしいです...また、この方法は、2つ以上のクライアントがほぼ同時にこのSQLを実行すると、競合状態になる可能性が高いと感じます...わからない挿入後にこの列データが更新される速度。これにより、疑問が生じます。最後のIDを取得できるPHP関数は、接続/セッションレベル(MySQLのLAST_INSERT_ID()とほぼ同じ)に基づいており、競合状態を保存します
Raymond Nijland

1

例を挙げて答えを見ないのは悲しいことです。

Mysqli :: $ insert_idの使用:

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

PDO :: lastInsertIdの使用:

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

MySQLiトランザクションを使用するとmysqli::$insert_id、0が返されたためにを取得できない場合がありました。特に、ストアドプロシージャを使用している場合は、INSERTs を実行しています。したがって、トランザクションには別の方法があります。

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

mysqlは低価格であるため、mysqliを使用します

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

0

私は試した

mysqli_insert_id($ dbConnectionObj)

これは、現在の接続の最後に挿入されたIDを返すため、接続を適切に管理している場合、これは機能するはずです。少なくとも私のために働いた。


0

PDPを使用してから、これを試してください

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();


-1

このすべての議論により、最大IDをチェックする理由は、次のIDが何であるかを知ることであると思います(私の最大IDが5の場合、次は5 + 1 = 6になります)。

>>これが理由ではない場合は、私の最高の謝罪

他の誰かがCHECKとINSERTの間に情報を挿入すると、間違ったIDが返されます。

したがって、タイムスタンプまたは他の一意の値を含む可能性のあるハッシュを作成する場合は解決できます。

次に、同じ関数で、空の値とハッシュを使用して情報を挿入できます。AUTO_INCRECEMENTを選択している場合は、IDが作成されます。

次に、同じ関数でハッシュを保持し、同じハッシュでIDを検索できます。そして、mysql UPDATEを使用して空の値の入力を完了することができます。

これにはもう少し接続が含まれますが、それでもそれを行う方法です...

それを解決する幸運。


-2

テーブルにUserID、Emp_ID、...のようなAUTO INCREMENT列がある場合、このクエリを使用して、最後に挿入されたレコードを取得できます 。SELECT * FROM table_name where UserID =(select MAX(UserID)from table_name) PHPコード:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

次に、フェッチしたデータを要件として使用できます


パスワードを暗号化しないでください。攻撃者がDBを取得すると、暗号化キーも取得します。
zaph 2016

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.