PHP+SQLite:条件に一致するレコードの数を数える

(1/1)
SQLに用意されている統計関数を利用し、条件に一致するレコードの数を数えるプログラムを作ってみることにする。あわせて、PDOの プリペアドステートメントについて学ぶ。

(2022年11月26日)PHP8対応,他.

目次

サンプル・プログラムの実行例

PHP+SQLite:条件に一致するレコードの数を数える

サンプル・プログラム

圧縮ファイルの内容
count1.phpサンプル・プログラム
このプログラムは、「武田」という名前を含むレコードの数を数えるプログラムである。

解説:レコードを数える

  51: //実行するSQL
  52: define('PRE_COUNT',  'SELECT COUNT(*) FROM chronologic WHERE name LIKE :name');

SQLは、いくつかの統計関数を用意している。COUNT 関数は、条件に一致するレコードの数を数えるものである。
SELECT COUNT(*) FROM chronologic WHERE name like '%武田%';
このSQL文は、あいまい検索LIKE演算子を使い、nameに「武田」が含まれるレコードを絞り込み、そのレコード数をCOUNT関数によって数えるものである。

SQLインジェクション対策として、PDOにはプリペアドステートメントという機能が備わっている。
定数 PRE_COUNT に示されているように、値をプレースホルダ :name に分離している。値の実体は定数 NAME に定義してある。

 170:     //プリペアドステート
 171:     $stmt = $pdo->prepare($sql);
 172:     $stmt->bindValue(':name', NAME, PDO::PARAM_STR);

プレースホルダに値をバインドするには PDOStatement::bindParam を使う。
第3引数にはデータ型を指定する。ここで自動的にエスケープ処理などが行われるので、SQLインジェクション対策となる。

解説:COUNTの結果を受け取る

 173:     $stmt->execute();
 174:     $res = $stmt->fetch();

前述のプリペアドステートメントは、PDOStatement::execute を使うことで実行される。
SQL関数COUNTの結果を受け取るのは、PDOStatement::fetch であるが、結果の配列に工夫が必要である。配列の添字が '0' の中に結果が代入されるのである。

なお、下記のように仮想カラム名を割り当ててやれば、
SELECT COUNT(*) AS num FROM chronologic WHERE name LIKE '%武田%';
今までと同様、カラム名で $res['num'] のようにして結果を受け取ることができる。
(この項おわり)
header