@jackytom

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPでecho出力できない

Q&A

Closed

PHPでPRGパターン対応(二重入力防止)するために、リダイレクトを用いて完了画面で
リロードしても二重入力はされないようになりました。
しかしながら、DBのインサートが成功した際に出力するためのechoで定義している
「登録に成功しました。」
が表示されなくなってしまいました。
「ユーザーメンテナンスに戻る」は表示されているので、その後でリダイレクトすれば
いいかと考えましたが、そうすると、完了画面に進む際に、「この画面は利用できません」
とブラウザのエラーが表示されます。
「登録に成功しました。」を表示する方法をご教示いただきたいです。
ソースコードを添付します。

<?php
	require_once('password_hash.php'); 
	try{
		require_once('db_connect.php');
		}
	catch(PDOException $e)
			{
				echo "次がエラーの内容です。;" .$e->getMessage();
			}

	function escape($val)
	{
		return htmlspecialchars($val, ENT_QUOTES | ENT_HTML5, 'UTF-8');
	}
?>
<!doctype html>
<html lang=ja>
	<head>
		<meta charset="utf-8">
		<title>ユーザーメンテナンス(完了)</title>
		<meta name="description" content="ユーザーの修正画面">
		<!--リセットcss-->
		<link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
		<!--css-->
		<link href="css/user_style.css" rel="stylesheet">
		<!--レスポンシブ対応-->
		<meta name="viwport" content="width=device-width, initial-scale=1">
		<!--Googleフォント-->
		<link href="https://fonts.googleapis.com/css2?family=Sawarabi+Gothic&display=swap" rel="stylesheet">
		<link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@500&display=swap" rel="stylesheet">
	</head>
	<body>
		<h1>ユーザーメンテナンス(完了)</h1>
		<?php
			$sql=$pdo->prepare('insert into user_table(id,last_name,first_name,last_name_kana,first_name_kana,user,password) values (null,?,?,?,?,?,?)'); 
				if($_SERVER['REQUEST_METHOD'] === 'POST'){
				if(empty($_POST['sei']) || empty($_POST['mei']) || empty($_POST['sei_kana']) || empty($_POST['mei_kana']) || empty($_POST['user']) || empty($_POST['password']) || empty($_POST['password2']))
					{
						echo '未入力の項目があります。';
					}
					else if(!preg_match('/\A[ァ-ヴー]+\z/u', $_POST['sei_kana']) || !preg_match('/\A[ァ-ヴー]+\z/u', $_POST['mei_kana']))
						{
							 echo 'カナ名は全角カナで入力してください。';
						}
						else if(!preg_match('/\A[a-zA-Z0-9!-\/:-@[-`{-~]+\z/u', $_POST['user']))
							{
								echo 'ユーザーは半角英数字記号で入力します';
							}
							else if(!preg_match('/\A[a-zA-Z0-9!-\/:-@[-`{-~]{10,}\z/u', $_POST['password']))
								{
									echo 'パスワードは半角英数字記号10文字以上で入力します。';
								}
								else if(!preg_match('/\A[a-zA-Z0-9!-\/:-@[-`{-~]{10,}\z/u', $_POST['password2']))
									{
										echo 'パスワードは半角英数字記号10文字以上で入力します。';

									}
									else if($_POST['password'] !== $_POST['password2'])
										{
											echo '2つのパスワードが一致してません。';
										}
										else if($sql->execute(
												[escape($_POST['sei']),
												escape($_POST['mei']),
												escape($_POST['sei_kana']),
												escape($_POST['mei_kana']),
												escape($_POST['user']),
												htmlspecialchars($pass,ENT_QUOTES | ENT_HTML5,'UTF-8')]))
											{
												echo '<p class="msg">','登録に成功しました。','<p>';
											}
												else {
														echo '<P class="msg">','登録に失敗しました。','</p>';
													}
												header('Location: user_create_commit.php', true, 303);
												exit();}?>
		<p class=return><a href="user_table.php">ユーザーメンテナンスへ戻る</a></p>
	</body>
</html>
0 likes

1Answer

もしかして、記載されているコードがuser_create_commit.phpなのでしょうか?
だとすれば、

  1. POST user_create_commit.php
    1. DBに登録される
    2. user_create_commit.phpにリダイレクト(GETリクエスト)
  2. GET user_create_commit.php
    1. $_SERVER['REQUEST_METHOD'] === 'POST' の条件は通らないので、「登録に成功しました」は表示されない。

という流れになり、説明されている状況なると思います。
リダイレクトした時の出力は表示されないので(リダイレクト先の処理に移る)、DB登録後にechoしているメッセージは表示されません。

以下はあくまで推測通りの場合の解決策です。
登録成功したときにしか来ない完了ページなのですから、特に条件分岐などせずにメッセージを表示すれば良いと思います。

    // 省略
	} else if (
		$sql->execute(/* 省略 */)
	) {
		header('Location: user_create_commit.php', true, 303);
		exit();
	} else {
		echo '<P class="msg">','登録に失敗しました。','</p>';
	}
} // end $_SERVER['REQUEST_METHOD'] === 'POST'
        <p class="msg">登録に成功しました<p>
        <p class=return><a href="user_table.php">ユーザーメンテナンスへ戻る</a></p>
	</body>
</html>

ただ、通常は登録処理を扱うページと完了画面を扱うページを分けることが多く、次のような構成になります。

  • GET form.php
  • POST create.php
  • GET complete.php

このようにすれば、完了ページをリロードしたところで登録処理がされることはありません。

1Like

Comments

  1. @jackytom

    Questioner

    回答ありがとうございます。
    根本的に勘違いをしていた気がします。
    その点への配慮もいただき、ありがとうございます。
    上記は、
    POST create.php
    →登録ページ
    GET complete.php
    →完了ページ
    と思ってますが、GET form.phpは何を想定してますか?

  2. GET form.phpは何を想定してますか?

    入力フォームがあります。フォームに入力して登録ボタンなどを押すとcreate.phpに遷移して、そこでチェックや登録を行うイメージです。
    入力エラーがあればform.phpに戻ってエラーメッセージを表示します。
    もちろん示した構成は一例なので、入力・登録・完了をどのようなページ構成にするかはケース・バイ・ケースだと思います。例えば入力と登録の間に確認画面が入るケースもあります。

  3. @jackytom

    Questioner

    回答ありがとうございます。

Your answer might help someone💌