挫折からの回帰

1度プログラミング学習から逃げた者がどこまでやれるかもう一度挑戦するブログ

ちょっとペースダウン(ゆっくりコード写経デー)

f:id:iolwloi:20191008232250p:plain

こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ 略して「プロプロ」

あんまん(@aaii0123)です。

 

昨日のエラー祭りで疲れが出たのか、今日はあまり気分が上がらず

コードを書くにもダラダラしてしまい、あまり進めませんでした(反省・・)

 

数日前まで、「我ながら成長を感じる!」なんて調子にのってたのに

あの勢いはどこへやら・・

 

実務にはいったら、こういうモチベーションの管理も仕事のうちですよね。

ダラダラモードは今日で終わらせて、明日にはシャキッと気持ちを新たにできるよう

今日は早めに寝る準備をしようと思います!

 

さて、今日の進捗です

 取り組んだこと

今日はこんなことに取り組みました!

・プロフィール編集機能の実装の復習

・パスワード変更機能をメモを作成しながら写経

postfixの設定チャレンジ

 

プロフィール編集機能の実装の復習

今日ははじめに、昨日実装したプロフィール編集機能のコードを

復習でもう1度書きました!

 

もう1回書いたことで、昨日まで理解が曖昧だった書き方のところも

自分の中で再度整理されたような気がします。

 

正解コードと照らし合わせて、間違っている箇所もなくはありませんでしたが

処理の流れはだいぶ自分の中におちたので

ここに時間をかけすぎずに、先に進めることにしました!

 

パスワード変更機能をメモを作成しながら写経

続いて実装に挑戦するパスワード変更機能の正解コードを

メモをとりながら写経。

 

データベース接続のところなど、最初は複雑に感じていた処理にもだいぶ慣れてきたように思います。

作成したメモがこちら

パスワード変更機能の実装の流れ

Function.php

パスワードチェックの関数を追加

 半角英数字・最大文字数・最小文字数のチェックをまとめる

エラーメッセージチェックの関数を追加

メール送信関数を追加(引数に$from, $to ,$subject, $comment指定)

 送信先・タイトル・本文が空でない場合、文字化け回避設定をしてメール送信

 メールが送信できたかデバックで確認

 

passEdit関数

getUser関数を使って、DBからユーザー情報を取得

 

POSTされていれば変数にユーザー情報を入れる

バリデーションチェック

  未入力チェック

  エラーメッセージがなければパスワードのチェック

      古いパスワードとデータベースのパスワードが一致していなければエラーメッセージを格納

      新しいパスワードと古いパスワードが同じかどうかチェックして一致していればエラーメッセージを格納

  パスワードとパスワード再入力があっているかのバリデーションチェック

再度エラーメッセージがないかを確認してDBに接続

クエリが成功していたら、セッションにメッセージを格納

メール送信の準備

 Username変数にユーザー情報(ユーザー名)を格納 (ユーザー名が空欄なら「名無し」を入れる)

 from変数に送信元メールアドレスを入れる

 to変数にユーザー情報のメールアドレスを入れる

 subject変数にメールタイトルを入れる

 comment変数にヒアドキュメントを使ってメール本文を入れる

DB接続

レコード更新

パスワード変更メール送信

マイページへ遷移

 

明日はこのメモを見ながら、自力でコードを書く練習をしようと思います!

 

postfixの設定チャレンジ

そして、今回のパスワード変更機能にメール送信があるので、

postfixの設定を少しいじりました。

 

そもそも、postfixの設定をなぜする必要があるかよくわかっていなかったので

メモで自分なりにまとめました。

 

メールの送受信の流れ

(前提)一般的なメール送受信の流れ

ブラウザでメールの画面を表示

メール作成

メール送信

送信元メールサービスのSMTPサーバがメールを受信

送信元メールサービスのSMTPサーバが送信先メールサービスのDMTPサーバにメールを送信

送信先のメールサービスのSMTPサーバがメールを受信

送信先のメールサービスのSMTPサーバが該当のメールアドレス宛にメールを送信

該当のメールアドレスの持ち主がメールを受信

 

つまり、

メルアドからメルアドへ直接送っているわけではなく

使っているメールサービスのSMTPサーバを仲介してメールのやりとりが行われる

SMTPサーバをポストのような位置付けで考えるとわかりやすい)

 

PHPのサービスからメールを送信する仕組み

フォームの送信ボタンをクリック

PHPプログラムがメールを作成した上で、作成したメールを「メール送信プログラム」に渡す

「メール送信プログラム」がSMTPサーバーに接続し、メールを送信

メール送信完了

 

つまり、

PHPプログラムからいきなりSMTPサーバにメールを送りつけるのではなく

一度「メール送信プログラム」介してから、メールが送られる。

 

メール送信プログラムにはいくつか種類があるが、Mac OS Xには

postfix」という、名称のメール送信プログラムがインストールされている。

 

そこで、メールを送れるようになるには、

