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

  • sweets_admin
    • app
      • sweets_admin_edit.php
      • sweets_admin_update.php

実行結果

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

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

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

ID4 のレコードの EDIT リンクをクリックすると次の更新画面が表示されます。

更新データを入力します。たとえば PRICE500 に変更します。

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

このとき data フォルダの sweets.csv ファイルの対象データが更新されます。

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

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


sweets_admin_edit.php

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

$id = (string)filter_input(INPUT_GET, "id");
if ($id === "") {
    die("Input error. id is required.");
}
if (mb_strlen($id) > 5) {
    die("Input error. id length > 5.");
}
if (filter_var($id, FILTER_VALIDATE_INT) === false) {
    die("Input error. id is not int.");
}
if (validate_exist_id($id) === false) {
    die("Input error. invalid id.");
}

# TODO 引数に$idを指定して、get_sweet_by_id 関数を呼び出す
$sweet = ???;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>PHP Training</title>
</head>
<body>
    <h3>Sweets - Edit</h3>
    <hr>
    <form action="???" method="???">
        ID: <br>
        <?php echo htmlspecialchars($sweet["id"]) ?>
        <input type="hidden" name="id" value="<?php echo htmlspecialchars($sweet['id']) ?>"/><br>
        NAME:<br>
        <input type="text" name="name" value="<?php echo htmlspecialchars($sweet['name']) ?>"/><br>
        PRICE:<br>
        <input type="number" name="price" value="<?php echo htmlspecialchars($sweet['price']) ?>"/><br>
        <input type="submit" value="UPDATE"/><br>
    </form>
</body>
</html>

???の部分(3ヶ所)を実装してください。


sweets_admin_update.php

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

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

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

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

# TODO get_sweets関数を呼び出す
$sweets = ???
$new_sweets = [];
foreach ($sweets as $sweet) {
    if ($sweet["id"] === $id) {
        $sweet["name"] = $name;
        $sweet["price"] = $price;
    }
    $new_sweets[] = $sweet;
}

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

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

プログラムの先頭部分では入力チェックを実装してください。また ??? の部分(3ヶ所)を実装してください。