最終更新日:
公開日:
レシピ
データベース PDO
PDOでデータを取得(SELECT)
データベースの基本操作である作成(INSERT)、参照(SELECT)、更新(UPDATE)、削除(DELETE)のうち、参照(SELECT)を行う方法についてMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースを使いながら解説します。
この記事のポイント
- データベースに登録したデータを取得する
- 取得するデータの指定ではプリペアドステートメントを使用する
目次
PDOを使ってデータを取得する
今回はデータベースに登録されたデータを取得する方法について解説します。
前提として、データベースには「test」データベースがあり、次の構造を持ったuser_listテーブルがあることとします。
カラム名 | 型 | その他 |
---|---|---|
id | 整数 | 主キー |
name | 文字列 | |
age | 整数 | |
created_at | 日付(またはタイムスタンプ) |
PDO自体の基本的な内容については「PDOについて」を、データベースへの接続方法については「PDOを使ってデータベースへ接続」をご覧ください。
データを取得する流れを確認
今回はPDOを使ってMySQL、MariaDB、PostgreSQL、SQLiteの4種類のデータベースからそれぞれデータを取得する例を解説していきますが全体の流れは全て同じです。
データベースの接続部分など一部を除いてコードは同じものを使用することができます。
そこでまずはデータを取得する流れを確認しておきましょう。
データを取得するコード例
<?php
// (1) 取得するデータのidを指定
$id = 4;
// (2) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname=test;host=localhost', 'username', 'password');
// (3) SQL作成
$stmt = $pdo->prepare("SELECT * FROM user_list WHERE id = :id");
// (4) 登録するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
// (5) SQL実行
$res = $stmt->execute();
// (6) 該当するデータを取得
if( $res ) {
$data = $stmt->fetch();
var_dump($data);
}
// (7) データベースの接続解除
$pdo = null;
上記SQLを実行すると、(1)の$idの値と等しいidカラムのデータを検索します。
(2)ではデータベースへの接続を行いますが、上記のコードはMySQLとMariaDBのときの接続例です。
その他のデータベースを使う場合はこの箇所を変更します。
(3)はデータを取得するためのSQLを設定します。
ここではSQLに検索対象のidの値を直接は書かずに、プリペアドステートメントで「:id」というプレースホルダーを記述しておきます。
そして続く(4)でbindParamメソッドを使ってプレースホルダーに変数$idの値を設定します。
bindParamメソッドの第3パラメータで指定している「PDO::PARAM_INT」はPDOがあらかじめ用意している定数で、セットする値の型によって使い分けます。
もしセットする値が文字列なら「PDO::PARAM_STR」を使いますが、今回のidカラムのような数値であれば「PDO::PARAM_INT」を指定します。
(5)ではここまで準備してきたプリペアドステートメントをいよいよ実行します。
変数$resには取得したデータではなく、クエリ自体が正常に実行されたかが論理値で入ります。
もしクエリの実行に成功したときはtrue、失敗した場合はfalseが入ります。
取得したデータは続く(6)でfetchメソッドより配列形式で取得できます。
データを取得できなかった場合は論理値のfalseが返り値になります。
最後に(7)で$pdoにnullを入れることでデータベースの接続を解除します。
ここまでがPDOによるデータ取得の基本的な流れになります。
以降は使用するデータベースの種類別に分けて解説していきます。
MySQL / MariaDBでデータを取得する
まずはMySQLとMariaDBからデータの取得をしていきます。
この2つのデータベースは互換性があるため、基本的なデータの取得では共通のコードを使うことができます。
テーブル「user_list」には以下のようなデータが入っていることとして、idカラムに4の値が入っているデータを取得していきます。
user_list
id | name | age | created_at
----+------------+-----+------------
1 | 山田太郎 | 34 | 2021-06-24 11:20:00
2 | 佐藤健太 | 33 | 2021-06-24 11:20:00
3 | 高岡幸子 | 30 | 2021-06-24 11:20:00
4 | 大澤亮 | 28 | 2021-06-24 09:12:47
5 | 吉田明美 | 26 | 2021-06-01 10:49:05
データを取得するコードは先ほどと同じコードです。
コード例
<?php
// (1) 取得するデータのidを指定
$id = 4;
// (2) データベースに接続
$pdo = new PDO('mysql:charset=UTF8;dbname=test;host=localhost', 'username', 'password');
// (3) SQL作成
$stmt = $pdo->prepare("SELECT * FROM user_list WHERE id = :id");
// (4) 登録するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
// (5) SQL実行
$res = $stmt->execute();
// (6) 該当するデータを取得
if( $res ) {
$data = $stmt->fetch();
var_dump($data);
}
// (7) データベースの接続解除
$pdo = null;
データを取得できた場合はvar_dump関数によって以下のような出力がされます。
array(8) { ["id"]=> string(1) "4" [0]=> string(1) "4" ["name"]=> string(9) "大澤亮" [1]=> string(9) "大澤亮" ["age"]=> string(2) "28" [2]=> string(2) "28" ["created_at"]=> string(19) "2021-07-14 19:01:55" [3]=> string(19) "2021-07-14 19:01:55" }
取得したデータは添字が連想配列と数値の2種類が入っているため、どちらを使っても個別の値を参照することができます。
例えば取得したデータのnameカラムは$data[‘name’]、または$data[1]から参照することができます。
PostgreSQLでデータを取得する
続いて、PDOでPostgreSQLに入っているデータの更新を行います。
基本的なコードはMySQLと同様ですが、データベース接続部分など細かいところに違いが出てきます。
テーブル「user_list」には以下のようなデータが入っていることとします。
user_list
id | name | age | created_at
----+------------+-----+------------
1 | 山田太郎 | 30 | 2021-06-25
2 | 山田太郎 | 30 | 2021-06-25
3 | 山田太郎 | 30 | 2021-06-25
4 | 加藤剛 | 28 | 2021-07-07
6 | 山田太郎4 | 35 | 2021-06-01
7 | 山田太郎4 | 35 | 2021-06-27
5 | 高岡幸子 | 26 | 2021-06-01
今回はidカラムに4の値が入っているデータを取得ていきます。
コード例
<?php
// (1) 取得するデータのidを指定
$id = 4;
// (2) データベースに接続
$pdo = new PDO('pgsql:dbname=test;options=\'--client_encoding=UTF8\';host=localhost', 'username', 'password');
// (3) SQL作成
$stmt = $pdo->prepare("SELECT * FROM user_list WHERE id = :id");
// (4) 登録するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
// (5) SQL実行
$res = $stmt->execute();
// (6) SQL実行
if( $res ) {
$data = $stmt->fetch();
var_dump($data);
}
// (7) データベースの接続解除
$pdo = null;
データを取得できた場合はvar_dump関数によって以下のような出力がされます。
array(8) { ["id"]=> int(4) [0]=> int(4) ["name"]=> string(9) "加藤剛" [1]=> string(9) "加藤剛" ["age"]=> int(28) [2]=> int(28) ["created_at"]=> string(10) "2021-07-07" [3]=> string(10) "2021-07-07" }
PostgreSQLについても取得したデータは添字が連想配列と数値の2種類が入っています。
例えば取得したデータのnameカラムは$data[‘name’]、または$data[1]から参照することができます。
SQLiteでデータを取得する
最後にSQLiteでデータの更新を行います。
全体の流れは上記2つのデータベースと同じです。
ここではテーブル「user_list」に以下のデータが入っていることとします。
user_list
1|山田太郎|30|2021-06-25 13:22:50
2|佐藤遥|26|2021-06-27 11:02:54
3|岡部倫太郎|21|2021-06-27 11:03:07
4|宮田えり|24|2021-07-02 10:05:02
5|杉田咲|23|2021-06-27 11:03:33
こちらのテーブルから、idカラムに4の値が入っているデータを取得していきます。
コード例
<?php
// (1) 登録するデータを用意
$id = 4;
// (2) データベースに接続
$pdo = new PDO('sqlite:./sqlite/test.sqlite3');
// (3) SQL作成
$stmt = $pdo->prepare("SELECT * FROM user_list WHERE id = :id");
// (4) 登録するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);
// (5) SQL実行
$res = $stmt->execute();
if( $res ) {
$data = $stmt->fetch();
var_dump($data);
}
// (6) データベースの接続解除
$pdo = null;
SQLiteについても取得したデータは添字が連想配列と数値の2種類が入っています。
例えば取得したデータのnameカラムは$data[‘name’]、または$data[1]から参照することができます。