エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【PHP】PDOで、エラーが出たら今までの変更なかったことにする方法【197日目】

どんな時につかう

基本は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());
}

公式ドキュメント

PHP: トランザクションおよび自動コミット - Manual