• e-mailとパス
    ワードを入力し送信すると Fatal error: ...
  • のむきちのむきち 
    e-mailとパスワードを入力し送信すると
    Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Applications/MAMP/htdocs/sample02/login.php:25 Stack trace: #0 /Applications/MAMP/htdocs/sample02/login.php(25): PDOStatement->execute(Array) #1 {main} thrown in /Applications/MAMP/htdocs/sample02/login.php on line 25

    のエラーメッセージが出てきます。
    翻訳したところ
    無効なパラメーター番号でパラメーターが定義されていませんと出るので
    https://codeday.me/jp/qa/20190615/1019336.html
    のサイトを見てみたのですがいまいち改善するポイントがどこかはっきりしません。

    パラメーターと言う言葉はこちらのサイトから
    https://www.sejuku.net/blog/80755
    ざっくり考えて値と言う意味だと理解したのですが、

    parameter was not defined in /Applications/MAMP/htdocs/sample02/login.php:25の
    パラメーターが25行目($stmt->execute(array(':email' => $email, ':pass' => $pass));)
    に定義されていませんのところの解決方法が分からず

    自分が試した考え方としては
    25行目にパラメターが入っていない=25行目に記入ミスがある→ミスを確認できず
    記入ミスの確認が取れない=25行目以前に定義している変数などに問題がある→$stmtや$email,$passの変数やその中身を追って確認したがミスが分からず
    そもそも送信している値が間違っているのか?=login.phpのログインフォーム内のmethod,name確認→記入ミス確認できず

    という状態なんですが次に確認すべき場所はどこになるのでしょうか?
    回答 0

     
    Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
というエラーはプレースホルダーの数とそこに流し込むデータ(パラメーター)の数が違うことによって発生します。
言い換えると「データを流し込むための指定されたプレースホルダーが見つからないよ」といった意味になります。
    プレースホルダーについては少し復習になりますがLesson 13で説明しております。
    :を値の先頭に付け、虫食い状態にして後々情報を当てこむといった書き方です。
    これからDBとやり取りする際にこの書き方はよく使うことになるので覚えましょう。
    今回でいうと:email,:passがプレースホルダー、パラメーターが$email,$passに該当します。

    MYSQLに働きかけるためののSQL文
    
$stmt = $dbh->prepare(‘SELECT * FROM users WHERE email = :email AND pass = :pass’);
    虫食い状態となってるプレースホルダーに値(パラメーター)を流し込む文
    
$stmt->execute(array(’:email’ => $email, ‘:pass’ => $pass));

    自分が書いたSQL文周辺を見直してパラメーターと流し込むためのプレースホルダーの数が合っているかどうかなどが怪しいので、
    その辺りを確認しましょう!
    今回のケースでは、例えばエラーメッセージの「Invalid parameter number」でGoogle検索をかけてみると、
    原因や対応策がたくさんヒットします。
    今後、エラーが出た際はまず一度エラーメッセージで検索してみると案外すぐ答えが見つかったりします。
    その方が学習効率も良いですし、現場でもそういった姿勢が求められますので参考にしてみてください。

    のむきち 
    ありがとうございます!やってみます!

    のむきち 
    解決しました!

    以下は後続のための解決法です!

    https://qiita.com/SuguruOoki/items/84946b7a830628b03ddc

    のサイトを参考にすると

    エラーメッセージ「Invalid parameter number」の
    エラーが出るパターンは2通りで

    1.PHPの構文内でSQL文において発行している標準関数、またはメソッドのバインド変数の数と異なる
    2.SQLの構文が異なる

    です。
    まず構文の意味が分からず調べたところ
    「SQLで使う決まった形の文」
    という意味で現段階では捉えています。

    これは人と会った時の挨拶は「おはようございます」と
    一語一句合っていなければ伝わらず
    「おざーす」や「おはまーす」ではなく
    ちゃんと「おはようございます」と言う
    日本語学びたての外国人は「おはようございます」は分かるけど
    ちょっとでも崩した言葉は通じないイメージです。

    今回は1と2のダブルパンチで該当しており
    ミスした部分が
    $stmt = $dbh->prepare('SELECT * FROM users WHERE email = :email AND pass = :pass');
    の中の
    ・FROMがFORMになっていた(パターン2の構文が異なるに該当)
    ・email = :emailがemail = :emialになっていた(SQL文で設定したemail = :emialとその下の':email' => $email,が一致しない為パターン1のバインド変数の数と異なるに該当した?)
    です。

    打ち間違いや要因の検索で1週間ぐらい使っていて
    「もう打ち間違えではないだろう」と思っていたのですが
    今回のウェブカツコーチさんの指摘から要因の範囲を限定して
    調べることができたのがミスの発見に繋がったのかなと思います。

    これからも精進していきますのでみなさんも一緒に頑張りましょうー!

    のむきち 
    解決しました!
    1度、解決方法を書いたのですが
    「返信できませんでした」と書いていた文が消えた為
    後日解決方法を再度書かしていただきます!