postfix」の設定をいじる必要がある。

 

設定の仕方は、http://adcomsoft.jp/acs_dev/2017/06/28/mac-mamp-%E3%81%8B%E3%82%89-%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1/

 

(用語)SMTPサーバーとは

メールを送り先に移動させる機能を持つコンピュータ

https://wa3.i-3-i.info/word1131.html

 

簡単なメモではありますが、こんな風に自分なりにまとめたことで、

PHPのプログラムで作成したメールは、いきなりSMTPサーバーに送られるのではなく

postfix」といったメール送信プログラムに送られるので、

postfix」の設定をしてあげる必要があるということがわかりました。

 

しかし、MAMPのメール送信設定などでいくつかサイトを調べたのですが

「 Permission denied」に苦しめられ、まだ設定完了までいっていません。

 

煮詰まった頭で考えてもしょうがないので、いったんpostfixのことは忘れて

先に機能の実装を済ませてから、再チャレンジしようと思います・・

ググったこと

phpのヒアドキュメント

長い文字列を変数に代入したり、出力する際に便利!!

↪︎使い方(例)

<?php

$変数 = <<<〇〇(終了合図の文字列)

文字列を記述

〇〇(終了合図);

?>

参考URL:PHPの基本構文「ヒアドキュメント」 - PHP入門 - Webkaru

 

mb_send_mail 関数

使い方:mb_send_mail(送信先, 題名, 本文, ヘッダ);

送信先には送信先のメールアドレスを文字列で指定する。

ヘッダにはメールヘッダに追加する文字列を指定。このメールヘッダに送信元のメールアドレスなどを指定する。メールヘッダーに指定できる文字列は以下の通り。

From: 送信元メールアドレス

Reply-to: 送信元メールアドレス

CC: CCで送信する送信アドレス

BCC: BCCで送信するアドレス

参考URL:PHPでメール送信を行う方法:mb_send_mail() | UX MILK

まとめ

今日は勉強ペースおち気味でしたが、明日は気持ちを切り替えて、

パスワード変更機能を無事実装してみせます!!

予想はしてたけど・・エラー祭りでぐったり・・

f:id:iolwloi:20191007233247p:plain

こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ 略して「プロプロ」

あんまん(@aaii0123)です。

 

今日はタイトルの通り、ぐったりしております・・笑

 

ログアウト機能・退会機能と処理がシンプルな機能の実装が続いたので

なかなか調子よくきていたのですが、プロフィール編集機能に入ってたくさんのエラーによる洗礼を受けました・・

 

1個1個は小さなエラーだったのですが、数十分悩んで原因がスペルミスだった時の

脱力感がハンパない・・(しかも、ほぼこのパターン)

 

また、エラーでは引っかからなかったけど書き方のところでいくつか記載を間違えたり書き忘れがあったり・・

 

プロフィール編集機能に関しては明日もう一度復習してから先に進もうかなと考えています。

 

昨日までは、けっこう調子よくきていたので

うおおおお、めっちゃ楽しいいいいいいいい

て感じでしたが、今日はエラー祭りで

なんで・・・なんで動かないの・・・私、向いてないの・・・

ってなって、さらに原因がスペルミスだった時には

チーーーーーーン(やる気終了)

 

なかなかに情緒不安定(笑)

 

それでも、エラーが起きた時の原因がどこにあるのかを推測するスキルは鍛えられている感じはします。

 

さて、前置きが長くなりましたが今日の進捗です。

 

取り組んだこと

・メモを取りながらのプロフィール編集機能のコード写経

・メモを見ながらのプロフィール編集機能実装

 

最初は、昨日に続いてメモを取りながら正解コードの写経を行い、

少し時間をおいてから、実装にチャレンジ。

 

久しぶりにコードが多いのでエラーがたくさん出そうだなと昨日予言しておりましたが、

本当にその通りになりましたw

 

エラーの何が辛いって、やる気が削がれることだと個人的には思うのですが、

今日はたくさんエラーが出た分、やる気もたくさん削がれたので

かなり気持ち的な消耗が激しいです笑

つまずいたこと(たくさんあるので2つピックアップ)

今日は細々したエラーやミスがたくさんあり、

(中にはすぐ解決できたものもあったので全ては覚えていませんが)

どんなミスをしたのか覚えで残しておこうと思います。

 

・関数名のスペルミス

データベースから情報を取ってくる際、queryPost関数を使ってデータベースにアプローチしていますが、

queryPostになんらかの問題がある旨のエラーが出ました。

 

queryPostに問題があるということは、

SQL文やデータベース接続関数に記載ミスがあるかもしれないと思い、

目を皿のようにして1文字1文字確認するも、問題があるようには思えず・・

 

すでにかなり消耗していたため、

もうダメだ・・・才能ないんや・・

と不貞腐れて30分ほど休憩してから再度確認するも解決できず。

 

queryPost関数に問題があるってエラー出てるけど、そんなもんないよ・・

