PHPプログラミング

最終更新日:
公開日:

レシピ

データベース SQLite

SQLiteのデータを取得する:SELECT

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

この記事のポイント

  • SQLiteのデータベースに登録されているデータを取得する
  • データを取得する方法はSQLite3クラスを使う方法、PDOを使う方法がある
  • 条件を指定してデータを取得するときはプリペアドステートメントを使う

目次

データを取得する

SQLiteのデータベースに登録されているデータを取得する方法について、SQLite3クラスを使う方法とPDOを使う方法をそれぞれ解説します。

今回は次のようなテーブル「test_table」がすでにあることを前提に進めていきます。

テーブル名:test_table
カラム名その他
idINTEGERPRIMARY KEY
nameTEXTNOT NULL
ageINTEGERNOT NULL
created_datetimeTIMESTAMPDEFAULT (datetime(CURRENT_TIMESTAMP,’localtime’))

Note

テーブルの作成方法については別記事「SQLiteにテーブルを作成する:CREATE TABLE」をご覧ください。

こちらのテーブルには次のようなデータが登録されています。

test_tableテーブルに登録されているデータ

1|山田|30|2022-04-10 10:00:00
2|石川|33|2022-04-12 10:00:00
3|斉藤|42|2022-04-14 10:00:00
4|高橋|34|2022-04-16 10:00:00
5|佐藤|20|2022-04-18 10:00:00
6|大塚|28|2022-04-20 10:00:00
7|林|39|2022-04-22 10:00:00
8|萩原|32|2022-04-24 10:00:00
9|浜崎|26|2022-04-26 10:00:00
10|梶原|28|2022-04-28 10:00:00

SQLite3クラスでデータを取得する

まずはSQLite3クラスを使って、SQLiteのデータベースに登録されているデータを取得する方法を解説します。
今回はidカラム5がセットされている行のデータを取得します。

以下のコードは(1)取得するデータを特定するためのidカラムを用意し、(2)データベースに接続して(3)SQLを作成、そして(4)プリペアドステートメントの準備と(5)データ取得を実行、(6)取得したデータを出力、そして最後に(7)データベースの接続を解除するという流れになっています。

index.php

<?php

// (1)取得するデータのidカラムを用意
$id = 5;

// (2)データベースに接続
$db = new SQLite3("./sqlite/test.db");

