PHPプログラミング

ベストプラクティス

データベース PDO その3

PDOを使ってデータベースへ接続

  • このエントリーをはてなブックマークに追加

PDOを使ったデータベースへの接続方法を「MySQL」「SQLite」「PostgreSQL」の3種類のデータベースを使って解説します。

目次

  1. #  PDOからデータベースへ接続してみる
  2. #  MySQLデータベースへ接続&解除
  3. #  PostgreSQLデータベースへ接続&解除
  4. #  SQLiteデータベースへ接続&解除
  5. #  データベースに接続できない場合

PDOからデータベースへ接続してみる

今回は「MySQL」「SQLite」「PostgreSQL」の3種類のデータベースを使って、実際に接続&解除する方法を解説します。
次のような方を対象としています。

  • PDOを使ったデータベースへの接続&解除の方法を確認したい
  • PDOからMySQL/SQLite/PostgreSQLへの接続方法を確認したい
  • 接続に失敗してしまった時の対応方法を知りたい

3種類のデータベースには全て「test」というデータベースがあり、その中に「test」というテーブルがあることを前提とします。
それでは、それぞれのデータベースごとに1つずつ確認していきましょう。

PDOの基本的なご紹介は「PDOについて」を、ご利用の環境でPDOが利用できるデータベースを知りたい場合は「PDOで使用できるデータベースを調べる」をご覧ください。

MySQLデータベースへ接続&解除

まずはMySQLデータベースからPDOを使った接続と解除を行っていきます。

PDOのデータベース接続はコンストラクタで提供されており、インスタンスを生成する際にデータベースの情報を渡して接続します。

MySQLへ接続

// MySQLへ接続
$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

MySQLデータベースを使用したい場合は、インスタンスを生成する際に「接続情報」「ユーザー名」「パスワード」の3つの引数を渡します。
1つ目の引数ではさらに、次の4つの情報を指定しています。

  • 使用するドライバー(mysql) – 使用したいデータベースを指定
  • ホスト(host) – データベースのホスト
  • データベース名(dbname) – データベースにログインするユーザー名
  • 文字コード(charset) – データベースにログインするユーザーのパスワード

これらの値を渡して接続に成功すると、PDOオブジェクトが返されます。
このオブジェクトを使って、クエリを実行したりするメソッドを呼び出すことになります。

接続を解除する方法は非常に簡単で、PDOオブジェクトを削除すれば完了です。

MySQLへの接続を解除

// 接続を解除
$dbh = null;

実践的なコード

実際には次のようなコードを使って、MySQLデータベースへアクセスを行います。

index.php

<?php

try {
	// DBへ接続
	$dbh = new PDO("mysql:host=127.0.0.1; dbname=test; charset=utf8", 'username', 'password');

	// testテーブルの全データを取得
	$sql = 'SELECT * FROM test';
	$data = $dbh->query($sql);

	if( !empty($data) ) {
		foreach( $data as $value ) {
			var_dump($value['name']);
		}
	}

} catch(PDOException $e) {
	
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

こちらのコードは次の順番に処理を行っています。

  1. (1)データベースへ接続
  2. (2)「test」テーブルのデータを全て取得してダンプ
  3. (3)接続を解除

(1)と(2)をtry文で囲っているのは接続エラー対策です。
PDOでは接続に失敗した場合、「PDOException」というエラー(例外)を投げます。
それをcatch文で受け取り、getMessageメソッドでエラーメッセージを取得することで、どんなエラーが起きたかが分かるようになっています。

データベースに接続できなかった場合は以降の処理も実行できない場合が多いため、多くの場合はdie関数を使用して処理自体を終了することが多いです。

以上が基本的なMySQLデータベースの接続の流れとなります。

PostgreSQLデータベースへ接続&解除

続いて、PostgreSQLデータベースへ接続してみましょう。
基本的な流れはMySQLと同じですが、データベースへ接続するためのPDOオブジェクトのインスタンスを生成する部分が異なります。

百聞は一見にしかずということで、まずはコードを見ていきましょう。

index.php

<?php

try {
	// DBへ接続
	$dbh = new PDO("pgsql:host=127.0.0.1; dbname=test;", 'username', 'password');

	// testテーブルの全データを取得
	$sql = 'SELECT * FROM test';
	$data = $dbh->query($sql);

	if( !empty($data) ) {
		foreach( $data as $value ) {
			var_dump($value['name']);
		}
	}

} catch(PDOException $e) {
	
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

「// DBへ接続」の箇所で、指定しているデータベースのドライバーがPostgreSQLの「pgsql」を指定しています。
あとは文字コードの指定以外同じです。

以上がPostgreSQLデータベースの接続の流れでした。

SQLiteデータベースへ接続&解除

最後にSQLiteデータベースへ接続していきます。
ここでもやはり基本的な流れは上記2つと同じです。

index.php

<?php

try {
	// DBへ接続
	$dbh = new PDO("sqlite:./sqlite/test.sqlite3");

	// testテーブルの全データを取得
	$sql = 'SELECT * FROM test';
	$data = $dbh->query($sql);

	if( !empty($data) ) {
		foreach( $data as $value ) {
			var_dump($value['name']);
		}
	}

} catch(PDOException $e) {
	
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

SQLiteはファイルベースのため、「// DBへ接続」の第1引数でドライバーを「sqlite」と指定した後にデータベースファイルのパスを渡します。
ユーザー名、パスワードは不要です。

以上、SQLiteデータベースへの接続の流れでした。

データベースに接続できない場合

もしPDOがデータベース接続に失敗したらどうなるでしょうか。
先ほど、接続に失敗すると「PDOExceptionというエラー(例外)を投げる」と書きましたが、実際にそのエラーメッセージを確認してみましょう。

index.php

<?php

try {
	// Oracle databaseへ接続
	$dbh = new PDO("oci:dbname=test;", 'username', 'password');

	// testテーブルの全データを取得
	$sql = 'SELECT * FROM test';
	$data = $dbh->query($sql);

	if( !empty($data) ) {
		foreach( $data as $value ) {
			var_dump($value['name']);
		}
	}

} catch(PDOException $e) {
	
	echo $e->getMessage();
	die();
}

// 接続を閉じる
$dbh = null;

実行環境にドライバーの無い「Oracle database」へ接続しようとすると、下記のメッセージが表示されました。

取得したエラーメッセージ

could not find driver

エラー内容によってメッセージ内容は異なりますが、このようにメッセージを出力して確認することで原因を特定したり、処理を分岐させることができます。
もしうまくデータベースに接続できていないようだったり、SQLなどの処理がうまくいかないことがありましたら、エラーメッセージを積極的に確認してみてください。

今回解説した内容についてのphp.netのページはこちら
PDO::__construct – php.net

  • このエントリーをはてなブックマークに追加