なんか私の思いもよらないところで影響が出てるのかな

という思いが頭をよぎった時、ついに見つけました

 

「queryPost」が「quetyPost」になってるーーーーー

 

queryPostに問題があるってエラーは間違ってなかったんだね(当たり前だけど)

危うく才能がないのかと諦めかけましたがなんとか解決できました。

 

SQL文の選択ミス

プロフィール編集画面から、情報を上書きする際のSQL文に

INSERT INTO 〜

をはじめ使ってしまっていたんですが、

ユーザー登録時にすでにデータベースに登録している情報を上書きするので

UPDATE テーブル名 SET 〜

を使うのが正しいですよね。

 

ここは、画面表示がうまくいかなくて色々試している時に自分で気が付いたので

エラーで引っかかることはありませんでしたが、

正しいSQL文を最初に選択できるようにならないとダメだよなと、思いました。

 

まとめ

今日はなんだかとっても疲れました(←)

が、なんとかエラーは潰しきれたのでよかったです。

 

明日は、プロフィール編集機能のコードをもう一度復習で書いてから

パスワード変更機能にうつろうと思います!!

退会機能もあっさり!次の関門はプロフィール編集機能!!

f:id:iolwloi:20191006234532p:plain

こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ 略して「プロプロ」

あんまん(@aaii0123)です。

 

数日前は10月とは思えないほどの夏日だったのに、

今日はうって変わって、東京は秋らしい涼しい気候でしたね!

 

連日の猛暑に体が慣れてしまったのか、それとも私が寒がりになったのか、

今日くらいの気温だと、過ごしやすいを通り越して既に寒いと感じます笑

 

暑いのも苦手なのですが、これからどんどん寒くなっていくと思うと

それはそれで思いやられるなぁ・・

 

あったいお風呂に浸かって乗り越えようと思います笑

 

さて、今日の進捗です。

 取り組んだこと

今日はこんなことに取り組みました!

・ユーザー登録後のログインをスキップしてマイページに遷移させる対処のエラー解決

・メモをとりながら退会機能のコード写経

・退会機能の実装

・メモをとりながらプロフィール編集機能のコード写経(途中)

 

ユーザー登録後のログインをスキップしてマイページに遷移させる対処のエラー解決

まずは、昨日宿題で残っていたエラーの対処をしました。

一晩たって、自然と治ってたりしないかな、なんて思いながら

念の為、挙動を確認したところ、無事昨日と同じエラーが(当たり前)

 

表示されたエラーをググったり、コードの怪しそうな部分を睨んだり

色々試して、数分で書き間違いに気がつきました。

複雑なエラーではないという直感が当たっていて何より笑

 

最初の頃に比べてだいぶエラーの原因に対する嗅覚が磨かれてきたことを感じます。

 

メモをとりながら退会機能のコード写経。そして実装。

続いていつものようにまずウェブカツの動画を視聴しつつ

退会機能のコードをメモで処理の流れを書き出しながら写経。

 

処理がシンプルということもありますが、実装にだいぶ慣れてきたおかげか、

なんとなくこんな流れで実装すればうまくいきそうだな、

予想しながら動画を視聴している自分がいて、

ちょっとずつとはいえ、1ヶ月前に比べて我ながら成長したなとしみじみ・・

 

退会機能も処理としてはシンプルなので、メモもすくなくすみました。

退会機能実装の流れ

 

共通変数・関数の読みこみ

認証関数の読込み

 

POST送信のチェック

POST送信があればデータベース接続

指定したユーザーIDのデリートフラグに1をたてる

 

クエリ実行が成功であればセッションを削除し

ログインページへ遷移する

 そして、メモをとり終えてから少し時間をおいて

正解コードは見ずにメモだけを見て自力でコードを書きました。

 

エラーも出ることなくこちらも、順調に実装完了♪

 

メモをとりながらプロフィール編集機能のコード写経(途中) 

退会機能も特にエラーにつまずくことなく実装ができ、なかなか快調だったので

プロフィール編集機能にも着手しました。

 

こちらは、まだメモをとりながらの写経の途中ですが、

ログアウト・退会機能に比べるとコードの量が多くてエラーがたくさん出そうな予感笑

 

まだ作成途中ですがこちらのメモも晒します

プロフィール編集機能の実装の流れ

Function.php

ユーザー情報を取得する関数

 データベースへ接続し、ユーザー IDの情報が合致するカラムを取得(全部)

 クエリ実行が成功しているかどうかデバッグで確認

 クエリ結果の値をfetchで取得して返す

フォーム入力保持関数

 グローバル変数$dbFormDataを指定

 ユーザーデータがあり、フォームにエラーがあり、POSTにデータがある場合POSTの情報を返す

   ユーザーデータがあり、フォームにエラーがあり、POSTにデータない場合、DBの情報を返す

 ユーザーデータがあり、フォームにエラーがあり、POSTにデータがありかつDBの情報が違う場合、POSTの情報を返す

 ユーザーデータがあり、フォームにエラーがあり、上記に該当しない(そもそも変更されていない)場合、DBの情報を返す

   ユーザーデータがない場合、POSTの情報を返す

 

