配列の形式を指定:fetchAll,fetch,fetchColumn,fetchObjectの違い[備忘録]

自分の勉強用です。

前提

・1ページに付き10投稿(10レコード)を表示させるためにページネーションを実装。

・ページネーションでページ数を計算させるために、レコード数をカウントさせる。

やりたいこと

・「$statement->exucute();」でクエリは実行済み。

やりたいこと

・上記で実行したクエリで、○○というカラムにテーブルのレコード数が入っているので、その値をどのように返してもらうかを、fetchAll, fetch,fetchColumn,fetchObjectの中から比較検討して決める。

フェッチモードとは?

そもそも、フェッチモードとは、PDOでデータベースからデータを取り出した際の「配列の形式を指定するモード」のこと。

 

フェッチモードを指定しなくてもデータは取得できますが(デフォルトのモードが適用)、指定することでデータ配列の形式をカスタマイズすることが出来ます。

引用)

フェッチモードとは?PDOのfetchパターンを理解する

 

fetchAll()

$result = $statement->fetchAll()[0]['column'];

このコードは、SQLステートメントによって返されたレコード数を取得するためのレコード。

1.「$result = $statement->fetchAll()」によりSQLステートメントによって返された結果セットが連想配列として取得される。

2.[0]により、結果セットの最初のレコードを選択する。

「$result = $statement->fetchAll[0]」で、$resuletをvar_dumpすると、

array(2) { ["column"]=> int(118) [0]=> int(118) }

と出力される。

「$result = $statement->fetchAll()[0]['column']」」で$resultをvar_dumpすると、

int(118)

と出力される。

3.['record_count']により、レコード内の’record_count’という名前のフィールドな値を取得する。

fetch()

$result = $statement->fetch()[0];

今回でいうと、'column'というカラムにレコード数を入れているだけなので、一行で取ってきても良い。

例えば、

「$result = $statement->fetch();」で$resultをvar_dumpすると、

array(2) { ["record_count"]=> int(118) [0]=> int(118) }

が出力される。

きちんと’record_count’というキーの中にレコード数が入っている。

「$result = $statement->fetch()[0];」で$resultをvar_dumpすると、

int(118)

というふうに、値が直接取ってこれる。

fetchColumn()

$result = $statement->fetchColumn();

fetchColumnは、DBから取得された最初の列の値を取得するメソッド。

このように、レコード数を取得する場合には特別な手法(例えばCOUNT関数を使用する)が必要になります。

$resultをvar_dumpすると、

int(118)

が出力される。

fetchObject()

$result = $statement->fetchObject();

fetchObjectはDBから取得したレコードをオブジェクト形式で取得するためのメソッド。

具体的には、

各列がオブジェクトのプロパティ、

各レコードがオブジェクトのインスタンスとなる。

そのため、取得したレコードに対してプロパティアクセスを行うことができる。

例えば、上記のコードでは「column」列に含まれる値にアクセスするには

$result->column;

といった形でできる。

 

と、色々見てきたが、今回は単純にレコード数を変数に代入してページ数を算出したいだけなので、一番簡単に値にアクセス出来るfetchColumnが最適解かなと思いました。