PHPプログラミング

最終更新日:
公開日:

ワークショップ

ひと言掲示板を作る(18)

投稿データをダウンロードする件数を指定する

「ひと言掲示板」の投稿データをダウンロードする機能について、ダウンロードする件数を指定する機能を追加します。

この記事のポイント

  • SQLのLIMIT句を使って取得するデータ件数を指定する
  • 投稿データの並び順はORDER BY句で指定する

目次

ダウンロードする件数を指定する

前回はひと言掲示板の管理ページに、投稿データをCSVファイルでダウンロードする機能を実装しました。
今回はダウンロードする件数を選べる機能を追加していきます。

「ひと言掲示板を作る」の概要については「ひと言掲示板を作る」をご覧ください。
デモはこちら

前回までに作成したコードはこちら:Github

ダウンロード件数を指定するフォームを設置する

まずは管理ページの「admin.php」に、ダウンロードする件数を指定するためのプルダウンメニューを設置しましょう。
以下の赤字のコードを追記してください。

admin.php

---- 省略 ----

<?php if( !empty($_SESSION['admin_login']) && $_SESSION['admin_login'] === true ): ?>

<form method="get" action="./download.php">
    <select name="limit">
        <option value="">全て</option>
        <option value="10">10件</option>
        <option value="30">30件</option>
    </select>
    <input type="submit" name="btn_download" value="ダウンロード">
</form>

---- 省略 ----

プルダウンメニューを表示するためのselect要素を設置しました。
件数は「全て」「10件」「30件」から選択できるようになっています。

これで「ダウンロード」ボタンが押されるとname属性に「limit」のついたselect要素も一緒に「download.php」へ送信されるようになりました。

パラメータからデータの取得件数を変更する

続いて、「download.php」がプルダウンメニューで選択された件数を受け取れるようにコードを修正します。
次の赤字のコードを追記していきましょう。

download.php

<?php

---- 省略 ----

// 変数の初期化
$csv_data = null;
$sql = null;
$pdo = null;
$option = null;
$message_array = array();
$limit = null;

session_start();

// 取得件数
if( !empty($_GET['limit']) ) {

	if( $_GET['limit'] === "10" ) {
		$limit = 10;
	} elseif( $_GET['limit'] === "30" ) {
		$limit = 30;
	}
}

if( !empty($_SESSION['admin_login']) && $_SESSION['admin_login'] === true ) {

---- 省略 ----

変数$limitを追加し、この変数にGETパラメータのlimitが送信されていたら値をセットするように設定しています。
続いて、$limitの値を投稿データを取得するSQLに反映します。
ここで、データ登録のときと同様にプリペアドステートメントを使う形にしていきます。
PDOでデータベースを接続した後にある「// メッセージのデータを取得する」のコードを赤字のコードに置き換えてください。

download.php

<?php

---- 省略 ----

// 変数の初期化
$csv_data = null;
$sql = null;
$pdo = null;
$option = null;
$message_array = array();
$limit = null;
$stmt = null;

session_start();

// 取得件数
if( !empty($_GET['limit']) ) {

	if( $_GET['limit'] === "10" ) {
		$limit = 10;
	} elseif( $_GET['limit'] === "30" ) {
		$limit = 30;
	}
}

if( !empty($_SESSION['admin_login']) && $_SESSION['admin_login'] === true ) {

	// データベースに接続
	try {

		$option = array(
			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
			PDO::MYSQL_ATTR_MULTI_STATEMENTS => false
		);
		$pdo = new PDO('mysql:charset=UTF8;dbname='.DB_NAME.';host='.DB_HOST , DB_USER, DB_PASS, $option);

		// メッセージのデータを取得する
		if( !empty($limit) ) {

			// SQL作成
			$stmt = $pdo->prepare("SELECT * FROM message ORDER BY post_date ASC LIMIT :limit");

			// 値をセット
			$stmt->bindValue( ':limit', $_GET['limit'], PDO::PARAM_INT);

		} else {
			$stmt = $pdo->prepare("SELECT * FROM message ORDER BY post_date ASC");
		}

		// SQLクエリの実行
		$stmt->execute();
		$message_array = $stmt->fetchAll();

		// データベースの接続を閉じる
		$stmt = null;
		$pdo = null;

	} catch(PDOException $e) {

		// 管理者ページへリダイレクト
		header("Location: ./admin.php");
		exit;
	}

---- 省略 ----

まずはif文empty関数を使い、$limitにダウンロード件数の値が入っているかを確認しています。
もし値が入っていたらLIMIT句をSQLに指定します。
LIMIT句は名前の通り、データベースから取得してくるデータ件数の最大数を指定することができます。
反対に$limitに値が入っていないときは、投稿データを全て取得します。

ダウンロード件数が指定されているかどうかに関わらず、その後はexecuteメソッドを使ってSQLを実行し、取得した投稿データをfetchAllメソッドで取得して変数$message_arrayに入れています。
前回までは投稿データは全件取得のみだったのでプリペアドステートメントは使いませんでしたが、今回はデータを取得するコードを共通化するために全件取得時でもプリペアドステートメントを使うように変更しています。

ここまでで、ダウンロードする投稿データの件数を指定できるようになりました。
早速ブラウザで管理ページを開いて試してみましょう。
管理ページを開き、ダウンロード件数を指定した上で「ダウンロード」ボタンを押してください。

ダウンロード件数を10件にすると、CSVファイルには10件の投稿データが入っていることを確認できます。
同じように、30件とすると最大30件を取得できるようになっています。

今回はここまでとなります。
次回は投稿データの編集機能を追加していきます。

今回作成したコード:Github