CodeZine(コードジン)

特集ページ一覧

PDOでサクサクDB開発

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/07/10 00:00
目次

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への知識度の向上につながることと思います。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • ハタ(ハタ)

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

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5