profEdit.php

getUser関数を使い、変数$dbFormDataにデータベースから取得したユーザー情報を入れる

POST送信されていれば変数にユーザー情報を入れる

DBの情報とPOSTされた情報を比べて違いがあればバリデーションチェック

DB接続

レコード更新

マイページ遷移

関数が増えるとやはり少し複雑に感じますね。

それでも、初見に比べたらだいぶ落ち着いて処理の流れを読み取れるようになりました

ググったこと

lastInsertID()

PDOオブジェクト実行直後、SQLINSERTされた値のIDを取り出すことができる

 

機能実装の処理がシンプルだったので、今日はググったことも少なめです。

学んだこと

・ユーザー登録時のEmail重複チェックに対し、一度退会したEmailは登録できるようにする方法

バリデーションのDB接続時のSQLにデリートフラグが0である場合の条件を加える

DB側でもEmail重複登録が可能な状態にする

 

DBの情報を上書きするSQL

UPDATE テーブル名 SET カラム名

 

name属性のないinputタグはPOSTに情報街はいらないので注意

 

・登録されているテーブル内のインデックスを表示するSQL

show indexes form テーブル名

 

DBに付したインデックスを削除するSQL

alter table テーブル名 drop index インデックス名

まとめ

明日はプロフィール編集機能のメモを作って実装までいきたいと思います!

今日はこの数日のわずかな期間にも成長を感じました。

やっぱり反復練習は人を裏切らないんだなぁ・・

 

明日も頑張ります!!

ログアウト機能実装完了

f:id:iolwloi:20191006000606p:plain

こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ

略して「プロプロ」

あんまん(@aaii0123)です。

 

オリジナルWEBサービスに着手してから、1週間が経過しました。

この調子だと、完成までにあと2週間くらいはかかるかなぁ・・(遠い目)

 

焦ってやってもしょうがないのスタンスでやっているので

無理にペースアップはしませんが、早く次のステップに進みたいなと

気持ちばかりがはやる今日この頃・・


今は着実にできることを増やしていくことにフォーカスして頑張りたいと思います。

 

さて、今日の進捗です

取り組んだこと

今日はこんなことに取り組みました!

・ウェブカツの動画を視聴しメモを取りながらログアウト機能のコード写経

・メモをみながらのログアウト機能実装

・head、headerの外部ファイル化

・マイページ遷移の無限ループ対処

・ユーザー登録後、ログインをスキップしてマイページに遷移させる対処

・仮のマイページ作り

 

ログアウトは画面表示がなく、

処理としてはセッションを削除してログインページに遷移させるだけなので

かなりあっさり実装することができました!

(エラーは出たけど!!)

 

むしろそれ以外(無限ループ対処など)の方がずっと時間がかかってる^^;

 

また、この段階でheadとheaderを外部ファイル化したので、

とりあえずヘッダーの部分だけある、仮のマイページも作成しました!(こんな感じ)

f:id:iolwloi:20191006002711p:plain

(先日、スクリーンショットが保存できないとぼやいたのですがOSをアップデートしたら無事保存できるように笑)

ヘッダー以外のところが空白で寂しかったので、背景も仮で指定w

 

機能の実装をはやく終わらせて、もっと見た目にもこだわりたい・・ 

ググったこと

basename関数

パスからファイル名を取得する関数

接尾語を指定した場合は、接尾語を除いたファイル名を返す

https://webkaru.net/php/function-basename/

 

$_SERVER['PHP_SELF']

$_SERVER は、ヘッダ、パス、スクリプトの位置のような 情報を有する配列

'PHP_SELF’キーは、現在実行しているスクリプトのファイル名をパスで返す

https://www.php.net/manual/ja/reserved.variables.server.php

 

lastInsertID

PDOオブジェクト実行直後、SQLINSERTされた値のIDを取り出すことができる

 

少し前まではPHPのマニュアルって読みづらくてすごく苦手意識があったのですが

わからないことを何度もググっていくうちに、抵抗感がなくなってきました!

 

徐々に公式のドキュメントへの苦手意識を克服して、より正確な情報源から情報をとれるようになっていきたいです。

学んだこと

・マイページが無限ループになるバグへの対処

ログイン認証後、マイページに遷移させる処理に制限をかける

具体的には

ログイン認証がされた際の実行中のファイルがlogin.php(新規ログイン)である場合にのみマイページに遷移させるようにする

 

・ユーザー登録後、ログイン処理を経ずにマイページへ遷移(ダイレクトにマイページへ遷移)させる処理

マイページへ遷移する前にセッションに情報を詰める

具体的には

最終ログイン日時とログイン期限時間を更新し、DBからとってきたユーザーIDをセッションに詰める

明日の宿題

ユーザー登録後のログインをスキップしてマイページに遷移させる対処のところで

