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

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

ただいまの
回答率

87.35%

POST受信がうまくできません

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,034

score 9

POSTメソッドで送信したデータをうまく受け取ることができません。
signup.phpのフォームで受け取ったデータをsignup_process.phpで処理しています。
ちなみに、試しにPOSTをGETメソッドに変えてみたときはうまくいきました。

どこに問題がありそうでしょうか?

//<body>の一部を抜き出しています
//signup.php
<div class="registrationForm">
            <h3>以下のフォームを埋めてください</h3>
            <form action="signup_process.php" method="POST">
                <input type="email" name="email" placeholder="メールアドレス"><br>
                <?php if(!empty($emailError)) echo $emailError ."<br>" ?> 

                <input type="text" name='userID' placeholder="ユーザID(任意の文字列)"><br>
                <?php if(!empty($userIDError)) echo $userIDError ."<br>" ?> 

                <input type="password" name="password" placeholder="パスワード"><br>
                <input type="password" name="passwordCheck" placeholder="パスワードを再度入力してください(確認用)"> <br>
                <?php if(!empty($passwordError)) echo $passwordError ."<br>" ?>

                <input class="submit" type="submit" value="登録する">
                <?php print_r($_SESSION['temp']) ?>
            </form>
        </div>


ひとまずPOSTで正しく値が受け取れているかどうか確認するため、$_POST['userID']をechoしています。

signup_process.php
<?php
    session_start();

    $_SESSION['error'] = []; //エラーメッセージを入れる配列
    $_SESSION['login'] = false;

    $db = [];
    $db['dsn'] = 'mysql:dbname=intousers;host=localhost';
    $db['user'] = 'kmtym1998';
    $db['password'] = '6427';

    //メアドが入力されてるか


    //ユーザIDが入力されているか
    if(empty($_POST['userID'])){
        $_SESSION['error']['userID'] = 'ユーザIDを入力してください';
        //header("Location: signup.php");
    }else{
        $_SESSION['error']['userID'] = '';
    }
    echo $_POST['userID'];

    //ユーザIDが一意か
    try{
        $pdo = new PDO($db['dsn'], $db['user'], $db['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING]);
        $selectOrder = "SELECT * FROM iNTOAccount WHERE userid = :userID";
        $stmt = $pdo->prepare($selectOrder);
        $stmt->bindParam('userID', $temp, PDO::PARAM_STR);
        $temp = $_POST['userID'];
        $stmt->execute();
        $result = fetchAll();
    }catch(PDOException $error){
        $_SESSION['error']['other'] = "データベース接続エラー";
        header("Location: index.php");            
        die();
    }

    $_SESSION['temp'] = $result;
    $_SESSION['error'] = [];
?>


エラーメッセージは以下の通りです。

Notice: Undefined index: userID in C:\xampp\htdocs\php_test\iNTO\signup_process.php on line 22

Notice: Undefined index: userID in C:\xampp\htdocs\php_test\iNTO\signup_process.php on line 30

Fatal error: Uncaught Error: Call to undefined function fetchAll() in C:\xampp\htdocs\php_test\iNTO\signup_process.php:32 Stack trace: #0 {main} thrown in C:\xampp\htdocs\php_test\iNTO\signup_process.php on line 32

自分で考えてみて限界になったので質問させていただきました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

おそらくもっと単純な話

<form action="signup_process.php" method="POST">

[ ]method
↑ここの全角スペース

signup_process.php冒頭で下記のように入れてみるとわかりますし、

<?php
echo $_SERVER['REQUEST_METHOD'];

//GET

URLもsignup_process.php?email=&userID=&password=&passwordCheck=のようになっているはずです。

つまりformのmethod属性が正しく認識されていないわけですね。
method属性の初期値はGETなので、「GETならうまくいった」は「method属性効いてないけどデフォルトがGETだからたまたまうまくいった」だけとなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/16 17:01

    ご回答ありがとうございます。
    とてつもなくダサいミスでした。助かりました。

    キャンセル

  • 2019/09/17 09:38

    解決されたようで何よりです。
    実際に動かしてみてわかったことではあるので、ダサいとかは思わないですが、get/postをデバッグする際には「そもそもリクエストがpostかどうか」というところから疑うべきというところですね。

    キャンセル

+1

「Notice: Undefined index: userID 」が出るってことは、'userID'をキーにした配列の参照をしようとして値が詰められていなかった場合。

isset($_POST['userID'])で存在チェックをするときは、そういうエラーは出ないものの、
おそらくechoの行と$temp = $_POST['userID'];の行で参照してそのときのエラーだろうね。

try以降の処理は、$_POST['userID']が存在する時に行うべきで、
エラーなどでその処理をしてはいけないのであれば、

if (isset($_POST['userID'])) {  // DBアクセスに必要な変数が揃っていることをisset()で確認、もしも複数の変数が必要ならここで&&条件ですべて確認しておくとよい
  try {  // DBアクセスの処理をこの中に
    ~~
  }
  catch(PDOException $error) {  // DBアクセス時の例外をココでキャッチ
    ~~
  }
  catch(Exception $error) {  // 起こりにくいかもしれないけどDB以外の部分で例外発生したらココでキャッチ
    ~~
  }
}


などとすればよいかと。

もう一点、

$stmt->bindParam('userID', $temp, PDO::PARAM_STR);


でなく

$stmt->bindValue(':userID', $temp, PDO::PARAM_STR);


だね。PHP: PDOStatement::bindValue - Manual参照。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/16 15:24

    ご回答ありがとうございます。
    申し訳ありません、情報が足りていなかったかもしれません。
    フォームに値を入力したのにもかかわらず、$_POSTに入力した値が格納されておらず、Noticeが出ています。フォームをすべて埋め、送信ボタンを押したあと、signup.process.phpで、「print_r($_POST)」と記述すると、「Array()」という結果が返ってきます。$_POSTで値が受け取れていないのはどのような原因が考えられるでしょうか。

    $stmtの記述のところに関してはありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る