2013.
12.
18
11:59:59
結論から書けば
のようにDB接続時の第四引数に「array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))」をくっつけるか、あるいは
のように「setAttribute()」すればOKです。
PDOさんはDB接続に失敗したときはExceptionを投げてくれるのですが、
普通にSQLを実行して失敗したときは知らない振りをしやがります。
だから普段は「execute()」メソッドの戻り値を拾って
のように書かなくてはいけません。
めんどくせっ(-A-)
かっこわるっ(-A-)
とか、ぶつくさ言っていたらありました。
DB接続時の第四引数に「array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))」をくっつけて
のようにする、あるいは
のように「setAttribute()」すれば、SQL実行時のエラーもExceptionで取れるのだそうです。
例えばこんなコードを実行するとφ(--)
こんな結果になりますφ(--)
最初の実行は戻り値を拾うルート、後の2つはExceptionを拾うルートに入っていますね。
ふ~む。
デフォルトが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);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
のように「setAttribute()」すればOKです。
PDOさんはDB接続に失敗したときはExceptionを投げてくれるのですが、
普通にSQLを実行して失敗したときは知らない振りをしやがります。
だから普段は「execute()」メソッドの戻り値を拾って
$ret = $stmt->execute();
if (!$ret) {
print "error";
}
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);
$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;
$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モードになっていないのは何か理由があるのかな(--?
よく分からないですけど、エラーになっても処理を続行する場合を想定しているのですかね。
まぁ取りあえず完了\(--)/