My Photo

« MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く | Main | [CentOS 6.6]PHP5.5のインストール準備(EPEL、REMIリポジトリの追加) »

February 14, 2015

MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編)

関連記事:
MySQLメモ013:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法

大分前にJava+MySQLでAUTO_INCREMENTな列の値をINSERT後に取得する方法について記事を書いた。
今、仕事はPHPばかりなので、PHPでのやり方についてメモ。

列idがPKでAUTO_INCREMENTだとして、以下のようなidの指定を省略したINSERT文を実行する。

INSERT INTO test_tbl_01 (name) VALUES ('テスト名前')

これにより作成されたレコードのidを取得する。
最初はINSERTの直後に LAST_INSERT_ID() を使って

SELECT LAST_INSERT_ID() AS last_id

を実行していた。しかし、やりたいのはINSERTだけなのにSQLを2回発行するのは面倒くさい。
他の方法がないか調べるとPDOクラスの lastInsertId() というメソッドがを見つけた。
サンプルコードは以下。Windows7+Apache2.2+PHP5.3.29で動作を確認した。

$dsn = 'mysql:host=localhost;dbname=test_db;charset=utf8';
$username = 'username';
$password = 'password';

// PHP5.3.6より前
//$options = array(
//	PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
//); 

try {
	$db = new PDO($dsn, $username, $password);
//	$db = new PDO($dsn, $username, $password, $options);	// PHP5.3.6より前
	
//	$db->beginTransaction();	// トランザクション開始
	
	$sql = 'INSERT INTO test_tbl_01 (name) VALUES (?)';
	$stmt = $db->prepare($sql);
	
	$stmt->execute(array('テスト氏名'));
	
	$last_id = $db->lastInsertId();
	print("id={$last_id}\n");
	
//	$db->commit();	// トランザクション終了
	
} catch (PDOException $e) {
	exit('DBエラー:' . $e->getMessage());
}

トランザクション内で使わなければならないということを書いてあるサイトもあったが、オートコミットモードでも問題なく使用できた。

参考ページ:
PHP: PDO_MYSQL DSN - Manual
PHPでPDOを使ってMySQLに接続、INSERT、UPDATE、DELETE、COUNT、SUM - Qiita
select last_insert_id() - MySQL初心者日記 - MySQLグループ
PHP: PDO::lastInsertId - Manual
select last_insert_id() - MySQL初心者日記 - MySQLグループ
PDOを利用して、last insert idを取得する -でじうぃき

« MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く | Main | [CentOS 6.6]PHP5.5のインストール準備(EPEL、REMIリポジトリの追加) »

MySQL」カテゴリの記事

PHP」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/61136856

Listed below are links to weblogs that reference MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編):

« MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く | Main | [CentOS 6.6]PHP5.5のインストール準備(EPEL、REMIリポジトリの追加) »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof