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
がスローされる