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

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

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

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

Q&A

解決済

1回答

1480閲覧

formで入力したデータをPOSTすると中身が消えてしまい受け取れません。

yokkoh

総合スコア1

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

0グッド

0クリップ

投稿2020/07/25 11:07

編集2020/07/26 00:48

前提・実現したいこと

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/25 20:12

何を POST したときに、どこの値がどうなることが問題なのでしょうか? 具体的なサンプル値を追記してもらえますか?
m.ts10806

2020/07/25 23:05 編集

今ひとつ再現しないですが(確認の上のコメントです)、大量に出ているはずのNotice: Undefined index:をそのままにしないほうが良いかと。 issetでは「POSTかどうか」は判定できません。filter_input使わないなら$_SERVER['REQUEST_METHOD']を利用してください。
yokkoh

2020/07/26 00:52

te2ji様 追記・修正の依頼ありがとうございます。 一応追記したつもりですがこういうことで大丈夫でしょうか?
yokkoh

2020/07/26 01:02

m.ts10806様 追記・修正の依頼ありがとうございます。 恥ずかしながらfilter_inputや$_SERVER['REQUEST_METHOD']といったものを知りませんでした。。。 一旦書き直してみます。 しかしながら$_POSTに値があるかどうかだけ判断すればいいと思っていたので、filter_inputを使う優位性がいまいちピンと来ていないのですが、どういった理由で必要なのでしょうか?(リファレンスは読んだ上での質問です) ちなみになぜか私の方ではエラーメッセージは何も出ていません。。。
m.ts10806

2020/07/26 01:04

エラー出る設定にしていないからですね。 display_errorとかini_setで調べてください。
m.ts10806

2020/07/26 01:07 編集

_POSTに値があるかどうかならissetではなくcountにすべきですね。 filter_inputを使うと値のフィルタリングもできるので、バリデーションにも利用できてコードがスッキリ書けます。 他にも突っ込みどころは少なくはないですが、起きている現象についてのみ言及して回答していますので回答ご確認を。
guest

回答1

0

ベストアンサー

header関数を削除すると正常に受け取れるようです。

リダイレクトされているからです。
リダイレクトはGETアクセスになります。
全てtestと入れたのでしたら今回の実装上、バリデーションにかかりません。
そのままinsert.phpにリダイレクトされて、insert.phpで処理が行われているのでしょう。

で、insert.phpでは$_SESSIONのsignupをチェックしてますが、signup.phpからリダイレクトされてる際は$_SESSIONのloginにいれてますから、結局signup.phpにリダイレクトで戻ってきています。

投稿2020/07/26 01:03

m.ts10806

総合スコア80850

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

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

yokkoh

2020/07/26 01:48

修正依頼の方でのやりとりも含め、丁寧にご回答して頂きありがとうございました。 コード全体を見直そうと思います。 他にも突っ込みどころは少なくないとの事でしたが、どういった点がそう思ったのでしょうか? お忙しいかと思いますが、ご教授頂ければ幸いです。。。
m.ts10806

2020/07/26 04:30

んー。ここで書いておさまるレベルではないというか。過去にも似たようなコードに似たような指摘はしてきてるので、探してみてください。 セキュリティ対策もエラーハンドリングも結構滅茶苦茶です。 insert-setはMySQLでしか使えないので覚えるべきではないです。
yokkoh

2020/07/27 05:21

なるほどですね。。。 探してみます。 色々とご指摘いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問