PHP/PDO/シーケンス(Sequence)の利用
はじめに
要約:MySQLにはシーケンスがないから連番テーブルで代用すべし。
%%一般的にデータベースの世界において「シーケンス」というと、連番を取得するためのオブジェクトのことをいう。OracleやPostgreSQLではシーケンスオブジェクトという専用の仕組みが用意されているが、MySQLにはシーケンスが存在しないので、別の仕組みを用いて再現することにする。%%
シーケンスの作成
連番管理テーブルの作成
始めに、シーケンス管理テーブルを作る。
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`)
)


連番取得用コードの記述
try {
$pdo = new PDO("mysql:host=localhost;dbname=pdo", "root", "");
$stmt = $pdo->prepare("insert into sequence values ();");
$result = $stmt->execute();
$nextId = $pdo->lastInsertId("sequence");
print($nextId);
$pdo = null;
} catch (PDOException $e) {
var_dump($e);
$pdo = null;
die();
}
?>
複数ユーザーで同時実行しても、(e.g.ユーザーAが挿入→ユーザーBが挿入→AがlastInsertId()メソッドを呼び出し)$pdo->lastInsertId();は、”この$pdoオブジェクトが挿入した最後の番号”を返すので、問題なし。
※1:実はドライバの実装次第だけど…。実務では一応テストとおすこと!
※2:pdoオブジェクトを共有しないこと。
結果
PHP/PDO/トランザクションの制御
トランザクション制御の流れ
+$pdo->beginTransaction();を実行してトランザクションを開始する。
+テーブルへの参照・更新処理を行う。
+トランザクションの確定・破棄の決定
–$pdo->commit();を実行すると、それまでの変更がテーブルに反映される。
–$pdo->rollback();を実行すると、それまでの変更が破棄される。
コード
try {
$pdo = new PDO("mysql:host=localhost;dbname=pdo", "root", "");
$pdo->query("SET NAMES sjis");
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO blog (title, text) VALUES (:title, :text)");
$stmt->bindParam(‘:title’, $title);
$stmt->bindParam(‘:text’, $text);
$title = "さきおとといの日記";
$text = "運動しました。";
$result = $stmt->execute();
if($result){
// コミット
$pdo->commit();
}else{
// ロールバック
$pdo->rollback();
}
$pdo = null;
} catch (PDOException $e) {
var_dump($e);
// ロールバック
$pdo->rollback();
$pdo = null;
die();
}
?>
PHP/PDO/更新(insert,update,delete)
挿入・更新・削除
プリペアドステートメントを使う。記述自体は問い合わせのプリペアドステートメントと一緒。
コード
try {
$pdo = new PDO("mysql:host=localhost;dbname=pdo", "root", "");
// 文字化け対策
$pdo->query("SET NAMES sjis");
$stmt = $pdo->prepare("INSERT INTO blog (title, text) VALUES (:title, :text)");
$stmt->bindParam(‘:title’, $title);
$stmt->bindParam(‘:text’, $text);
$title = "おとといの日記";
$text = "電車に乗りました。";
$result = $stmt->execute();
$pdo = null;
} catch (PDOException $e) {
var_dump($e);
$pdo = null;
die();
}
?>
bindParamは値が実行時評価なので、コードがトリッキーに見える。保守性があまりよくない。よって、bindValue推奨。
結果
2 昨日の日記 はやおきしました。
3 おとといの日記 電車に乗りました。
ID3の列が追加された。

