ここでは以下のファイルを作成して、SWEETS作成機能を開発します。

  • sweets_admin
    • app
      • sweets_admin_create.php
      • sweets_admin_store.php

実行結果

ビルトインWebサーバを起動する際に /home/ec2-user/environment/sweets_admin/app フォルダをドキュメントルート(公開フォルダ)に指定します。

$ php -S localhost:8080 -t /home/ec2-user/environment

ブラウザから sweets_admin_list.php にアクセスすると次のような画面が表示されます。

画面下の CREATE リンクをクリックすると次の新規作成画面が表示されます。

以下のように新規データを入力します。

STORE ボタンをクリックすると一覧画面が再表示されます。このとき追加レコードが表示されているのがわかります。

このとき data フォルダの sweets.csv ファイルに新規データが追加されます。

1,Biscuit,200
2,Candy,100
3,Chocolate,300
4,Rusk,400

最終行に改行が付いていることも確認しておいてください。


sweets_admin_create.php - 完成版

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>PHP Training</title>
</head>
<body>
    <h3>Sweets - Create</h3>
    <hr>
    <form action="sweets_admin_store.php" method="post">
        ID: <br>
        <input type="number" name="id"/><br>
        NAME:<br>
        <input type="text" name="name"/><br>
        PRICE:
        <br><input type="number" name="price"/><br>
        <input type="submit" value="STORE"/><br>
    </form>
</body>
</html>

sweets_admin_create.php ファイルはすでに完成しています。あとの sweets_admin_store.php ファイルを作成します。


sweets_admin_store.php

<?php
require_once("../libs/functions.php");

$id = (string)filter_input(INPUT_POST, "id");
# 入力チェック - IDが未入力の場合
if ($id === "") {
    die("Input error. id is required.");
}
# 入力チェック - IDが5桁を超える場合
if (mb_strlen($id) > 5) {
    die("Input error. id length > 5.");
}
# 入力チェック - IDが整数でない場合
if (filter_var($id, FILTER_VALIDATE_INT) === false) {
    die("Input error. id is not int.");
}
# 入力チェック - IDが`sweets.csv`ファイルの中にすでに存在する場合
if (validate_exist_id($id) === true) {
    die("Input error. invalid id.");
}

$name = (string)filter_input(INPUT_POST, "name");
# 入力チェック - NAMEが未入力の場合
if ($name === "") {
    die("Input error. name is required.");
}
# 入力チェック - NAMEが20桁を超える場合
if (mb_strlen($name) > 20) {
    die("Input error. name length > 20.");
}

$price = (string)filter_input(INPUT_POST, "price");
# 入力チェック - PRICEが未入力の場合
if ($price === "") {
    die("Input error. price is required.");
}
# 入力チェック - PRICEが5桁を超える場合
if (mb_strlen($price) > 5) {
    die("Input error. price length > 5.");
}
# 入力チェック - PRICEが整数でない場合
if (filter_var($price, FILTER_VALIDATE_INT) === false) {
    die("Input error. price is not int.");
}

# TODO get_sweets関数を呼び出す
$sweets = ???;
$new_sweet = ["id" => $id, "name" => $name, "price" => $price];
$sweets[] = $new_sweet;

# TODO save_sweets関数を呼び出す(引数に$sweets) を指定する
???

# TODO sweets_admin_list.php にリダイレクトする
???

プログラムの先頭部分では入力チェックを実装しています。入力データに違反があると die 関数が呼び出されます。die 関数が呼び出されると引数に指定されたメッセージ(入力エラーメッセージ)を画面に表示してプログラムはそこで終了します。??? の部分(3ヶ所)を実装してください。


参考:入力エラーが存在する場合

ここでは簡易な入力チェック処理を実装しています。ID、NAME、PRICEのいずれかの入力データに違反がある場合は、die 関数によって画面にエラーメッセージが表示されます。

Webシステムの開発ではさまざまな入力データを与えてシステムが正しく動作するかを検証します。ここでは以下のケースを試してみてください。

  1. 入力チェック - IDが未入力の場合
  2. 入力チェック - IDが5桁を超える場合
  3. 入力チェック - IDが整数でない場合
  4. 入力チェック - IDが sweets.csv ファイルの中にすでに存在する場合
  5. 入力チェック - NAMEが未入力の場合
  6. 入力チェック - NAMEが20桁を超える場合
  7. 入力チェック - PRICEが未入力の場合
  8. 入力チェック - PRICEが5桁を超える場合
  9. 入力チェック - PRICEが整数でない場合