// (3)SQL作成
$stmt = $db->prepare("SELECT * FROM test_table
	WHERE
		id = :id
");

// (4)取得するデータをセット
$stmt->bindValue( ':id', $id, SQLITE3_INTEGER);

// (5)SQL実行
$res = $stmt->execute();

// (6)取得したデータを出力
var_dump($res->fetchArray());

// (7)データベースの接続解除
$db->close();

(3)のSQLを作成するタイミングではSQLに値を直接記入せず、「:id」のようなプレースホルダーを記述しています。
プレースホルダーは続く(4)のbindValueメソッドを使って、(1)で$idに用意した値をセットします。

プリペアドステートメントを使わない方法でデータを取得することも可能ですが、SQLインジェクション対策含めて安全性の観点から特別な理由がない限りはプリペアドステートメントを使用にした方が無難です。

bindValueメソッドの第1パラメータは値をセットする先のプレースホルダー、第2パラメータはセットする値、そして第3パラメータはセットする値の型を用意された定数で指定します。
第3パラメータで指定する値の型の定数は以下の5種類から該当する定数を指定します。

定数名値の型
SQLITE3_INTEGER整数(値の大きさに応じて1,2,3,4,6,8バイトで格納)
SQLITE3_FLOAT浮動小数点数(8バイトのIEEE浮動小数点数値で格納)
SQLITE3_TEXT文字列(データベースのエンコーディングで格納)
SQLITE3_BLOBblobデータ(入力をそのままの形式で格納)
SQLITE3_NULLNULL

(6)のvar_dump関数で出力したデータを確認すると、以下のように取得したデータが出力されます。

取得したデータの出力例

array(8) {
	[0]=> int(5)
	["id"]=> int(5)
	[1]=> string(6) "佐藤"
	["name"]=> string(6) "佐藤"
	[2]=> int(20)
	["age"]=> int(20)
	[3]=> string(19) "2022-04-18 10:00:00"
	["created"]=> string(19) "2022-04-18 10:00:00"
}

PDOでデータを取得する

続いて、PDOを使ってSQLiteのデータベースに登録されたデータを取得します。
基本的な流れはSQLite3クラスと同様になります。

今回はidカラム8のデータを取得します。

index.php

<?php

// (1)取得するデータのidカラムを用意
$id = 8;

// (2)データベースに接続
$pdo = new PDO('sqlite:./sqlite/test.db');

// (3)SQL作成
$stmt = $pdo->prepare("SELECT * FROM test_table
	WHERE
		id = :id
");

// (4)取得するデータをセット
$stmt->bindParam( ':id', $id, PDO::PARAM_INT);

// (5)SQL実行
$res = $stmt->execute();

// (6)削除したデータのカラム数を取得
var_dump($stmt->fetch());

// (7)データベースの接続解除
$pdo = null;

(4)のプリペアドステートメントでプレースホルダーに値をセットするとき、第3パラメータで指定する型の定数名はPDO用のものに置き換わります。

定数名値の型
PDO::PARAM_BOOLBool型
PDO::PARAM_INT整数
PDO::PARAM_STR文字列
PDO::PARAM_NULLNULL

(6)のvar_dump関数で出力したデータを確認すると、以下のように取得したデータが出力されます。

取得したデータの出力例

array(8) {
	["id"]=> string(1) "8"
	[0]=> string(1) "8"
	["name"]=> string(6) "萩原"
	[1]=> string(6) "萩原"
	["age"]=> string(2) "32"
	[2]=> string(2) "32"
	["created"]=> string(19) "2022-04-24 10:00:00"
	[3]=> string(19) "2022-04-24 10:00:00"
}

テーブルに登録された全てのデータを取得する

続いて、test_tableに登録された全てのデータを取得するシンプルなSQLを実行してみましょう。
ここではSQLite3クラスを使いますが、PDOを使う場合でも実行するSQLは同じです。

コード例

<?php

// (1)データベースに接続
$db = new SQLite3("./sqlite/test.db");

// (2)SQL作成
$stmt = $db->prepare("SELECT * FROM test_table");

// (3)SQL実行
$res = $stmt->execute();

// (4)取得したデータを出力
while($data = $res->fetchArray()) {
	var_dump($data);
}

// (5)データベースの接続解除
$db->close();

上記のコードを実行すると、(4)のwhile文で取得したデータを1件ずつ取り出して$dataに入れ、var_dump関数で出力します。

取得したデータの出力例

array(8) {
	[0]=> int(1)
	["id"]=> int(1)
	[1]=> string(6) "山田"
	["name"]=> string(6) "山田"
	[2]=> int(30)
	["age"]=> int(30)
	[3]=> string(19) "2022-04-10 10:00:00"
	["created"]=> string(19) "2022-04-10 10:00:00"
}

array(8) {
	[0]=> int(2)
	["id"]=> int(2)
	[1]=> string(6) "石川"
	["name"]=> string(6) "石川"
	[2]=> int(33)
	["age"]=> int(33)
	[3]=> string(19) "2022-04-12 10:00:00"
	["created"]=> string(19) "2022-04-12 10:00:00"
}

... 同様に残りのデータも出力される ...

BETWEENで条件を絞ってデータを取得する

続いて、取得するデータの条件を指定してみましょう。
先ほどのSQLにWHERE句を追加してください。

index.php

<?php

// (1)取得するデータのidカラムを用意
$start_date = '2022-04-20';
$end_date = '2022-04-24';

// (2)データベースに接続
$db = new SQLite3("./sqlite/test.db");

// (3)SQL作成
$stmt = $db->prepare("SELECT * FROM test_table
	WHERE
		created BETWEEN :start_date AND :end_date
");

// (4)取得するデータをセット
$stmt->bindValue( ':start_date', $start_date, SQLITE3_TEXT);
$stmt->bindValue( ':end_date', $end_date, SQLITE3_TEXT);

// (5)SQL実行
$res = $stmt->execute();

// (6)取得したデータを出力
while($data = $res->fetchArray()) {
	var_dump($data);
}

// (7)データベースの接続解除
$db->close();

実行すると、createdカラムが「2022-04-20」と「2022-04-24」の間のデータを取得することができます。

取得したデータの出力例

array(8) {
	[0]=> int(6)
	["id"]=> int(6)
	[1]=> string(6) "大塚"
	["name"]=> string(6) "大塚"
	[2]=> int(28)
	["age"]=> int(28)
	[3]=> string(19) "2022-04-20 10:00:00"
	["created"]=> string(19) "2022-04-20 10:00:00"
}

array(8) {
	[0]=> int(7)
	["id"]=> int(7)
	[1]=> string(3) "林"
	["name"]=> string(3) "林"
	[2]=> int(39)
	["age"]=> int(39)
	[3]=> string(19) "2022-04-22 10:00:00"
	["created"]=> string(19) "2022-04-22 10:00:00"
}

SQLのBETWEENを以下のように置き換えても同じ結果を取得することができます。

コード例

// (3)SQL作成
$stmt = $db->prepare("SELECT * FROM test_table
	WHERE
		created >= :start_date AND created <= :end_date
");

データの並び順を指定する

続いて、ORDER BY句を使ってデータの並び順を指定します。
SQLでデータを取得するタイミングで並び替えを行うと、PHPでデータの並び替えをする必要がないため非常に便利です。

SQLのWHERE句の後に、次のようにORDER BY句を追加します。
今回はcreateカラムの降順(最新順)に並び替えを行います。

index.php

<?php

// (1)取得するデータのidカラムを用意
$start_date = '2022-04-20';
$end_date = '2022-04-26';

// (2)データベースに接続
$db = new SQLite3("./sqlite/test.db");

// (3)SQL作成
$stmt = $db->prepare("SELECT * FROM test_table
	WHERE
		created BETWEEN :start_date AND :end_date
	ORDER BY
		created DESC
");

// (4)取得するデータをセット
$stmt->bindValue( ':start_date', $start_date, SQLITE3_TEXT);
$stmt->bindValue( ':end_date', $end_date, SQLITE3_TEXT);

// (5)SQL実行
$res = $stmt->execute();

// (6)取得したデータを出力
while($data = $res->fetchArray()) {
	var_dump($data);
}

// (7)データベースの接続解除
$db->close();

(6)で取得したデータを出力すると、以下の並びで取得することができます。

取得したデータの出力例

array(8) {
	[0]=> int(8)
	["id"]=> int(8)
	[1]=> string(6) "萩原"
	["name"]=> string(6) "萩原"
	[2]=> int(32)
	["age"]=> int(32)
	[3]=> string(19) "2022-04-24 10:00:00"
	["created"]=> string(19) "2022-04-24 10:00:00"
}

array(8) {
	[0]=> int(7)
	["id"]=> int(7)
	[1]=> string(3) "林"
	["name"]=> string(3) "林"
	[2]=> int(39)
	["age"]=> int(39)
	[3]=> string(19) "2022-04-22 10:00:00"
	["created"]=> string(19) "2022-04-22 10:00:00"
}

array(8) {
	[0]=> int(6)
	["id"]=> int(6)
	[1]=> string(6) "大塚"
	["name"]=> string(6) "大塚"
	[2]=> int(28)
	["age"]=> int(28)
	[3]=> string(19) "2022-04-20 10:00:00"
	["created"]=> string(19) "2022-04-20 10:00:00"
}

今回はデータを並び替えるにあたってcreatedカラムを基準となるように指定し、続いて並びが降順となるようにDESCを指定しています。
もし反対に昇順で並び替えたいときはASCを指定するか、または何も指定しない場合に昇順になります。

取得するデータの件数を指定する

取得するデータの最大件数を指定したいときはLIMIT句で指定することができます。
先ほどのORDER BY句で使ったSQLの後ろに、以下のコードのようにLIMIT句を追加して実行してみましょう。

index.php

<?php

// (1)取得するデータのidカラムを用意
$start_date = '2022-04-20';
$end_date = '2022-04-26';

// (2)データベースに接続
$db = new SQLite3("./sqlite/test.db");

// (3)SQL作成
$stmt = $db->prepare("SELECT * FROM test_table
	WHERE
		created BETWEEN :start_date AND :end_date
	ORDER BY
		created DESC
	LIMIT
		1
");

// (4)取得するデータをセット
$stmt->bindValue( ':start_date', $start_date, SQLITE3_TEXT);
$stmt->bindValue( ':end_date', $end_date, SQLITE3_TEXT);

// (5)SQL実行
$res = $stmt->execute();

// (6)取得したデータを出力
while($data = $res->fetchArray()) {
	var_dump($data);
}

// (7)データベースの接続解除
$db->close();

今回は1を指定しているため、取得するデータは1件になります。

取得したデータの出力例

array(8) {
	[0]=> int(8)
	["id"]=> int(8)
	[1]=> string(6) "萩原"
	["name"]=> string(6) "萩原"
	[2]=> int(32)
	["age"]=> int(32)
	[3]=> string(19) "2022-04-24 10:00:00"
	["created"]=> string(19) "2022-04-24 10:00:00"
}

LIMIT句の数値を2に変更すると「最大2件取得する」という指定になり、取得したい件数を設定することができます。

以上、SQLiteのデータを取得する方法でした。

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

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

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