プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP・PDO、SQL実行時のエラーをExceptionで捕捉する
結論から書けば

$pdo = new PDO($dsn, $user, $pwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

のようにDB接続時の第四引数に「array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))」をくっつけるか、あるいは

$pdo = new PDO($dsn, $user, $pwd);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

のように「setAttribute()」すればOKです。


PDOさんはDB接続に失敗したときはExceptionを投げてくれるのですが、
普通にSQLを実行して失敗したときは知らない振りをしやがります。

だから普段は「execute()」メソッドの戻り値を拾って

$ret = $stmt->execute();
if (!$ret) {
    print "error";
}

のように書かなくてはいけません。

めんどくせっ(-A-)

かっこわるっ(-A-)

とか、ぶつくさ言っていたらありました。

DB接続時の第四引数に「array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))」をくっつけて

$pdo = new PDO($dsn, $user, $pwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

のようにする、あるいは

$pdo = new PDO($dsn, $user, $pwd);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

のように「setAttribute()」すれば、SQL実行時のエラーもExceptionで取れるのだそうです。

例えばこんなコードを実行するとφ(--)
<?php

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

$sql = 'SELECT * FROMaaaaaaaaa tbl_test01;';


//------------------------
//通常
//------------------------
try {
    //DB接続
    $pdo = new PDO($dsn, $user, $pwd);

    //SELECT
    $stmt = $pdo->prepare($sql);
    $ret = $stmt->execute();
    if (!$ret) {
        print "error";
    }
} catch (PDOException $e) {
    print "Exception";
//    print $e->getMessage();
}

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

//------------------------
//全部Exception
//------------------------
try {
    //DB接続
    $pdo = new PDO($dsn, $user, $pwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

    //SELECT
    $stmt = $pdo->prepare($sql);
    $ret = $stmt->execute();
    if (!$ret) {
        print "error2";
    }
} catch (PDOException $e) {
    print "Exception2";
//    print $e->getMessage();
}

//------------------------
//全部Exception2
//------------------------
try {
    //DB接続
    $pdo = new PDO($dsn, $user, $pwd);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //SELECT
    $stmt = $pdo->prepare($sql);
    $ret = $stmt->execute();
    if (!$ret) {
        print "error3";
    }
} catch (PDOException $e) {
    print "Exception3";
//    print $e->getMessage();
}

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

こんな結果になりますφ(--)

errorException2Exception3

最初の実行は戻り値を拾うルート、後の2つはExceptionを拾うルートに入っていますね。

ふ~む。
デフォルトがExceptionモードになっていないのは何か理由があるのかな(--?
よく分からないですけど、エラーになっても処理を続行する場合を想定しているのですかね。

まぁ取りあえず完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

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

| HOME | next