概要
普通にHTMLのinput要素などを書くと、GETやPOSTのたびにそれらがvalueなしで描きなおされるので、内容が空になる。これに対してsubmit後に元に入力した値が残るようにする手順。
普通に書くと消える
以下のコードでは、送信ボタンを押すと入力した内容が表示されるが、テキストボックスの内容は毎回消えてしまう。
これはinput要素のvalue属性がないため、POSTのたびに再描画されるときに要素が空として描かれるため。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['text'])) { $isset_status = 'POSTED, isset() True'; $text_value = $_POST['text']; } else { $isset_status = 'POSTED, isset() False'; $text_value = 'Undefined or Null'; } } else { $isset_status = 'started without POST'; $text_value = 'Undefined'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>input要素の値の保持</title> </head> <body> <form method="post"> <input type="text" name="text"> <input type="submit" value="送信"> </form> <p><?php echo $isset_status; ?></p> <p>text value:<?php echo $text_value; ?></p> </body> </html> |
valueを設定すると値を残せる
input要素のvalue属性に前の入力内容を渡せば、その内容で要素が描かれるため値が残る。
- POSTされた際にPHPコードの変数は初期状態に戻る(undefinedか初期設定値に戻る)
- ただしHTMLのinput要素が再描画されるまでは、その要素の内容は残っている
- そこで、正常に入力が取得された場合にはinput要素のvalue属性の値に入力された値を渡せば、描画時にその値が残される
ただし、GETやPOST後の状態によってvalueにセットする変数がundefinedだとエラーになるため、どのような状態でも変数が定義済みとなるようにしておく必要がある。
以下のコードでは、POSTされた場合はisset()がtrueかfalseかそれぞれの場合に、POSTされずに実行された場合(最初に実行された場合など)にvalueにセットする値を定義している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['text'])) { $isset_status = 'POSTED, isset() True'; $text_value = $_POST['text']; } else { $isset_status = 'POSTED, isset() False'; $text_value = ''; } } else { $isset_status = 'started without POST'; $text_value = ''; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>input要素の値の保持</title> </head> <body> <form method="post"> <input type="text" name="text" value="<?php echo $text_value; ?>"> <input type="submit" value="送信"> </form> <p><?php echo $isset_status; ?></p> <p>text value:<?php echo $text_value; ?></p> </body> </html> |
エラー処理などで値を残す
GET/POSTされた値の内容によってエラーとする場合にも、エラーとなったその値を残しておける。コード実行の最初にinput要素から取得した値を変数に持っておいて、その内容のままvalue属性の値として渡せばよい(もちろん例外対応は必要)。
以下のコードは、数値入力欄が数値以外の場合エラーとしているが、その入力内容はテキストボックスに残る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['text'], $_POST['number'])) { $isset_status = 'POSTED, isset() True'; $text_value = $_POST['text']; $number_value = $_POST['number']; if (is_numeric($number_value)) { $isset_status .= ', and valid input'; } else { $isset_status .= ', but invalid number'; } } else { $isset_status = 'POSTED, isset() False'; $text_value = ''; $number_value = ''; } } else { $isset_status = 'started without POST'; $text_value = ''; $number_value = ''; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>input要素の値の保持</title> </head> <body> <form method="post"> 文字列:<input type="text" name="text" value="<?php echo $text_value; ?>"> 数 字:<input type="text" name="number" value="<?php echo $number_value; ?>"> <input type="submit" value="送信"> </form> <p><?php echo $isset_status; ?></p> <p> text value:<?php echo $text_value; ?> , number value: <?php echo $number_value; ?> </p> </body> </html> |