どんな時につかう
基本はbegin commit rollbackの話。
// 1個目 $sth = $this->dbh->prepare("INSERT INTO Pages VALUES(?, ?, ?)"); $sth->execute(array(1, 'Etc', date('Y-m-d H:i:s'))); //typo $sth = $this->dbh->prepare("INSERT ITO Pages VALUES(?, ?, ?)"); $sth->execute(array(1, 'Uiro', date('Y-m-d H:i:s')));
あ。INTOがイトーになってる。タイポしてる。でも1個目動いちゃういやあああああ
とか、2個目がエラー出ちゃった時とかに、1個目だけは動いちゃうのを防ぐ
全部正しく動いた時だけ、SQL動かしたいときとか!
コード(まとめは最後)
1.たいぽでもエラーを投げるハンドラ生成
$dbh = new PDO('mysql:host=mysql;dbname=dbname', 'username', 'password', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
2.これからやるSQLは、Commitするまで動かしちゃだめだよってする
$dbh->beginTransaction();
3.正しく動けばcommit(実行)、失敗したら、rollback(なかったこと)する
$dbh->commit();
$dbh->rollback();
まとめるとこんな感じ
$dbh->beginTransaction(); try { // SQL文動かす $sth = $this->dbh->prepare("INSERT INTO Pages VALUES(?, ?, ?)"); $sth->execute(array(1, 'Etc', date('Y-m-d H:i:s'))); $dbh->commit(); } catch (PDOException $e) { $dbh->rollback(); exit($e->getMessage()); }