エラーが解消できず、まだ完成できてない状態です^^;

 

エラーもそんな複雑な内容ではないので、おそらく簡単なミスだと思うのですが

今日中には潰せず・・

 

明日、朝起てスッキリした状態の頭でリトライしたいと思います!

まとめ

今日は細々とした処理に取り組みました!!

書くべきコードが少ないとやっぱり心理的な負担がだいぶ軽いですね

 

明日は、今日潰せなかったエラーを潰して退会機能の処理に着手したいと思います!! 

ユーザー登録・ログイン機能の実装完了

f:id:iolwloi:20191003104959p:plain

こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ

略して「プロプロ」

あんまん(@aaii0123)です。

 

昨日は夜に用事があって帰宅が遅くなり、ブログの更新ができなかったので

今日は、昨日の分とまとめて2日分の報告をします!!

 

 取り組んだこと

この2日間で、ここまで進めることができました!

・ユーザー登録画面の見た目の調整

・ユーザー登録機能のエラーチェック

・メモをとりながらのログイン機能のコード写経

・メモを見ながらのログイン機能の実装

・ログイン機能のエラーチェック

 

ユーザー登録画面の見た目の調整

前回(一昨日)のブログ投稿時に書いた通り、

ユーザー登録機能の実装はなんとかできたものの

CSSの指定をしていなかったため、本当に酷いありさま・・

 

この段階であまり見た目に時間をかけたくない、でもそれにしても酷い

ということでマックス2時間と時間をきめてCSSと格闘することに

 

ですが、トライするとかなりCSSを忘れてしまっていたことが判明し

なかなかの苦戦をしいられました・・

 

結局、この段階ではウェブカツのコードを借りてエラーのチェックなどの際、最低限ストレスがない状態にすることに・・

不甲斐ないーー;;

 

見た目は今回、少しでもオリジナリティを出したいと思っているので、

機能が全て完成したらCSSの特訓がてら、もう少し頑張りたいと思います。

 

ユーザー登録機能のエラーチェック

見た目はなんとか整ったので、続いてエラーのチェック

今回から、PHPの構文チェックはVScodeで行うことにしました。

 

本当は記述もVScodeに統一したほうがいいのかもしれませんが

Bracketsをかなり気に入っているため、

メインでBracketsを使いPHPの構文をチェックしたい時だけVScodeで表示させるという荒技^^;

 

VScodeは評判の通り、立ち上がりも早いし文法ミスがあるところは波線で表示されるためわかりやすい!!

軽微な文法ミスはVScodeのおかげでかなり速く潰せるようになりました!

 

文法ミス以外のエラーも大きなものはなく、ググって解決できるものがほとんどで

メンタル的にはだいぶ楽でした笑

 

メモをとりながらのログイン機能のコード写経

ユーザー登録機能が大方問題なさそうだったので、ログイン機能に以降。

ウェブカツの動画試聴とコードの写経をしながら

処理の流れをメモに書き出しました。

 

そのメモがこちら 

ログイン機能実装の流れ

Function.php

デバッグ

 変数デバッグフラグをtrue指定

 デバッグログ関数(デバッグフラグが空でなければエラーログに吐き出す)

セッション

 

 セッションファイルの置き場を変更(保存期間を延ばすため)

 セッションの有効期限を設定

 クッキー自体の有効期限を延ばす

 セッションを使う

 現在のセッション IDを新しく生成したものと置き換える

画面表示処理開始ログ吐き出し関数

 デバッグ 

 

auth.php

ログインしているかのチェック(セッションのlogin_dateが空じゃないか)

デバックでログイン済みユーザーと出す(空だったら未ログインユーザーと出す)

現在日時が最終ログイン日時+有効期限を超えているかのチェックをする

  超えていればセッションを削除しログインページへ遷移

  超えていなければ最終ログイン日時を現在日時に更新しマイページへ遷移

セッション自体ない(未ログインユーザー)なら後続処理を続ける

 

Login.php

共通変数・関数の読み込み

認証関数読み込み

  既にログインしているユーザーかチェック

POSTされているかチェック

 変数にユーザー情報を格納

  $pass_save変数にはポスト送信の有無によってtruefalseを入れる

バリデーションチェック

 emailの形式チェック

 emailの最大文字数チェック

   パスワードの半角英数字チェック

 パスワードの最大文字数チェック

 パスワードの最小文字数チェック

 未入力チェック

エラーメッセージがなければDB接続しパスワードとid取得

 パスワード照合(DB接続の結果が空でないこととパスワードが一致していることをチェック)

   変数にログイン有効期限(1時間)を格納

     最終ログイン日時を現在日時に

  ログイン保持にチェックがあるか確認

   チェックがあればログイン有効期限を30日にセット

   チェックがなければログイン有効期限を1時間後にセット

  DB接続でとってきたユーザーIDをセッションに格納($resultの配列のid)

  マイページに遷移

    パスワードが一致していなければエラーメッセージを格納

 処理の流れを言語化することでかなり頭に入ったような気がする〜

 

