パスワード変更機能実装〜初めてのエラーに遭遇〜
こんにちは。
文系出身でも・未経験でも・プロのプログラマーを目指すブログ 略して「プロプロ」
あんまん(@aaii0123)です。
昨晩は、漠然とした不安に苛まれて鬱々としていたのですが、
一晩寝たらスッキリしました!!
ここ最近、ついついツイッターを見てしまい、
素晴らしいアウトプットをされてる方や就活して内定獲得した方のツイート見て落ち込んでしまっていたのですが、
今日はツイッター見ないと決めたら気持ちも軽くなったし勉強にも集中できたので、
SNSは意識的に制限しないとダメだなと反省・・笑
周りの人と比較するんじゃなくて、昨日の自分と比較するように意識したいと思います!
さて、今日の進捗です。
取り組んだこと
・プロフィール編集機能実装
昨日、ダラダラと実装の流れをメモしたプロフィール編集機能の実装!
結果的にうまくいったのですが、今回初めて遭遇したエラーもあり、
色々試していくうちにあっという間に時間が経ってしまいました。
初めて遭遇したエラー
ここまで2〜3回正解コードを写経したり、実際にいくつか機能を実装したりして
だいぶエラーも見慣れてきたのですが
今日は初めて遭遇したエラーがあったので、覚えで残しておこうと思います。
1.遭遇したエラー
unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)
結構長いエラーだったので初め見たときにはギョッとしたのですが、
どうやらどこかに予期せぬ記号か数値が入ってしまっているという内容のよう・・
2.エラーが出た場所
エラーが出たのは、メール送信関数を実行後にもし失敗していたらエラーが表示されるようにエラーメッセージを格納する文を書いたところでした(波線の部分・78行目)
だけど、この文自体はシンプルだし誤字や脱字もない・・
どんなに前後の文も含めて確認しても怪しそうなところが見つからず久々に頭を抱えました
3.試しにエラーが出ている文を消してみた
そこで、試しにエラーが出ているこの一文を消してみることに。
しかし、なんと数行下の119行目に全く同じエラーが出てしまいました!
先ほどエラーが出た部分と何の関係もなさそうに見えるうえ、
こちらの文の前後にも書き間違いなどが見つかないのに同じエラーが出たため
ますます混乱・・
4.判明した原因
色々とググっているうちに、どうやらエラーが出た箇所の数行上にある
ヒアドキュメントが悪さをしているようだということがわかりました。
私は、はじめヒアドキュメントをこんな風にインデントした状態で記載していました。
しかし、こちらの質問(PHP - phpのエラーが解決できません。|teratail)の解答欄に
「ヒアドキュメントの末尾は行頭でなければなりません。」
という一文を発見!
もしやと思い、下記のようにインデントをつめて書き直しました。
すると、先ほどのエラーが表示されなくなり無事に解決することができました。
ヒアドキュメントは68行目、エラーが出たのは78行目・119行目だったので
なぜこんなに離れた場所にエラーが出たのか正直まだ謎ですが、
teratail上の質問に今回は救われました・・
(質問してくださった方と回答してくださった方グッジョブ)
その他
その他にも、数日前に作成した半角英数字のバリデーションがうまくいかなくなったり
(こちらは正規表現を変更することで解決)
変更後のパスワード登録の際にハッシュ化するのを忘れて再ログインしようとした際に
ログインできなくなったり
(ログイン時のパスワードの照合はハッシュ化したものとする仕様にしていたので)
ということがありました。
エラーが出ると、一瞬投げ出したい気持ちになりますが
辛抱強く色々と試すことで何とかできることを体感として学べているような気もします。
学んだこと
・emptyで判定できるのは1個ずつ(まとめるの×)
○!empty($to) && !empty($subject) && !empty ($comment)
×!empty($to,$subject,$comment)
・ヒアドキュメントの末尾は文頭にしないと予期せぬエラーが表示される
表示されたエラー:unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING)
・パスワードをデータベースに登録する際は、hash化を忘れない
ググったこと
・mb_send_mail 関数
mb_send_mail(送信先, 題名, 本文, ヘッダ);
ヘッダにはメールヘッダに追加する文字列を指定。このメールヘッダに送信元のメールアドレスなどを指定する。メールヘッダーに指定できる文字列は以下の通り。
From: 送信元メールアドレス
Reply-to: 送信元メールアドレス
CC: CCで送信する送信アドレス
参考URL:PHPでメール送信を行う方法:mb_send_mail() | UX MILK
まとめ
結構疲弊したこともあり、雑なまとめかたをしてしまいましたが(いつものこと?)
こうやって、その日の発見や学んだことを少しずつでも残していくことに意味があると信じて
明日も頑張ります!!