ここでは以下のファイルを作成して、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
にアクセスすると次のような画面が表示されます。
ID
が 4
のレコードの EDIT
リンクをクリックすると次の更新画面が表示されます。
更新データを入力します。たとえば PRICE
を 500
に変更します。
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ヶ所)を実装してください。