jackytom
@jackytom

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPで<button type="submit">のisset($button)が効かない

Q&A

Closed

ユーザー、パスワードの登録フォームで、ユーザーが既存のものだとエラーとする仕組みをPHP+javascriptで作成中ですが、その前段で躓いています。

isset($button)でボタンがクリックされたら後続処理が動くようにしたいのですが、できません。
isset(button)をvar_dump()したところ、""(空文字)だったので、そもそもクリックされたと認識されてない気がします。

HTML側を確認すると、「value="button_con"]と記述しています。

参考までですが、mariadb側のログを確認したところ、prepereもexecuteもログが出力されてません。

原因究明に協力いただければ幸いです。
ソースを添付いたします。

<?php
	session_start();
	header('Expires:-1');
	header('Cache-Control:');
	header('Pragma:');
		$token = '';
		if ( isset( $_SESSION[ 'token' ] ) || !empty( $_SESSION[ 'token' ] ) ) {
				$token = $_SESSION['token'];
				} else {
					$token = bin2hex(random_bytes(32));
					$_SESSION['token'] = $token;
					}
	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/customer_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>
		<?php require_once('header.php')?>
		<h1>パスワード作成画面</h1>
		<form method="post" action="customer_create_pass_conf.php" class="password_cre" id="password_cre">
			<input type="hidden" name="token" class="token" id="token" value="<?=$token;?>">
			<div class="last_name" id="last_name">
				<label for="sei"></label>
				<input type="text" name="sei" class="sei" id="sei">
			</div>
			<div class="first_name" id="first_name">
				<label for="mei"></label>
				<input type="text" name="mei" class="mei" id="mei">
			</div>
			<div class="last_name_kana" id="last_name_kana">
				<label for="sei_kana">姓(カナ)</label>
				<input type="text" name="sei_kana" class="sei_kana" id="sei_kana">
			</div>
			<div class="first_name_kana" id="first_name_kana">
				<label for="mei_kana">名(カナ)</label>
				<input type="text" name="mei_kana" class="mei_kana" id="mei_kana">
			</div>
			<div class="genders" id="genders">
				<label for="gender">性別</label>
				<input type="radio" name="gender" class="gender" value="1" checked>女性
				<input type="radio" name="gender" class="gender" value="2">男性
			</div>
			<div class="mail" id="mail">
				<label for="address">メールアドレス</label>
				<input type="text" name="address" class="address" id="address">
			</div>
			<div class="pass" id="pass">
				<label for="password">パスワード</label>
				<input type="password" name="password" class="password" id="password">
			</div>
			<div class="pass_sec" id="pass_sec">
				<label for="password_sec">パスワード(確認用)</label>
				<input type="password" name="password_sec" class="password_sec" id="password_sec">
			</div>
			<div class="buttons">
				<button type="submit" class="button_b" name="button_con" id="button_con" value="button_con">確認</button>
			</div>
		</form>
		<?php
			require_once('db_connect.php');
			require_once('password_db.php');
			$mail = $_POST['address']?? "";
			$button = $_POST['button_con']?? "";
			$mailJson = 3;
			if(isset($button)){
				$sql = "select count(*) from customer where convert(AES_DECRYPT(UNHEX(mail_address), '" . $password . "')USING utf8) = ? ";
				$stmt = $pdo->prepare($sql);
				$stmt -> execute([escape($mail)]);
				$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
				$data = [];
					foreach($row as $data){
							function num() {
									if(($data['count(*)']) >= 1){
										return 1;
									}
									else {
										return 2;
									}
						$mailCount = num();
						$mailJson = json_encode($mailCount);
						}
					}
				}
		?>
		<?php require_once('customer_pass_chk_js.php');?>
		<?php require_once('footer.php');?>
		<?php var_dump($button);?>
	</body>
</html>
0

2Answer

まず全体の流れが見えない部分があるので、どのような流れで問題が起きているのか分からないところがあります。
例えばcustomer_create_pass_conf.phpや +javascriptの部分です。

今わかるところでは、issetはブランク文字列でもtrueと判定するので、if(isset($button))の条件は通っていると思います。
つまりformをsubmitしたかどうかに関わらず、条件の中は常に実行されているのではないでしょうか?

isset($button)でボタンがクリックされたら後続処理が動くようにしたいのですが、できません。

こちらで確認ボタンをクリックしてみたところ、$buttonは string(10) "button_con" が入ります。
ただrequire_onceで読み込んでるファイルやDBが無いので、再現できていない可能性はあります。
例えばJavaScriptで何か処理をしている場合、こちらが想定できない状況になっているかもしれません。

例1 isset() の例
$var = '';

// これは TRUE と評価されるので、テキストが出力される
if (isset($var)) {
    echo "This var is set so I will print.";
}

0Like

Comments

  1. 繰り返しforeachの中で関数numを定義しているので、同じ名前の関数が複数回定義している状態になっているかもしれません。
    それからインデントを整理すると関数numを外から呼んでいるところがないので、実行されていないかもしれません。

    また関数numの中で参照している変数$dataについて、通常は関数の外側の変数を参照することはできません。
    こうした場合は引数を使って値を渡す必要があります。

    foreach($row as $data){
        function num() {
            if(($data['count(*)']) >= 1){
    		    return 1;
    		} else {
    			return 2;
    		}
    		$mailCount = num();
    		$mailJson = json_encode($mailCount);
        }
    }
    
  2. @jackytom

    Questioner

    解決しました。
    javascriptでメッセージが表示されていて、postできなかったようです。
    お騒がせして申し訳ありません。
    本件、クローズさせていただきます。

どこかでエラーが発生して途中で強制終了されているのではないですか?

もしエラー表示レベルを甘くしているようであれば、多少厳しめに設定すればどこが原因なのか分かるのでは?

PHP: error_reporting - Manual

0Like

Comments

  1. @jackytom

    Questioner

    皆様

    ご回答ありがとうございます。
    質問しておいてご無沙汰してしまい、申し訳ありません。
    改めて私でも調査してみました。
    少し長文になりますが、ご容赦いただければ幸いです。

    今更で申し訳ないのですが、やりたいことは、ユーザー登録画面にて、
    (1)入力されたメールアドレスが既存の(DBに登録されている)ものではないかをチェック。(PHP)
    (2)既存のものならばエラー表示(すでに登録されているメッセージ)する。(Javascript)
    という流れです。

    現在(1)ですでにDBに登録したメールアドレスを入力してボタンをクリックしてもメッセージが出ないことで躓いています。

    皆様にご回答いただいた内容を参考にさせていただき、継続して調査してみました。

    調査の過程で、添付したPHPのソースにてVAR_DUMP($_POST)してみたところ、結果は0件、つまりPOSTが上手くいっていないようです。

    ボタンが押されたら(isset($button))、入力されたメールアドレス($mail)の検索をしてチェックする
    ように記述しています(つもり)ので、後続処理が実行されないものというのが私の認識ですが、問題ないでしょうか?

    そうだとしましたら、POSTができていない原因を調査するべきでしょうか?

Your answer might help someone💌