概要
PHP 学習メモ。学習メモ 12 の改善方法について。
内容
- 改善方法
1. 改善方法
PHP 学習メモ 12 - hatebg’s blog で改善が必要だった箇所:
①「前月」、「次月」ボタン押下後の URL のパラメータに、year、month の値が表示されていない
② ブラウザを更新すると前月または次月のカレンダーが表示される
①の改善
- 修正前
修正前は以下のコード。?month
に渡される値は、月の入力エリアのテキストである。「次月」ボタンを押下してもクエリパラメータ ?month
に値が渡される仕組みになっていない。
<form method="GET"> <!-- 年の入力エリア --> <input type="text" name="year" ... /> <!-- 月の入力エリア --> <input type="text" name="month" ... /> <!-- 月の入力エリア --> <input type="submit" value="カレンダーを表示" /> <!-- 前月表示ボタン --> <input type="submit" name="page" value="前月" /> <!-- 次月表示ボタン --> <input type="submit" name="page" value="次月" /> </form>
- 修正後
ボタン用の input
タグには name="year"
を含めてはいけない。なぜならこの場合、?year=次月
となってしまう。この要素はただボタンを表示するだけ。クエリパラメータは <input type="hidden" ...>
で渡す。
<form> <input type="submit" value="次月" /> <input type="hidden" name="direction" value="next" /> <input type="hidden" name="year" value="<?php echo $_SESSION['year']; ?>" /> <input type="hidden" name="month" value="<?php echo $_SESSION['month']; ?>" /> </form>
②の改善
ブラウザ更新時に前月または次月のカレンダーが表示される原因は、GET メソッドであればパラメータの値によらずインクリメントされてしまっていたから。
<?php ... if ($_SERVER['REQUEST_METHOD'] == 'GET') { $_SESSION['num'] = $_SESSION['num'] + 1; }
ブラウザ更新時にどのような GET パラメータが送信されるのかを確認したところ、空の配列 {}
だった。したがって次のように、現在画面に表示されている数値を GET パラメータとして送信するようにすれば、ブラウザ更新時に数値はインクリメントされなくなる。
<?php ... if ($_SERVER['REQUEST_METHOD'] == 'GET') { if (isset($_GET['num'])) { $_SESSION['num'] = (int)$_GET['num'] + 1; } } ?> <form method="GET"> <input type="hidden" name="num" value="<?php echo $_SESSION['num']; ?>" /> <input type="submit" value="足す" /> </form> <?php echo $_SESSION['num']; ?>