プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、PDOを使ってauto increment値のプライマリキーを取得する
結論から書けば

$pdo = new PDO($dsn, $user, $pwd);

でDBに接続したと仮定して

$id = $pdo->lastInsertId();

で取得できます。
要は「mysql_insert_id()」のPDO版です。

たまにありますよね?
auto increment値のプライマリキーを持つテーブルにデータを投入して、
更にその投入されたデータに対してupdateをやりたい。
あれ?でもプライマリキーの値が分からないよ?
where句をどうすれバインダー\( ̄◇ ̄;)/なときが。

そんなときに使うのが「lastInsertId()」です。
insert直後に実行したってください。

それではサンプルですφ(--)
<?php

$dsn = 'mysql:dbname=fp_test;host=127.0.0.1;charset=utf8';
$user = 'user';
$pwd = 'pwd';

//DB接続
try {
    $pdo = new PDO($dsn, $user, $pwd);
} catch (PDOException $e) {
    die('DB接続失敗:' . mb_convert_encoding($e->getMessage(), 'UTF-8','SJIS-win'));
}

//INSERT
$sql = 'INSERT into tbl_test01 (column_varchar01, column_int02, column_varchar02) VALUES (:column_varchar01, :column_int02, :column_varchar02)';
$stmt = $pdo->prepare($sql);
$ret = $stmt->execute(array(
                    ':column_varchar01' => 'ほげ1',
                    ':column_int02' => 100,
                    ':column_varchar02' => 'ほげ2',
                ));
if (!$ret) {
    die('INSERT 失敗');
}

// auto increment値取得
$id = $pdo->lastInsertId();

print 'id=' . $id;

//さよーなら
$pdo = null;

DB接続のところとinsertのところは適当に読み替えてください。
サンプルでは「fp_test」というDB(ユーザID/パスワード:user/pwd)に
 pk_id:数値型(プライマリキー)
 column_varchar01:文字列型
 column_int02:数値型
 column_varchar02:文字列型
のカラムを持つテーブル「tbl_test01」を使っています。

ちなみに今回はMySQLを使っていますが、PostgreSQLの場合は、

$id = $pdo->lastInsertId('hoge');

のようにパラメータで明示的にシーケンスオブジェクト名とやらを指定する必要があるようです。
公式の説明に

最後に挿入された行の ID、 あるいはシーケンスオブジェクトから次の値を返します。 これは、構成しているドライバに依存します。例えば PDO_PGSQL の場合、name パラメータにシーケンスオブジェクト名を指定する必要があります。

と書いてありました。

そんな感じ(--)ノ
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:PDO  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事