PHP-DB - 3. PDOインスタンスの生成
それではPDOによるデータベースプログラミングを始めましょう。PDOライブラリを使ってデータベースにアクセスするには、まずPDOインスタンスを生成します。次のプログラム( pdo1.php )を作成します。
<?php
$dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
$username = "root";
$password = "admin";
$pdo = new PDO($dsn, $username, $password);
PDOクラスのコンストラクタにはデータソース名(DSN)を指定します。DSNはPDOドライバの名前の後に : コロンが続き、その後のPDOドライバ固有の接続構文となります。MySQLのDSNは以下のようになっています。
mysql:host=localhost;dbname=eldb;charset=utf8mb4"
先頭の mysql: はMySQL用のデータベースドライバを利用することを意味しています。その後には以下の情報が続きます。
| 項目名 | 値 | 意味 |
|---|---|---|
| host | localhost | 自分のコンピュータ |
| dbname | eldb | MySQLのデータベース名 |
| charset | utf8mb4 | 文字コード |
Cloud9上で動作さいているMySQLに接続する場合は上記のように記述します。他のコンピュータ上で動作しているMySQLに接続する場合は host にそのコンピュータのIPアドレスを指定するなどします。また上記以外にも port を指定してMySQLの起動しているポート番号を指定することもできます。
データソース名(DSN)は無理に暗記する必要はありません。インターネット上で調べて書き方を調べれば大丈夫です。まt手書きするとタイプミスもあるのでコピーアンドペーストをうまく使うことも大切です。
それではターミナルからプログラムを実行してみましょう。
$ php pdo1.php
上手くデータベースに接続できた場合は上記のように何もメッセージは出力されないでしょう。もしDSNに誤りがあったり、データベースサーバが停止していたり、あるいはドライバが存在しないなど、何かしらの不具合が発生した場合は次のようなメッセージが表示されるでしょう。
$ php pdo1.php
PHP Fatal error: Uncaught PDOException: could not find driver in /home/ec2-user/environment/original/pdo1.php:5
Stack trace:
#0 /home/ec2-user/environment/original/pdo1.php(5): PDO->__construct('mysq:host=local...', 'root', 'admin')
#1 {main}
thrown in /home/ec2-user/environment/original/pdo1.php on line 5
ここではメッセージを折り返して表示しています。
ここでは上記のエラーメッセージの先頭行に注目しましょう。
PHP Fatal error: Uncaught PDOException: could not find driver in /home/ec2-user/environment/original/pdo1.php:5
Fatal errorという出力の後に Uncaught PDOException とメッセージが続きます。これは PDOException という例外がスローされていることを意味します。ここでは PDOException をキャッチしていないため、PHPの実行環境が PDOException を処理して、処理を異常終了させています。
PDOクラス
それでは PDO クラスについて整理しておきましょう。

上記の図に示すように PDO クラスには、引数にDSN、ユーザ名、パスワードの3つを受け取るコンストラクタが定義されています。このDSNには、接続するデータベース固有の接続構文を指定し、ユーザ名・パスワードにはMySQLデータベースのアカウントを指定します。データベース接続に成功すると PDO インスタンスが生成されますが、接続に失敗した場合は PDOException がスローされます。またこれから学習していくように PDO クラスにはデータベースを操作するための query メソッドや exec メソッドが用意されています。
PDO の利点はデータベースプロダクトの差異を吸収してくれるところです。接続先のデータベースを変更したとしても PDO インスタンスの接続情報(DSN、ユーザ名、パスワード)だけ変更すれば、後の query メソッドや fetch メソッドなどの処理はそのまま再利用できます。
参考:データソース名
主要なデータベースのDSNは以下のとおりです。
| データベース | DSN |
|---|---|
| MySQL | "mysql:host=localhost;dbname=eldb;charset=utf8mb4" |
| PostgreSQL | "pgsql:host=localhost;port=5432;dbname=eldb" |
| SQLite3 | "sqlite:eldb.sqlite3" |
たとえば、PostgreSQLに接続する場合は以下のように記述します。
$dsn = "pgsql:host=localhost;port=5432;dbname=eldb";
$username = "postgres";
$passwd = "postgres";
$pdo = new PDO($dsn, $username, $passwd);
PostgreSQLのDSNは以下のようになっています。
pgsql:host=localhost;port=15432;dbname=eldb
先頭の pgsql: はPostgreSQL用のデータベースドライバを利用することを意味しています。その後に host=localhost;port=5432; とネットワーク情報が続きます。この場合はローカルホスト上の5432ポートで起動しているPostgreSQLサーバにアクセスします。その後には dbname=eldb と記述が続きます。ここではPostgreSQL内のデータベース名を記述しています。
まとめ
new演算子によってPDOインスタンスを作成するPDOクラスのコンストラクタの引数にはDSN(Data Source Name)を指定するPDOインスタンスの生成に失敗するとPDOExceptionがスローされる