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