TABLEから1ページ10件ずつ投稿を取得する[備忘録]

自分の勉強用です。

10件ずつ投稿を取得するMySQLのクエリ。

SELECT title, comment, created_at FROM contents ORDER BY created_at DESC LIMIT limit OFFSET offset

・SELECTで取得するTABLEのカラム名を選択。

・FROMの後に、取得するカラムの入っているTABLEを選択。

・ORDER BY created_at  DESCで、created_atというカラムを並び替える。

昇順の場合はASC。(古いものから)

降順の場合はDESC。(最新のものから)

[ASC|DESC]を省略すると、昇順がデフォルト。

・LIMITの後に、変数limit(取得件数の数値が入っている)を入れて、取得件数を選択。

・OFFSETの後に、変数offsetを入れて、取得を開始する位置を選択。

 

このままでは、最新順位10件取ってきて終わりなので、古いページへ行くたびにそのページに表示されるレコードを取りたい。

 

そのためにはoffsetの計算が必要。

まず変数$limit $offsetを定義。

$limit = 10;  //10件ずつ取得。

$offset = ($page - 1) * $limit   //現在のページより前のページで表示されて多分のレコードは表示されないようにする。

つまり、

1 〜10 // 1ページ目

11〜20 // 2ページ目

21〜30 // 3ページ目

なるように$offsetを計算すればよい。

 

$statement = $connection->prepare('SELECT title, comment, created_at FROM contents ORDER BY created_at DESC LIMIT :limit OFFSET :offset');$statement->bindParam(':limit', $limit, PDO::PARAM_INT);
$statement->bindParam(':offset', $offset, PDO::PARAM_INT);
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);

prepare()メソッドは、SQLステートメントをDBに準備している。

SQLステートメントとは、DBに対して行う様々な操作を定義する命令のこと。

bindParam()メソッドは、SQLの命令にパラメーター(引数)をバインド(結わえ付ける)している。

execute()メソッドは、$statementに準備された命令を実行している。

fetchAll()メソッドは、結果セット(実行されたクエリの結果)から全ての行を取得して、結果を配列として返している。

(PDO::FETCH_ASSOC)は、fetchAll()メソッドで返された配列を連想配列として返すようにfetchAllメソッドに指示する定数。

キーが列名。値が、対応する列の値である配列になる。

$resultsには、contentsというテーブルの全てのレコードを取得した結果の連想配列が格納されている。