PHP

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

  1. 最終更新日:
  2. 公開日:

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

この記事のポイント

  • 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件を取得できるようになっています。

ダウンロードしたCSVファイルの例

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

今回作成したコード:Github

前のページ投稿データをCSV形式でダウンロードする

次のページ投稿メッセージの編集ページを作る

記事一覧

  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. 投稿に文字数制限を設定する

前の記事

記事一覧

次の記事