PHPとデータベース - PDO

提供: MochiuWiki : SUSE, EC, PCB

2021年2月16日 (火) 23:14時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == PDO(PHP Data Objects)拡張モジュールは、PHPからデータベースにアクセスするための軽量で高性能なインターフェイスであ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

PDO(PHP Data Objects)拡張モジュールは、PHPからデータベースにアクセスするための軽量で高性能なインターフェイスである。
PDOインターフェイスを実装する各データベースドライバは、正規表現のようなデータベース固有の機能を提供する。
ただし、PDO拡張モジュールは、データベースのあらゆる関数を実行できるわけではない。

データベースサーバにアクセスするには、データベース固有のPDOドライバを使用する必要がある。

PDOは、データアクセスの抽象化レイヤを提供する。
つまり、使用しているデータベースの種類に関わらず、同じ関数を使用してクエリの発行やデータの取得が行うことができる。

PDOは、PHP 5.1以降にバンドルされており、PHP 5.0ではPECL拡張モジュールとして使用可能である。
PHP 5の新機能であるオブジェクト指向で設計されているため、それより前のPHPでは動作しない。


PDOのインストール

Linux

PDOおよびPDO_SQLITEドライバは、PHP 5.1.0以降では標準で有効となっている。
必要に応じて、使用するデータベース用のPDOドライバを有効にすることができる。
データベースごとのPDOドライバについての詳細は、こちらのWebサイトを参照すること。

※注意
PDOを共有モジュールとしてビルドする場合(非推奨)、全てのPDOドライバはPDO自体の後にロードしなければならない。

PDOを共有モジュールとしてインストールする場合、php.iniファイルを編集して、PHPの実行時にPDOが自動的に読み込むように設定する。
データベースごとのドライバについても同様、ドライバはpdo.soの後に記述する。
これは、ドライバを読み込む前にPDOの初期化を済ませておく必要があるからである。

もし、PDOおよびデータベースドライバを静的にビルドした場合、この部分は読み飛ばして構わない。

extension=pdo.so


Windows

  1. PDOおよび主要なドライバは、共有モジュールとしてPHPに同梱されているため、php.iniファイルを編集するだけで使用できる。
    extension=php_pdo.dll
    ※注意
    PHP 5.3以降では、上記の設定は不要である。これは、PDOのDLLは必須ではなくなったためである。

  2. 次に、その他のデータベース固有のDLLを読み込む方法は、以下の2つがある。
    • 実行時にdl関数で読み込む。
    • php.iniファイルで、php_pdo.dllに続いて指定する。
      例えば、以下のように追記する。
      以下のDLLは、php.iniファイルにあるextension_dir項目で指定したディレクトリに配置しなければならない。
      extension=php_pdo.dll
      extension=php_pdo_firebird.dll
      extension=php_pdo_informix.dll
      extension=php_pdo_mssql.dll
      extension=php_pdo_mysql.dll
      extension=php_pdo_oci.dll
      extension=php_pdo_oci8.dll
      extension=php_pdo_odbc.dll
      extension=php_pdo_pgsql.dll
      extension=php_pdo_sqlite.dll

    ※注意
    php.iniファイルの変更後は、設定を有効にするためにPHPを再起動する必要がある。
    sudo systemctl restart apache2



データベースの接続と管理

PDOクラスのインスタンスを作成することにより、接続が確立される。
コンストラクタには、データソース(DSN)、ユーザ名、パスワードを指定する。

MySQLへの接続

データベース接続時になんらかのエラーが発生した場合、PDOExceptionクラスがスローされる。
エラー処理を行う場合はこの例外をキャッチする。
または、エラーを無視して、set_exception_handler関数で設定したグローバル例外ハンドラに処理を任せることもできる。

※注意
PDOコンストラクタからの例外をキャッチしない場合、zendエンジンはPHPスクリプトを終了して、バックトレースを表示する。
このバックトレースは、データベースへの接続の詳細(ユーザ名やパスワード等)を誰でも閲覧することができるため、
必ず、例外処理を記述すること。

データベースへの接続に成功する場合、PDOクラスのインスタンスが返る。このインスタンスが存在する間、接続がアクティブであり続ける。
データベースへの接続を閉じる時、インスタンスにnullを代入して、インスタンスを破棄する。
nullを代入しない場合、PHPスクリプトの終了時に自動的に接続が閉じられる。

※注意
PDOのインスタンスへの参照(PDOStatementクラスのインスタンスからの参照や別のPDOのインスタンスからの参照等)が残っている場合、
それらも併せて削除する必要がある。(PDOStatementクラスのインスタンスにnullを代入する等)

 <?php
    try
    {
       $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
       foreach($dbh->query('SELECT * from FOO') as $row)
       {
          print_r($row);
       }
       $dbh = null;
    }
    catch(PDOException $e)
    {
       print "エラー!: " . $e->getMessage() . "<br/>";
       die();
    }
 ?>


データベースの接続を閉じる

データベースの接続は、PHPスクリプトが終了しても閉じられずにキャッシュされ、他のPHPスクリプトが同じ内容の接続を要求する時に再利用される。
このキャッシュにより、新しい接続を確立するオーバーヘッドを避けることができるため、Webアプリケーションを高速化できるようになる。

 <?php
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
    
    $sth = $dbh->query('SELECT * FROM foo');
 
    // 使用を終了したので、閉じます
    $sth = null;
    $dbh = null;
 ?>


持続的な接続

PDO::ATTR_PERSISTENTオプションの値は、string型の値が設定されない限り、bool型(持続的な接続の有無を示す)に変換される。
string型の値を設定する場合、複数の接続プールを使用することができる。

これは、互換性の無い異なる接続を使用する場合に便利である。
例えば、異なるPDO::MYSQL_ATTR_USE_BUFFERED_QUERYの値を設定する場合が挙げられる。

※注意1
持続的な接続をする場合、ドライバのオプションにPDO::ATTR_PERSISTENTを設定して、PDOクラスのコンストラクタに渡す必要がある。
この属性を、インスタンスの生成後にPDO::setAttributeメソッドを使用して設定する場合、ドライバは持続的な接続を使用しない。

※注意2
PDO ODBCドライバを使用しており、ODBCライブラリがODBC接続プーリングをサポートしている場合は、
PDOの持続的な接続を使用せずに、ODBCの接続プーリングに接続キャッシュ処理を任せることを推奨する。

ODBCの接続プールは、プロセス内で他のモジュールと共有されている。
PDOが接続をキャッシュすると、その接続はODBCの接続プールに返されなくなり、他のモジュールによって新たな接続が作成されてしまう。

 <?php
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
 ?>