PHPプログラミング

最終更新日:
公開日:

レシピ

データベース MySQL / MariaDB

mysqliで最後に登録したデータのIDを取得する

mysqliのstmtクラスを使い、最後に登録したデータのID(主キー)を取得する方法を解説します。

この記事のポイント

  • 最後にデータベースへ登録したデータのIDを取得する
  • 具体的なコード例で処理内容が理解できる

目次

最後に登録(Insert)したデータのユニークIDを取得

少し地味ですが、システム開発を行っていると新しく登録したデータのIDをすぐに知りたい場合があります。
MySQLiのstmtクラスを使うと、このIDを簡単に取得することが可能です。

先に種明かしをしてしまうとstmtクラスは「insert_id」というプロパティを持っていて、ここにはINSERT文で最後に登録されたデータのIDが入ります。

stmtクラスの基本的な使い方については「mysqliのプリペアドステートメント」を参照ください。

早速コードをみていきましょう。
オブジェクト型」と「手続き型」のそれぞれの方法を解説します。

オブジェクト型の書き方

まずはオブジェクト型のmysqliを使ったコードからみていきましょう。

オブジェクト型のコード例

$mysqli = new mysqli( 'host_name', 'user_name', 'password', 'database_name');

if( $mysqli->connect_errno ) {
	echo $mysqli->connect_errno . ' : ' . $mysqli->connect_error;
}

$mysqli->set_charset('utf8');

date_default_timezone_set('Asia/Tokyo');
$date = date('Y-m-d H:i:s');

// 登録するデータ
$name = 'テストグラノーラ';
$price = 300;
$better_before = '2017-01-10 00:00:00';

$stmt = $mysqli->prepare("INSERT INTO gc_granola (
	name, price, better_before, modify_datetime, create_datetime
) VALUES (
	?, ?, ?, ?, ?
)");

$stmt->bind_param( 'sisss', $name, $price, $better_before, $date, $date);
$stmt->execute();

// closeメソッドの前
var_dump($stmt->insert_id);

$stmt->close();

// closeメソッドの後
var_dump($stmt->insert_id);

$mysqli->close();

実行結果

解説

mysqliのcloseメソッド前後で1回ずつ、insert_idをダンプ出力しています。
結果をみてみると、コメントアウト「// closeメソッドの前」のvar_dumpではIDを取得できていますが、その後ろの「// closeメソッドの後」では取得できていません。

以上の結果から、stmtクラスcloseメソッドを実行した時点でプロパティがリセットされてしまうことが分かります。
そのため、登録直後のデータのIDを取得したい場合、またはstmtクラスの他のプロパティを参照したい場合はcloseメソッドの前で取得するようにする必要があります。

手続き型の書き方

続いて手続き型のコードをみていきます。

手続き型のコード例

$db_link = mysqli_connect( 'host_name', 'user_name', 'password', 'database_name');

if( mysqli_connect_errno($db_link) ) {
	echo mysqli_connect_errno($db_link) . ' : ' . mysqli_connect_error($db_link);
}

mysqli_set_charset( $db_link, 'utf8');

date_default_timezone_set('Asia/Tokyo');
$date = date('Y-m-d H:i:s');

// 登録するデータ
$name = 'テストグラノーラ';
$price = 300;
$better_before = '2017-01-10 00:00:00';

$stmt = mysqli_prepare( $db_link, "INSERT INTO gc_granola (
name, price, better_before, modify_datetime, create_datetime
) VALUES (
?, ?, ?, ?, ?
)");

mysqli_stmt_bind_param( $stmt, 'sisss', $name, $price, $better_before, $date, $date);
mysqli_stmt_execute($stmt);

// close前
var_dump(mysqli_stmt_insert_id($stmt));

mysqli_stmt_close($stmt);

// close後
var_dump(mysqli_stmt_insert_id($stmt));

mysqli_close($db_link);

解説

手続き型では直接オブジェクトのプロパティにアクセスできないため、mysqli_stmt_insert_id関数を使って取得します。
オブジェクト型のときと同様、mysqli_stmt_close関数stmtを閉じる前に取得する必要があります。
出力される結果も同じです。