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 = 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
文をタイプミスし、エラー(例外)を発生させています。
また、上記の実行結果は以下です。
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_EXCEPTION
はPDOException
をキャッチしていることが分かります。
その他の項目
- PDO::ATTR_CASE
PDO::ATTR_CASE
は結果セットのカラム文字列を変更します。- PDO::CASE_NATURAL
PDO::CASE_NATURAL
はデータベースから取得したカラム名のままを使用します。- PDO::CASE_LOWER
PDO::CASE_LOWER
はカラム名を小文字に変換します。- PDO::CASE_UPPER
PDO::CASE_UPPER
はカラム名を大文字に変換します。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()); }
上記の実行結果は以下になります。
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
は接続状態を知ることができます。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()); }
以下に各環境の実行結果を示します。
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に接続しているときの状態です。
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に接続しているときの状態です。
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への知識度の向上につながることと思います。