ログイン機能ではセッションが使われているので、再度

セッションとは一体なにもので、実際に使う際にはどのような処理が必要なのかの

復習をすることができました^^

 

ちなみにセッションのphp_iniへの設定の書き方って覚える必要あるのかしら・・

 

基本プログラミングは暗記する必要はないっていうけど、

実際の現場でどこまで求めらるものなのかが感覚的にわからないのが未経験者の辛いところですね・・

個人的には、少なくともセッションに関するphp_iniへの設定は

どんなことをしているのかさえ理解していれば丸暗記する必要はないかな、と判断して次に進むことにしました。

メモを見ながらのログイン機能の実装

メモと写経が完成したので、休憩がてら1時間ほど散歩してからログイン機能の実装に着手。

メモで処理の流れは確認できるとは言っても、まっさらな状態から1からコード書くのは緊張します^^;

 

しかし、その日のうちにアウトプットしたからか思ったよりもすんなりかけました。

なんだかんだでこの1ヶ月の間に同じコードを4回くらい書いているので、流石に身についたのかしら・・

 

もちろん書き間違いもところどころありましたが、エラーのチェックも含めて

思いの外、順調に進み成長を感じました!!

 

ググったこと

ini_set関数

ini_set関数を使えば、PHPコードの中でphp.iniの設定を変更することができる。

1引数に与えた設定オプションを、第2引数の値に設定する

PHPの処理が終了すると元の値へ戻される)

password_verify

パスワードがハッシュ値に適合するかどうかを調査する関数

第一引数には認証する文字列を指定、第二引数では暗号化済みの文字列を指定

参考URL:https://qiita.com/MasaKuuuu/items/51552aa0331f3ae90dae

書き方のミスがあったところ

if文のショートハンドの書き方

× if(!empty($_POST['pass_save'])) ? true : false;

○ (!empty($_POST['pass_save'])) ? true : false;

※ショートハンド記法の際は頭にifはつけない

 

・fetch関数の書き方

× $result = $stmt->fetch(PDO::ASSOC);

○ $result = $stmt->fetch(PDO::FETCH_ASSOC);

 

実録!本当にあったこんなミス!!

自分でも笑っちゃうようなミスがあったので、今後繰り返さないために

覚えで残しておきます^^;

 

ユーザー登録機能のエラーチェックをしている際、

Emailが重複しているにも関わらず、DBに登録されてしまうという挙動を発見しました。

 

エラーも出ておらず、どうやらSQLのミスでもない。

バリデーション関数の記載に目を凝らしても、正解のコードと照らし合わせてみても

書き間違っている部分もどうやらなさそうだ。

それでも、意図せずEmailの重複チェックがスルーされてしまう問題に数10分を費やしました。

 

怪しそうなところをどんなに眺めても解決策が見えず、何気なく別の箇所に目をやると

そこで初めて気がつきました

 

Email重複チェックの関数の呼び出し自体をしていない・・

 

そりゃどんなに、関数の記載ミスを探しても見つからないわけですね^^;

早速、関数の呼び出しの記載を追加して試してみたところ、無事にエラーが表示され解決できました。

 

こんなアホなミスもあるもんだなと、1つ学びました・・笑

まとめ

全体的にコードを書くのが早くなってきて嬉しい限りです。

やっぱりできることが増えると楽しい・・!

 

明日は、ログアウト機能に取り組みます〜〜!

 

 

ユーザー登録機能の実装続き

f:id:iolwloi:20191003104959p:plain


こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ

略して「プロプロ」

あんまん(@aaii0123)です。

 

10月に入ったというのに、日中はまだまだ暑い日が続いていますね!

 

夜はだいぶ涼しくなって過ごしやすくなりましたが、

日中はPCを打ってると、PCの熱で手汗がやばいです笑

 

さて、今日の進捗です!

今日取り組んだこと

・ユーザー登録機能の実装続き

・ユーザー登録画面の見た目調整(途中) 

です・・!

なんとかコードは書き終わって、見た目の調整に入りました。

ユーザー登録機能の実装続き

昨日に続いて、PHPのユーザー登録機能の実装に取り組み、

なんとか、機能のコードは完成しました。

(エラーのチェックはこれから)

 

昨日に続いて、メモをとりながらの勉強法。

本日追加したメモはこんな感じです。(赤字が追加)

 

ユーザー登録機能実装の流れ

 

ログを取る指定

エラーメッセージの指定(define(定数)で指定)

エラーメッセージ格納用の配列

