SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

PDOでサクサクDB開発

データベースへのアクセスを抽象化するPHP Data Objectの利用


  • X ポスト
  • このエントリーをはてなブックマークに追加

PDOで設定できる属性(3/3)

エラーに関する設定項目

  • PDO::ATTR_ERRMODE
  • PDO::ATTR_ERRMODEはPDOのエラー発生時の動作を変更することができます。
  • PDO::ERRMODE_SILENT
  • PDO::ERRMODE_SILENTはエラー発生時であっても、どんな出力も行いません。
  • PDO::ERRMODE_WARNING
  • PDO::ERRMODE_WARNINGはエラー発生時にPHPワーニングを出力します。
  • PDO::ERRMODE_EXCEPTION
  • PDO::ERRMODE_EXCEPTIONはエラー発生時にPDOExceptionという形で例外を投げます。
pdo_error
$pdo = CZ_PDO::getConnection();

try {
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    $pdo->query("SSSELECT");
} catch(PDOException $e){
    echo "------- catch PDO::ERRMODE_SILENTT ------" . PHP_EOL;
}

try {
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    $pdo->query("SSSELECT");
} catch(PDOException $e){
    echo "------- catch PPDO::ERRMODE_WARNING ------" . PHP_EOL;
}

try {
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->query("SSSELECT");
} catch(PDOException $e){
    echo "------- catch PPDO::ERRMODE_EXCEPTION ------" . PHP_EOL;
}

 上記の例では"SSSELECT"というSELECT文をタイプミスし、エラー(例外)を発生させています。

 また、上記の実行結果は以下です。

result
Warning: PDO::query(): SQLSTATE[HY000]: General error: 1 near
 "SSSELECT": syntax error in pdo_attr_errmode.php on line 15
------- catch PPDO::ERRMODE_EXCEPTION ------

 上記の例では、PDO::ERRMODE_SILENTはエラー何も発生せずに次の処理に移行し、PDO::ERRMODE_WARNINGではPHPのWarningを発生していますが、処理は続きます。

 PDO::ERRMODE_EXCEPTIONPDOExceptionをキャッチしていることが分かります。

その他の項目

  • PDO::ATTR_CASE
  • PDO::ATTR_CASEは結果セットのカラム文字列を変更します。
  • PDO::CASE_NATURAL
  • PDO::CASE_NATURALはデータベースから取得したカラム名のままを使用します。
  • PDO::CASE_LOWER
  • PDO::CASE_LOWERはカラム名を小文字に変換します。
  • PDO::CASE_UPPER
  • PDO::CASE_UPPERはカラム名を大文字に変換します。
attr_case
try {
    $pdo = CZ_PDO::getConnection();

    $pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
    $rows = $pdo->query("SELECT * FROM BOOK")->fetch(PDO::FETCH_OBJ);
    var_dump($rows);

    $pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
    $rows = $pdo->query("SELECT * FROM BOOK")->fetch(PDO::FETCH_OBJ);
    var_dump($rows);

    $pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
    $rows = $pdo->query("SELECT * FROM BOOK")->fetch(PDO::FETCH_OBJ);
    var_dump($rows);
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 上記の実行結果は以下になります。

result
object(stdClass)#3 (3) {
    ["Isbn"]=>
    string(9) "689847432"
    ["Title"]=>
    string(10) "Alices Adv"
    ["Author"]=>
    string(6) "Robert"
}
object(stdClass)#4 (3) {
    ["isbn"]=>
    string(9) "689847432"
    ["title"]=>
    string(10) "Alices Adv"
    ["author"]=>
    string(6) "Robert"
}
object(stdClass)#2 (3) {
    ["ISBN"]=>
    string(9) "689847432"
    ["TITLE"]=>
    string(10) "Alices Adv"
    ["AUTHOR"]=>
    string(6) "Robert"
}
  • PDO::ATTR_SERVER_INFO
  • PDO::ATTR_SERVER_INFOはサーバの現在の状態を知ることができます。
  • PDO::ATTR_SERVER_VERSION
  • PDO::ATTR_SERVER_VERSIONはサーバのバージョンを知ることができます。
  • PDO::ATTR_CLIENT_VERSION
  • PDO::ATTR_CLIENT_VERSIONは接続しているライブラリのバージョンを知ることができます。
  • PDO::ATTR_DRIVER_NAME
  • PDO::ATTR_DRIVER_NAMEはPDOのドライバ名を知ることができます。
  • PDO::ATTR_TIMEOUT
  • PDO::ATTR_TIMEOUTは接続のタイムアウトを知ることができます。
  • PDO::ATTR_CONNECTION_STATUS
  • PDO::ATTR_CONNECTION_STATUSは接続状態を知ることができます。
attr_info
try {
    $pdo = CZ_PDO::getConnection();

    var_dump($pdo->getAttribute(PDO::ATTR_SERVER_INFO));
    var_dump($pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
    var_dump($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION));
    var_dump($pdo->getAttribute(PDO::ATTR_DRIVER_NAME));
    var_dump($pdo->getAttribute(PDO::ATTR_TIMEOUT));
    var_dump($pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS));
} catch (PDOException $e) {
    var_dump($e->getMessage());
}

 以下に各環境の実行結果を示します。

result_mysql
string(130) "Uptime: 11359  Threads: 1  Questions: 3  Slow queries: 0
  Opens: 0  Flush tables: 1  Open tables: 6
  Queries per second avg: 0.000"
string(15) "5.0.18-standard"
string(6) "5.0.18"
string(5) "mysql"

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support
 this function: driver does not support that attribute in ....
bool(false)
string(25) "Localhost via UNIX socket"

 上記は筆者の環境でのMySQLに接続しているときの状態です。

result_pgsql
string(102) "PID: 9577; Client Encoding: UTF8; Is Superuser: on;
 Session Authorization: nowel; Date Style: ISO, MDY"
string(5) "8.1.2"
string(5) "8.1.2"
string(5) "pgsql"

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not
 support this function: driver does not support that attribute in ....
bool(false)
string(31) "Connection OK; waiting to send."

 上記は筆者の環境でのPostgreSQLに接続しているときの状態です。

result_sqlite
Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not
 support this function: driver does not support that attribute in ....
bool(false)
string(5) "3.2.8"
string(5) "3.2.8"
string(6) "sqlite"

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not
 support this function: driver does not support that attribute in ....
bool(false)

Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not
 support this function: driver does not support that attribute in ....
bool(false)

 上記は筆者の環境でのSQLiteに接続しているときの状態です。

 ドライバによって出力結果が違ってきます。また、ドライバがすべての属性をサポートしているとは限りません。

参考資料

 以下にPDOを利用しているO/Rマッピングライブラリを挙げます。PDOで開発をするときの強い見方になることでしょう。

最後に

 去年の暮れからPHP 4からPHP 5への移行は一気に始まってきました。

 その中で既存のPEAR::DBをそのまま使いつづけ、せっかくPHP 5に移行できたのにそのメリットをうまく活かせていないところも多いようです。

 また、PDOを使った開発をしていると、PEAR::DBではあれができたのに、Creoleならこれができるのに、と考えてしまうことがあります。

 ですが、PDOで何かできるではなく、PDOで何をするかを考え開発すると、よりDBへの知識度の向上につながることと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ハタ(ハタ)

PHPの魅力に取り付かれた一人。現在はSeasar.PHPとしてSeasar(Java)をPHP5に移植する活動をしている。http://blog.xole.net/(ブログ)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/433 2007/12/13 16:05

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング