ワードを入力し送信すると Fatal error: ...
プレースホルダーについては少し復習になりますが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度、解決方法を書いたのですが
「返信できませんでした」と書いていた文が消えた為
後日解決方法を再度書かしていただきます!
部活の学習一覧
Lesson 01
「PHPって何?」
Lesson 02
「PHPの書き方」
コーヒーブレイク
「砂と砂山」
Lesson 03
「変数・型・配列・連想配列」
【理解度チェック】答えはいくつ?
Lesson 04
「色々な演算子」
Lesson 05
「色々な構文」
Lesson 06
「関数」
Lesson 07
「ローカル変数とグローバル変数」
【理解度チェック】変数のスコープを間違わないで!
Lesson 08
「データベースってなに?」
Lesson 09
「データベースを使ってみよう!」
Lesson 10
「SQLを使ってみよう!」
Lesson 11
「実践!ユーザー登録システムを作ってみよう!part1」
Lesson 12
「実践!ユーザー登録システムを作ってみよう!part2」
Lesson 13
「実践!ユーザー登録システムを作ってみよう!part3」
Lesson 14
「実践!ログインシステムを作ってみよう!part1」
Lesson 15
「実践!ログインシステムを作ってみよう!part2」
【理解度チェック】email重複チェックをしよう!
Lesson 16
「実践!メールフォームを作ってみよう!」
Lesson 17
「実践!画像アップローダーを作ってみよう!」
Lesson 18
「最終回!!エラー時の対応方法を学ぼう!」
コーヒーブレイク
「見積もり力を鍛えよう!」
コーヒーブレイク
「はたらくプログラミング 第4話」
ご意見箱
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確認→記入ミス確認できず
という状態なんですが次に確認すべき場所はどこになるのでしょうか?