質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

337閲覧

入力画面から確認画面に情報を送り、確認画面から戻るボタンbutton class="hover-transition01で戻ると、入力画面でエラーメッセージが表示されてしまいます。

klgrhl

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2023/12/13 07:34

入力フォーム入力して確認画面に行き、そして、もとに戻るボタンを押して戻ると、フォーム内の情報が入力されているのにエラーが表示されてしまいます。これをなくしたいです。付属画像のようになります。

確認画面から入力画面に戻る際に、入力した情報は保持されています。原因はなんだと思いますでしょうか?

イメージ説明
form01.php 入力画面

html

1<?php 2session_start(); 3$errors = array(); 4if ($_POST) { 5 6$name = filter_input(INPUT_POST, 'name'); 7if (empty($name)) $errors[] ="メールアドレスが入力されていません。 "; 8$name = htmlspecialchars($name, ENT_QUOTES); 9 10if (count($errors) === 0) { 11$_SESSION['name'] = $name; 12 13/* 確認画面 */ 14header('Location:form02.php'); 15exit(); 16} 17} 18 19if(isset($_GET['action']) && $_GET['action'] === 'edit'){ 20$name = $_SESSION['name']; 21} 22?> 23 24<body> 25<form action="form01.php" method="post" id="form"> 26<div class="tel-titile">メールアドレス</div> 27<input type="text" class="form1" name="name" id="name" 28value="<?php if(isset($name)){ echo $name; } ?>" /> 29 30<p class="button1"><button id="submit" class="hover-transition" type="submit" value="送信する">確認画面へ</button></p> 31 32<!--phpcountエラーメッセージ0の場合ここに出現--> 33<div class="errnoback-color"> 34<?= count($errors) ? '<ul><li>' . implode('</li><li>', $errors) . '</li></ul>' : '' ?> 35</div> 36</form> 37</body>

form02.php 確認画面

html

1<?php 2session_start(); 3 4if(isset($_SESSION['name'])){ 5$name = $_SESSION['name']; 6} 7 8$_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(48)); 9$token = htmlspecialchars($_SESSION['token'], ENT_QUOTES); 10?> 11 12<body> 13<form action="form3.php" method="post" id="form"> 14<input type ="hidden" name ="token" value ="<?php echo $token ?>"> 15<div class="tel-titile">アドレス</div> 16<div class="inputtitle"><?php echo $name; ?></div> 17 18<p class="button01"><button class="hover-transition01" formaction="form01.php?action=edit">入力情報を変更する</button></p><!--クリックすると前ページid5の場所に戻る--> 19<p class="button1"><button id="submit" class="hover-transition" type="submit" value="送信する">送信</button></p> 20 21</form> 22</body>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

原因はなんだ

form01でメールアドレスを入力後「確認画面へ」ボタンを押下すると、POSTで自身にデータを送り、セッションにメールアドレスを記録後、form02へリダイレクトします。
form02では、トークンをhiddenなフィールドにセットしたフォームを表示します。
この際「入力情報を変更する」を押下すると、POSTの送信先をform01に変更して送信します。

再び、form01での処理が始まりますが、form02からはPOSTで送信されていますから、nameフィールドの値をチェックします。
その際、form02ではトークンしかフォームデータを用意していませんから、当然nameフィールドは存在しませんからエラーチェックに引っ掛かります。

原因は、「入力情報を変更する」ボタンで戻る際に、POSTでアクセスされると考えていなかった為でしょう。
formaction="form01.php?action=edit"としているので、

PHP

1if(isset($_GET['action']) && $_GET['action'] === 'edit'){ 2 $name = $_SESSION['name']; 3}

が機能しているので、GETのアクセスと勘違いしたのかもしれません。

フォーム内の情報が入力されているのにエラーが表示されてしまいます

value="<?php if(isset($name)){ echo $name; } ?>" />が機能しているのは、form01でセッションに記録してからform02へリダイレクトしており、上記で、$nameがセッションから書き戻されているからでしょう。

それと、nameフィールドのチェックに行ってしまう事は関係ないです。

これをなくしたい

form02からform01へ戻る際に、そのボタンを包含しているフォームを使うのではなく、単純なリンクにしておけば良いと思います。
上記のif(isset($_GET['action']) ~if ($_POST) {の中に入れてしまっても良いのかもしれません。

PHP

1 $name = htmlspecialchars($name, ENT_QUOTES); 2 if (count($errors) === 0) { 3 $_SESSION['name'] = $name;

htmlspecialchars()を通した後の値をセッションに記録するのは筋が悪いです。
HTMLとしてのエスケープは、HTMLとして表示する際にするのが基本です。

投稿2023/12/14 13:39

tezcello

総合スコア434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

klgrhl

2023/12/16 05:17

回答ありがとうございました。返信遅くなり申し訳ございません。上記のようにやってみたらきちんとエラーなしに作動しました。詳しい回答感謝いたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問