PHPプログラミング

レシピ

データベース PDO

PDOでデータを取得(SELECT)

今回はデータベースの基本操作である生成(INSERT)、参照(SELECT)、更新(UPDATE)、削除(DELETE)のうち、PDOで参照(SELECT)を行う方法です。MySQL、PostgreSQL、SQLiteの3種類のデータベースを使いながら解説します。

この記事のポイント

  • データベースに登録したデータを取得する
  • データベースからデータを取得する基本的なSQLを確認する
  • パラメータ形式でデータを検索する

目次

PDOを使ってデータを取得する

今回はデータベースに登録されたデータを取得する方法について解説します。

前提として、データベースには「test」データベースがあり、次の構造を持ったuser_listテーブルがあることとします。

テーブル名:user_list
カラム名その他
id整数主キー
name文字列
age整数
registry_datetime日付(またはタイムスタンプ)

PDO自体の基本的な内容については「PDOについて」を、データベースへの接続方法については「PDOを使ってデータベースへ接続」をご覧ください。

データを取得する流れを確認

3種類のデータベースからそれぞれデータを取得していきますが、実は実行するSQLや全体の流れは全て同じです
そこでまずはデータ取得の部分のみ確認してしまいましょう。

データを取得するコード例

// SQL文を作成
$sql = "SELECT * FROM user_list";

// クエリ実行(データを取得)
$res = $dbh->query($sql);

上記SQLを実行すると$resに取得したデータが格納されます。
もしクエリの実行に成功したらPDOStatementオブジェクトが入り、失敗してしまったらfalseが入ります。

テーブルにデータが入っていなかったり、条件にあうデータがなく1件もデータを取得できなかった場合についても、SQLの実行自体が成功していればPDOStatementオブジェクトを取得します。

MySQLでデータを取得する

まずはMySQLからデータの取得をしていきます。

先ほどご紹介したデータの取得するコードを実用的にすると次のようになります。
DBの接続と解除、データベースの処理をtry文で囲む部分については「PDOを使ってデータベースへ接続」でご紹介したものをそのまま使っています。

index.php

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

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

	// SQL作成
	$sql = "SELECT * FROM user_list";

	// SQL実行
	$res = $dbh->query($sql);

	// 取得したデータを出力
	foreach( $res as $value ) {
		echo "$value[name]<br>";
	}

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

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

データを無事に取得できた場合はforeach文の中のechoによって「名前」が出力されます。

出力例

テスト太郎
テスト二郎
テスト健太

$valueの後ろに<br>タグがあることで、1つ1つのデータが改行されて出力されます。
以上がMySQLでのデータ取得です。

PostgreSQLでデータを取得する

続いて、PostgreSQLでデータの取得をします。
コードはデータベース接続の箇所以外、MySQLと同様の内容です。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

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

	// SQL作成
	$sql = "SELECT * FROM user_list";

	// SQL実行
	$res = $dbh->query($sql);

	// 取得したデータを出力
	foreach( $res as $value ) {
		echo "$value[name]<br>";
	}

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

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

以上がPostgreSQでのデータ取得です。

SQLiteでデータを取得する

最後にSQLiteでデータの取得を行います。
全体の流れはデータベースの接続以外、上記2つのデータベースと同じ内容です。

コード例

<?php

// 変数の初期化
$sql = null;
$res = null;
$dbh = null;

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

	// SQL作成
	$sql = "SELECT * FROM user_list";

	// SQL実行
	$res = $dbh->query($sql);

	// 取得したデータを出力
	foreach( $res as $value ) {
		echo "$value[name]<br>";
	}

} catch(PDOException $e) {

	echo $e->getMessage();
	die();
}

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

以上、SQLiteでのデータ取得でした。

SELECT文で使うことのできるWHERE句ORDER BY句は上記のデータベースで共通して使うことができます。
ただしデータの「型」の扱い方がそれぞれ異なるため、詳細な条件を指定したい場合は利用するデータベースの特徴に合わせる必要があることに注意してください。

プリペアドステートメント(prepare)でパラメータを使ってデータを取得する

最後にプリペアドステートメントを使ってパラメータ形式で値を検索する方法を紹介します。
この方法はいずれのデータベースでも共通で使用できますが、以下の例ではMariaDBを使います。

プリペアドステートメントでパラメータを指定する方法は「名前付きパラメータ」と「疑問符パラメータ」のいずれかを選ぶことができます。

名前付きパラメータ

「名前付きパラメータ」はSQLの中でパラメータで値を渡したい箇所を「:パラメータ名」の形で記述します。
変数のようなイメージです。

SQLの例

// SQLを作成
$sql = 'SELECT * FROM test WHERE name = :name';

上記のSQLでは「:name」がパラメータの入る箇所になります。
それでは実際にパラメータに値を渡して検索を実行してみましょう。

コード例

<?php

// 変数の初期化
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'SELECT * FROM test WHERE name = :name';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$statement->execute( array(
    ':name' => 'エチオピア'
));

// 結果を取得
$result = $statement->fetchAll();

// DB接続を解除
$statement = null;
$db_handle = null;

SQLを作成したあとは「// SQL実行準備」でSQLを渡して実行準備を行い、「// 値を渡して実行」でexecuteメソッドでパラメータに対応する値を指定してSELECT文による検索を実行します。

実行後に返される結果はfetchAllメソッドから取得することができます。

ちなみに、複数のパラメータを指定する場合についても順番は自由に記述するができます。
例えば、SQL文で「:name」「:category」の2つを指定する場合、実行時に「:category」「:name」のように逆順で指定しても正しく実行することができます。

値の指定例

// SQL作成
$sql = 'SELECT * FROM test WHERE name = :name AND category = :category';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$statement->execute( array(
    ':category' => 2,
    ':name' => 'エチオピア',
));

疑問符パラメータ

「疑問符パラメータ」は、SQL文の中にパラメータを渡したい箇所に「?」を記述します。

SQLの例

// SQLを作成
$sql = 'SELECT * FROM test WHERE name = ? AND category = ?';

パラメータの値は次のように配列形式で渡します。

コード例

<?php

// 変数の初期化
$db_handle = null;
$statement = null;
$result = null;

// PDOのインスタンスを生成し、DBに接続する
try {
    $db_handle = new PDO( 'mysql:host=127.0.0.1; dbname=test; charset=utf8', 'username', 'password');
} catch(PDOException $e) {
    echo '接続エラー:' . $e->getMessage();
}

// SQL作成
$sql = 'SELECT * FROM test WHERE name = ? AND category = ?';

// SQL実行準備
$statement = $db_handle->prepare($sql);

// 値を渡して実行
$statement->execute( array('エチオピア',1));

$result = $statement->fetchAll();

// DB接続を解除
$statement = null;
$db_handle = null;

「疑問符パラメータ」は渡した配列の先頭から順に「?」に当てはめていくため、値は正しい順番で指定する必要がある点に注意してください。

以上がパラメータを使ったデータの検索方法です。
今回のような比較的シンプルなSQLであれば「疑問符パラメータ」も有効ですが、パラメータの数が多くなるときは「名前付きパラメータ」の方がパラメータと値の関係は分かりやすくなるためオススメです。

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

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

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