PHP 学習メモ 13

概要

 PHP 学習メモ。学習メモ 12 の改善方法について。

内容

  1. 改善方法

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']; ?>