ページネーションのために総ページ数をPDOで取得する[備忘録]

自分の勉強用です。

10件ずつ取ってくるクエリは実行されたので、次は、ページネーションで総ページ数を取得するためのクエリを実行し、総ページ数を変数に格納する処理を行う。

$sql_count    = 'SELECT COUNT(*) AS record_count FROM contents';

・contentsというTABLEから全てのレコードの数を取得し、それをrecord_countという列名で返すSQLクエリ。

・COUNTはCOUNT関数といい指定した列に対して行の数をカウントする。

・*は全てのカラムを意味する。

・COUNT()はTABLEにある全てのレコードの数をカウントするために使用する。

例えばCOUNT(id)とすると、idカラムに値があるレコードの数をカウントすることが出来る。

・ここでは、FROM contentsで、contentsというテーブルから、全てのレコードを取得し、record_countというカラム名で返して下さいというというSQLステートメントになっている。

$statement    = $connection->prepare($sql_count);

・ここでしているのは、$sql_countという変数に格納されているSQLクエリをDBに準備するための処理。

・$connection->prepare($sql_count)を呼び出し、$statemantに代入している。

・$connection->prepare()は、()内で書かれたSQLクエリをDBに準備するためのメソッド。

これをすることにより、executeする前に、クエリを解析し、必要な変数をバインド(結わえ付ける)したり、エラーチェックを行うことが出来る。

・このメソッドは準備されたステートメントオブジェクトを返す。

ステートメントオブジェクトを$statementに代入し、後でexecute()メソッドを呼び出して、クエリを実行するために使用する。

ステートメントオブジェクトとは、DBに対して行う命令(SQLステートメント)を表すオブジェクト。

ステートメントオブジェクトは、

  1. DBに接続
  2. クエリの準備
  3. 実行
  4. 結果を取得

するために必要な情報を持っている。

ステートメントオブジェクトは、クエリを実行するために必要な情報を保持し、クエリを再利用することもできる。

 

PHPのPDO(PHP Data Objects)を使用している場合は、$connection->prepare()メソッドを呼び出すことで、ステートメントオブジェクトを作成することが出来る。

 

つまり、$connection->prepare()でexecute()するために必要な情報を保持したステートメントオブジェクトを返している。

 

$statement->execute();

・$statementという変数に格納されているSQLクエリを実行するためのメソッドがexecute()。

今の時点で$statement = ステートメントオブジェクト。

exucute()メソッドは、ステートメントオブジェクトが作成されて、必要な変数をバインドした上でクエリを実行する。

・実行すると、$sql_count変数に格納されているSQLクエリが実行され、その結果が返される。

・上記のクエリ

SELECT COUNT(*) AS record_count FROM contents

を実行した結果を、

$statement->execute();

で得ることが出来る。

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

・$statement->fetchAll()はステートメントオブジェクトから取得した結果を全て取得するメソッドで、結果を配列で返してくれる。

fetchは和訳すると「取ってくる」みたいな意味なので、fetchAllで「全て取ってくる」になる。

・$statement->fetchAll()で、$arrayのように一つの配列として扱える。

なので、$statement->fetchAll()[0]['record_count];のようにキーを指定して値を取り出す事ができる。

・[0]は、配列の1番目を取得している。

・['record_count']は、上記のクエリ文

SELECT COUNT(*) AS record_count FROM contents

の、AS record_countで指定された別名に対応する値(新しい名前をつけられたカラム)を取得している。

・$record_countには、contentsテーブルにあるレコードの数が格納される。

なぜなら、COUNT関数をクエリ文のなかで使っているから。

 

COUNT関数とは

SQLデータベースにおいて、テーブル内のレコード数をカウントするための関数。

COUNT(*)は、テーブル内の全てのレコード数をカウントする。

例えば、

SELECT COUNT(*) FROM contents;

はcontentsテーブルにある全てのレコード数を取得する。

SELECT COUNT(id) FROM contents;

は、contentsテーブルのidカラムにNULL以外の値が入っているレコード数を取得するもの。

COUNT関数はDBに存在するレコード数を簡単に取得するためによく利用される。

$total_pages  = ceil($record_count / $limit);

・ページネーションのために必要な総ページ数を計算する処理。

・$record_countは、contentsテーブルにあるレコードの数を表している。

・$limitは1ページに表示するレコード数を表している。

総レコード数/1ページに表示するレコード数