PHPプログラミング

最終更新日:
公開日:

レシピ

データベース PDO

PDOでデータを取得(SELECT)

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

この記事のポイント

  • データベースに登録したデータを取得する
  • 取得するデータの指定ではプリペアドステートメントを使用する

目次

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

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

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

テーブル名: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の値を持つデータを検索します。

(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)で$pdonullを入れることでデータベースの接続を解除します。

ここまでが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]から参照することができます。

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

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

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