前提・実現したいこと
PHPで会員登録をして文章が投稿できる簡単なアプリを作っています。
会員登録をする部分を、フォームに必要事項を記入->$_POSTで受け取って空欄チェック->エラーがなければDBに登録という流れで書こうとしています。
発生している問題・エラーメッセージ
空欄チェックを通るような内容を入力したときにのみ、送信するとフォームに入力したデータが消えてしまいます。エラーメッセージは出ず、1箇所を空欄にするなど空欄チェックをパスできない内容で送信したときには正しく受け取ることができます。
追記:
例
メールアドレス:test
ニックネーム:test
パスワード:test
パスワード確認:(空欄)
で送信するとvar_dump($_POST)は
array(4) { ["email"]=> string(4) "test" ["name"]=> string(4) "test" ["password"]=> string(4) "test" ["passwordCheck"]=> string(0) "" }
メールアドレス:test
ニックネーム:test
パスワード:test
パスワード確認:test
で送信するとvar_dump($_POST)は
array(0) { }
となってしまいます。
該当のソースコード
php
1signup.php 2 3<?php 4 session_start(); 5 require_once('dbconnect.php'); 6 7 echo var_dump($_POST); 8 9 if(isset($_POST)){ 10 11 if($_POST['email'] == ""){ 12 $error['email'] = 'blank'; 13 } 14 15 if($_POST['name'] == ""){ 16 $error['name'] = 'blank'; 17 } 18 19 if($_POST['password'] == ""){ 20 $error['password'] = 'blank'; 21 } 22 23 if(strlen($_POST['password']) < 4 || strlen($_POST['password']) > 16){ 24 $error['password'] = 'length'; 25 } 26 27 if($_POST['passwordCheck'] == ""){ 28 $error['passwordCheck'] = 'blank'; 29 } 30 31 if($_POST['passwordCheck'] != $_POST['password']){ 32 $error['passwordCheck'] = 'match'; 33 } 34 35 36 if(empty($error)){ 37 $customer = $db->prepare('SELECT COUNT(*) AS cnt FROM customers WHERE email=?'); 38 $customer->execute(array($_POST['email'])); 39 $record = $customer->fetch(); 40 if($record['cnt'] > 0){ 41 $error['email'] = 'duplicate'; 42 } 43 } 44 45 if(empty($error)){ 46 $_SESSION['login'] = $_POST; 47 header('location: insert.php'); 48 exit(); 49 } 50 51 } 52 ?> 53 <!DOCTYPE html> 54 <html lang="ja" dir="ltr"> 55 <head> 56 <meta charset="utf-8"> 57 <link rel="stylesheet" href="style.css"> 58 <title>サインアップ</title> 59 </head> 60 <body> 61 <div class="main"> 62 <form action="" method="post"> 63 メールアドレス <input class="signup" type="text" name="email"><br> 64 ニックネーム <input class="signup" type="text" name="name"><br> 65 パスワード <input class="signup" type="text" name="password"><br> 66 パスワード確認 <input class="signup" type="text" name="passwordCheck"><br> 67 <input type="submit" class="button" value="作成"><br> 68 </form> 69 </div> 70 </body> 71 </html>
PHP
1insert.php 2 3<?php 4session_start(); 5require_once('dbconnect.php'); 6 7if(isset($_SESSION['signup'])){ 8 $statement = $db->prepare('INSERT INTO customers 9 SET name=?, email=?, password=?, created=NOW()'); 10 $statement->execute(array( 11 $_SESSION['signup']['name'], 12 $_SESSION['signup']['email'], 13 sha1($_SESSION['signup']['password']) 14 )); 15 unset($_SESSION['signup']); 16 header('location: post.php'); 17 exit(); 18 19}else{ 20 header('location:signup.php'); 21 exit(); 22} 23 ?>
試したこと
echo var_dump($_POST)
で$_POSTの中身を確認していますが、データが空になってしまうときは空欄チェックに入る前にもうすでに空になっており、なぜそうなっているのか理由がわかりません。
空欄チェックをなくしたり、1箇所空欄にしたりすると正常に受け取れます。
追記:
header関数を削除すると正常に受け取れるようです。
補足情報(FW/ツールのバージョンなど)
環境:MAMP、ローカル環境、PHP 7.3.11
回答1件
あなたの回答
tips
プレビュー