関数

 バリデーション

  未入力

  Email形式チェック

  Email 重複チェック

   $emailキーを入れる

   データベースに接続する (try catch)

           try

    データベース接続関数を呼び出す

    SQL文作成

    クエリ作成

        SQLプレースホルダに情報を流し込む

    クエリ実行

    クエリ結果の値を取得 (実行したクエリからfetchメソッドを使って取り出す)$result = $stmt->fetch(PDO::FETCH_ASSOC)

          catch

           エラーログにエラーメッセージを表示させる

    エラー変数にエラーメッセージを格納

  同値チェック

  最小文字数チェック

        mb_strlen関数を使って$strの文字数をカウントする

  最大文字数チェック

  半角チェック

 DB接続関数

  DBに接続する準備

  (DB(’mysql:dbname=〇〇;host=localhost;charset=utf8’)、DBのユーザー名、DBのパスワードを指定)

  オプションを配列形式で指定する

  PDOオブジェクトを生成してそのオブシェクトを返す

 クエリーポスト関数

  プリペアードメソッドでクエリを作成する

       Executeでクエリを実行 

POST送信されているか

 POST送信されていれば変数にユーザー情報を代入

 未入力チェック

   エラーメッセージが空であればバリデーションチェック

     Email

   形式チェック

   最大文字数チェック

   最小文字数チェック

  パスワード

   半角英数字チェック

   最大文字数チェック

   最小文字数チェック 

      パスワードとパスワード再入力があっているか

  DB接続してDBに情報を格納(try catch)

  マイページへ遷移

昨日の段階で、けっこう進められていたので

今日の分は少なくすみました^^

 

そして、出来上がった画面がこちら

f:id:iolwloi:20191002234316j:plain

(なんどもトライしているのですが、なぜかスクリーンショットが保存できず、

 PC画面の撮影という残念な感じ・・なんとかしたい苦笑)

 

圧倒的にダサい・・

 

本当に最低限のhtmlしか書いていないので、

非常に残念な見た目です^^;

 

この段階で見た目に時間をかけるよりゴリゴリ機能の実装を進めた方がいいのではとも思いつつ、

これだとさすがにあんまりでモチベーションが上がらない(笑)

ので、続いてCSSに着手しました。

ユーザー登録画面の見た目調整(途中)  

実際に着手してみてわかったのですが、

けっこうCSS忘れてる・・

 

こうなることが怖くて、『HTML/CSSモダンコーディング』の写経を

PHPの勉強と並行してずっとしてきたはずだったのですが、

それでも、自分でいざやってみようと思うと頭真っ白・・

 

やっていくうちに思い出すだろうとは思うのですが、結構ショックでした。

 

先ほども書いた通り、今はあくまでもPHPのアウトプットがメインなので

CSSにかける時間は決めておいて時間オーバーになるまでは

頑張って思い出そうと思います。

ググったこと

・PDOオブジェクトのexecuteメソッド

プリペアードステートメントを実行するもの。

外部から来る入力値をSQLに使う場合などは、SQLインジェクションのリスクがあるため、まずprepareSQLをセットして、executeで実行をする2段構えの構造で実装するのがいい。

2つもメソッドを呼び出すのが面倒だという場合は、query関数に2つパラメータを渡すことで簡単に使うこともできる。

参考URL:prepareとexecuteで操作 - phpspot

 

まとめ

HTML/CSSは今後特に使いこなしていきたいと思っていたので、

忘れてしまっていたことに正直ショックを受けましたが

忘れたならまた思い出せばいい!ということで・・笑

 

明日は、CSSは MAXで2時間にして、

そのあとエラーのチェックをして、

できれば次の機能の実装にうつりたいと思います。

 

今日もお疲れさまでした^^

メモをとる勉強法を取り入れてみた

 

 こんにちは。

文系出身でも・未経験でも・プロのプログラマーを目指すブログ

略して「プロプロ」

あんまん(@aaii0123)です。

 

昨日は、誕生日だったのですが、

ドイツ在中の友人が夜に電話をくれて盛り上がってしまい

気づいたら夜中の1時でした・・

 

そのため、昨日の学習報告をササットまとめます。

 

昨日取り組んだこと

・ユーザー登録機能実装(途中)

自作サービスの方もいよいよ機能の実装に入り

手始めにユーザー登録機能から着手しました。

 

昨日、ウェブカツのコードを写経した部分ですね。

昨日写経した内容を思い出しながら自力でコードを書く練習をしました。

 

取り入れてみた勉強方法

ここで、昨日から新しい勉強法を取り入れてみることにしました。

題して、

実装の流れを文章化する勉強法!!

 

・・いや、まぁそのままなんですけどw

 

いざ、ユーザー登録機能を実装するコードを書こうとしても

いきなりすぎてコードを思い出す糸口が何にもない状態だということに気がつきました。

 

そこで、まずユーザー登録機能の実装の流れをメモで書き出してみて、

そのメモをみながら順番にコードを書いてみることにしたのです。

 

そのメモがこんな感じ。

 

ユーザー登録機能実装の流れ

 

ログを取る指定

エラーメッセージの指定

エラーメッセージ格納用の配列

