PHP-DB - 3. PDOインスタンスの生成

それではPDOによるデータベースプログラミングを始めましょう。PDOライブラリを使ってデータベースにアクセスするには、まずPDOインスタンスを生成します。次のプログラム( pdo1.php )を作成します。

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