レシピ
データベース PDO
PDOでデータを取得(SELECT)
データベースの基本操作である作成(INSERT)、参照(SELECT)、更新(UPDATE)、削除(DELETE)のうち、参照(SELECT)を行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースを使いながら解説します。
この記事のポイント
- データベースに登録したデータを取得する
- データベースからデータを取得する基本的なSQLを確認する
- パラメータ形式でデータを検索する
目次
PDOを使ってデータを取得する
今回はデータベースに登録されたデータを取得する方法について解説します。
前提として、データベースには「test」データベースがあり、次の構造を持ったuser_listテーブルがあることとします。
カラム名 | 型 | その他 |
---|---|---|
id | 整数 | 主キー |
name | 文字列 | |
age | 整数 | |
registry_datetime | 日付(またはタイムスタンプ) |
PDO自体の基本的な内容については「PDOについて」を、データベースへの接続方法については「PDOを使ってデータベースへ接続」をご覧ください。
データを取得する流れを確認
4種類のデータベースからそれぞれデータを取得していきますが、実は実行するSQLや全体の流れは全て同じです。
そこでまずはデータ取得の部分のみ確認してしまいましょう。
データを取得するコード例
// SQL文を作成
$sql = "SELECT * FROM user_list";
// クエリ実行(データを取得)
$res = $dbh->query($sql);
上記SQLを実行すると$resに取得したデータが格納されます。
もしクエリの実行に成功したらPDOStatementオブジェクトが入り、失敗してしまったらfalseが入ります。
テーブルにデータが入っていなかったり、条件にあうデータがなく1件もデータを取得できなかった場合についても、SQLの実行自体が成功していればPDOStatementオブジェクトを取得します。
MySQL / MariaDBでデータを取得する
まずはMySQLとMariaDBからデータの取得をしていきます。
この2つのデータベースは共通の方法が使えるため、まとめて解説していきます。
先ほどご紹介したデータの取得するコードを実用的にすると次のようになります。
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とMariaDBでのデータ取得方法でした。
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であれば「疑問符パラメータ」も有効ですが、パラメータの数が多くなるときは「名前付きパラメータ」の方がパラメータと値の関係は分かりやすくなるためオススメです。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。