関数

 バリデーション

  未入力

  Email形式チェック

  Email 重複チェック

   データベースに接続する 

    データベース接続関数を呼び出す

    SQL文作成

    クエリ作成

    クエリ実行

    クエリ結果の値を取得

  同値チェック

  最小文字数チェック

  最大文字数チェック

  半角チェック

 DB接続関数

  DBに接続する準備

  オプションを配列形式で指定する

  PDOオブジェクトを生成してそのオブシェクトを返す

 クエリーポスト関数

POST送信されているか

 POST送信されていれば変数にユーザー情報を代入

 未入力チェック 

DB接続

レコード挿入

マイページへ遷移

こんな感じで最初にできるだけ細かく実装の流れを書き出してみました。

そのうえで、Bracketsの並列表示機能で正解のコードを横に並べた状態で

メモをみながらなるべく正解コードをみないようにしつつコードを書き

詰まったら、サッと目線を滑らせて正解コードを確認して

詰まった部分をさらにメモに加えるということをしてみました。

 

まだ実装自体が途中なので、最後までいってませんが

メモを追加したのがこちらです。(赤字が追加した部分)

 

ユーザー登録機能実装の流れ

 

ログを取る指定

エラーメッセージの指定(define(定数)で指定)

エラーメッセージ格納用の配列

関数

 バリデーション

  未入力

  Email形式チェック

  Email 重複チェック

   $emailキーを入れる

   データベースに接続する (try catch)

    データベース接続関数を呼び出す

    SQL文作成

    クエリ作成

        SQLプレースホルダに情報を流し込む

    クエリ実行

    クエリ結果の値を取得

    (実行したクエリからfetchメソッドを使って取り出す

      $result = $stmt->fetch(PDO::FETCH_ASSOC)

  同値チェック

  最小文字数チェック

         mb_strlen関数を使って$strの文字数をカウントする

  最大文字数チェック

  半角チェック

 DB接続関数

  DBに接続する準備

  DB(’mysql:dbname=〇〇;host=localhost;charset=utf8’)、DBのユーザー名、

   DBのパスワードを指定)

  オプションを配列形式で指定する

  PDOオブジェクトを生成してそのオブシェクトを返す

 クエリーポスト関数

POST送信されているか

 POST送信されていれば変数にユーザー情報を代入

 未入力チェック

エラーメッセージが空であればバリデーションチェック

 Email・パスワードに対してそれぞれ

DB接続

レコード挿入

マイページへ遷移

 

後から見返すとどこが途中で書き加えたメモなのか記憶が曖昧になってしまってますが

こんな感じで、実装しながら自分の理解が足りてない部分を洗い出していく感覚で進めました。

 

新しい勉強法の感触

まだ、始めたばかりですがこれはなかなかいい勉強法なのではないかと思っています。

 

まだまっさらな状態からコードを書くのはさすがにきついし、

しかも、自分でも何がわかっていて、何が曖昧なのかもはっきり把握できていない。

 

そんな感じなので、文章に書き起こしてみてわからなかった部分を書き足していくのは

頭を整理することや記憶の定着にも繋がる予感がします。

 

ユーザー登録機能は、最初にコードを写経してからこの作業に移りましたが

次の機能からは写経の段階でメモ書きして

実装はいよいよ自力でやってみる、という流れに変えようと思います!

 

ググったこと、学んだこと

昨日、ググったり、色々試してみて新しく学んだことを

まとめます。

ググったこと

fetch(PDO::FETCH_ASSOC)

 PDOクラスのfetchメソッドを実行し、引数のPDO::FETCH_ASSOCによって、

 列名を記述して配列で取り出す設定をしている。

    fetch:取り出す。Assoc:Associationで、連想する(=連想配列で情報を取り出す)

PDOについて

 アプリケーションとDBMS(データベース管理システム)の間に入ってDBMSの違い

 を意識せずにアプリケーションを作成するもの。

 つまり、色んなデータベースがあるけど、同じ様に書いても全部のデータベースに対

 応できるようにしてくれる

 参考 URL:PDOで接続、SELECT、プリペアドステートメントとは(PHPでMySQLに接続) - Qiita

PDOオブジェクトのプリペアードメソッド

  prepareメソッドはプリペアドステートメントと呼ばれるものを利用するための関 

 数。

 プリペアードステートメントとは、SQL文を最初に用意し、その後はクエリ内のパラ

 メータの値だけを変更してクエリを実行できるようにする機能。

 参考URL:PDO prepare プリペアドステートメントの使い方 | PHP入門~bituse~

学んだこと

・Git Hubのプッシュについて

 新しくgit init でファイルを作った場合は

 「.git/config」の[remote "origin”]URLパスを指定してからプッシュする。

 (そうしないとエラーが出る)

まとめ

今まであまりメモを活用していなかったのですが、

ブログを始めてから何かとメモで残すようになり

結果的に勉強にもプラスになっていることを感じます!

 

メモのとりかた自体もまだ下手くそですが、継続することで

自分でももっといいやり方が思いつくようになると信じて

引き続き、ブログの更新とともに頑張ります!!