PHP-DB - 3. PDOインスタンスの生成
それではPDOによるデータベースプログラミングを始めましょう。PDOライブラリを使ってデータベースにアクセスするには、まずPDOインスタンスを生成します。次のプログラム( pdo1.php
)を作成します。
$dsn = "sqlite:eldb.sqlite3";
$pdo = new PDO($dsn);
PDOクラスのコンストラクタにはデータソース名(DSN)を指定します。DSNはPDOドライバの名前の後に :
コロンが続き、その後のPDOドライバ固有の接続構文となります。SQLiteのDSNは以下のようになっています。
sqlite:eldb.sqlite3
先頭の sqlite:
はSQLite用ののデータベースドライバを利用することを意味しています。その後に指定している eldb.sqlite3
はファイル名です。SQLiteはデータベースの情報を1つのファイルで管理します。
それではコマンドラインからプログラムを実行してみましょう。
$ php pdo1.php
上手くデータベースに接続できた場合は上記のように何もメッセージは出力されないでしょう。もしDSNに誤りがあったり、データベースサーバが停止していたり、あるいはドライバが存在しないなど、何かしらの不具合が発生した場合は次のようなメッセージが表示されるでしょう。
$ php pdo1.php
Fatal error: Uncaught PDOException: could not find driver
in /Users/your_name/Desktop/code-php-db/pdo1.php:3
Stack trace:
#0 /Users/your_name/Desktop/code-php-db/pdo1.php(3):
PDO->__construct('sqlite3:eldb.sq...')
#1 {main}
thrown in /Users/your_name/Desktop/code-php-db/pdo1.php on line 3
ここではメッセージを折り返して表示しています。
ここでは上記のエラーメッセージの先頭行に注目しましょう。
Fatal error: Uncaught PDOException: could not find driver
in /Users/your_name/Desktop/code-php-db/pdo1.php:3
Fatal errorという出力の後に Uncaught PDOException
とメッセージが続きます。これは PDOException
という例外がスローされていることを意味します。ここでは PDOException
をキャッチしていないため、PHPの実行環境が PDOException
を処理して、処理を異常終了させています。
PDOクラス
それでは PDO
クラスについて整理しておきましょう。
上記の図に示すように PDO
クラスには、引数にDSNを受け取るコンストラクタを定義されています。このDSNには、接続するデータベース固有の接続構文を指定します。データベース接続に成功すると PDO
インスタンスが生成されますが、接続に失敗した場合は PDOException
がスローされます。またこれから学習していくように PDO
クラスにはデータベースを操作するための query
メソッドや exec
メソッドが用意されています。
PDO
の利点はデータベース製品の差異を吸収してくれるところです。接続先のデータベースを変更した場合、 PDO
インスタンスの接続情報(DSN、ユーザ名、パスワード)だけ変更すれば、後の query
メソッドや fetch
メソッドなどの処理はそのまま再利用できます。
参考:データソース名
主要なデータベースのDSNは以下のとおりです。
データベース | DSN |
---|---|
PostgreSQL | "pgsql:host=localhost; port=5432; dbname=postgres" |
MySQL | "mysql:host=localhost; dbname=eldb; charset=utf8mb4" |
SQLite3 | "sqlite:eldb.sqlite3" |
たとえば、PostgreSQLに接続する場合は以下のように記述します。
$dsn = "pgsql:host=localhost;port=5432;dbname=postgres";
$username = "postgres";
$passwd = "postgres";
$pdo = new PDO($dsn, $username, $passwd);
通常、PostgreSQLに接続する場合はユーザ名、パスワードが必要です。これらの情報も PDO
クラスのコンストラクタ引数で指定できます。またPostgreSQLのDSNは以下のようになっています。
pgsql:host=localhost;port=15432;dbname=postgres
先頭の pgsql:
はPostgreSQL用ののデータベースドライバを利用することを意味しています。その後に host=localhost;port=5432;
とネットワーク情報が続きます。この場合はローカルホスト上の5432ポートで起動しているPostgreSQLサーバにアクセスします。その後には dbname=postgres
と記述が続きます。ここではPostgreSQL内のデータベース名を記述しています。
まとめ
new
演算子によってPDO
インスタンスを作成するPDO
クラスのコンストラクタの引数にはDSN(Data Source Name)
を指定するPDO
インスタンスの生成に失敗するとPDOException
がスローされる