最終更新日:
公開日:
ワークショップ
ひと言掲示板を作る(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
記事一覧
- ひと言掲示板を作る(1) ひと言掲示板を作る
- ひと言掲示板を作る(2) メッセージの入力フォームを作る
- ひと言掲示板を作る(3) メッセージのデータを受け取る
- ひと言掲示板を作る(4) ファイルにデータを保存する
- ひと言掲示板を作る(5) ファイルからデータを読み込む
- ひと言掲示板を作る(6) 投稿完了メッセージを表示する
- ひと言掲示板を作る(7) 投稿の未入力バリデーションをつける
- ひと言掲示板を作る(8) 投稿されたデータをサニタイズする
- ひと言掲示板を作る(9) 投稿データの保存にデータベースを使う
- ひと言掲示板を作る(10) 掲示板のデータベースとテーブルを作成する
- ひと言掲示板を作る(11) 投稿データをデータベースに登録する
- ひと言掲示板を作る(12) データベースからデータを取得する
- ひと言掲示板を作る(13) コードを整理する
- ひと言掲示板を作る(14) セッションで表示名の入力を省略する
- ひと言掲示板を作る(15) 管理ページを作成する
- ひと言掲示板を作る(16) ログインページを作る
- ひと言掲示板を作る(17) 投稿データをCSV形式でダウンロードする
- ひと言掲示板を作る(18) 投稿データをダウンロードする件数を指定する
- ひと言掲示板を作る(19) 投稿メッセージの編集ページを作る
- ひと言掲示板を作る(20) メッセージを編集する機能を実装する
- ひと言掲示板を作る(21) 投稿メッセージの削除ページを作る
- ひと言掲示板を作る(22) 管理ページにログアウトを実装する
- ひと言掲示板を作る(23) リロードによる多重投稿を防止する
- ひと言掲示板を作る(24) 投稿に文字数制限を設定する