PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PDO

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

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

この記事のポイント

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

目次

PDOでデータベースに接続してみる

今回はMySQL、MariaDB、SQLite、PostgreSQLの4種類のデータベースを使って、実際に接続&解除する方法を解説します。

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

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

MySQL / MariaDBに接続&解除

まずはMySQLとMariaDBから、PDOを使った接続と解除を行っていきます。
この2つのデータベースはどちらも「mysql」として接続することができます。

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

MySQL / MariaDBへ接続するコード例

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

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

  • 使用するドライバー(mysql) – 使用するデータベースの種類(MySQL、Postgresqlなど)を指定
  • ホスト(host) – データベースのホスト
  • データベース名(dbname) – 接続するデータベースの名前
  • 文字コード(charset) – データベースの各種操作で使用する文字コード

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

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

MySQLへの接続を解除するコード例

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

実践的なコード

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

コード例

<?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とMariaDBへの接続の流れとなります。

PostgreSQLに接続&解除

続いて、PostgreSQLデータベースへ接続してみましょう。
基本的な流れはMySQLと同じですが、オレンジ色になっているPDOのインスタンスを作成する部分だけが修正点となります。

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

PostgreSQLデータベースへ接続するコード例

<?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つと同じになり、PDOのインスタンスを作成する箇所のみ異なります。

SQLiteデータベースへ接続するコード例

<?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というエラー(例外)を投げる」と書きましたが、実際にそのエラーメッセージを確認してみましょう。

コード例

<?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

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。