【プログラミング学習】初心者OLがウェブカツ!!WEBサービス部を1周終えて、わかったこと。

スポンサーリンク

はじめに(自己紹介含みます)

はじめまして、yuhです。プログラミング初心者のアラサーOLです。IT企業を転職し、今はとある会社の社内SEをしています。私は何度かプログラミングスキル習得の為にトライした過去があるのですが、挫折してしまいました。そんな途中でやめてしまったプログラミング学習を再開した理由は、「場所や時間にとらわれずに自由に仕事がしたい」と「もっと稼ぎたいな〜」という気持ちです。ちなみに、プログラミングは初心者レベルです。🐤

※このブログは、オンラインプログラミング学習サービス「ウェブカツ‼︎」の進捗報告用のブログです。ちなみにアフェリエイト記事ではありませんので、気軽にお読みください。

前回までのお話はこちらです。

さて、ウェブカツでのプログラミング学習ですが、
2か月経ったので、今の進捗状況を書きたいと思います!

プログラミング学習:進捗状況

WEBサービス部のLESSON22~最後まで1周完了しました。先輩方のQAがかなり役立ちました。大体詰まった時はQAで同じような方がいたので、ヒントとなる回答を手掛かりにコードやDBを修正することで解決できました。でも1つのLESSONに2日、3日はかかっていたと思います。難しい部分もありますが、動画通りに進めれば多くの知識が得られているはずなので、前向きな気持ちで日々続けていました。

WEBサービス部を1周終えて理解したこと

WEBサービス部のPHP処理で理解するのに時間がかかったところがあります。
今回の記事ではセッションとDB接続に関するコードについて、まとめてみました。

クッキーとセッションについて

クッキー(Cookie)とセッション(SESSION)の違い

まずWEBサービスでは、ユーザを識別する際に「クッキー」と「セッション」を使うことを学びました。HTTPは状態を保持できないプロトコルなので、WEB上で同じユーザかを判断したいとき等、クッキー(Cookie)とセッション(SESSION)を使ってあげることになります。

クッキーとはサーバーが発行して、クライアントのブラウザ側で保持される値です。セッションとはサーバー側で保持される値です。
クッキーはブラウザ側にあるので、悪意のあるユーザーが改ざんできてしまいます。なのでログイン情報はセッションで保存し、クッキーには保存しないようにします。クッキーで保存するのはログイン出来たという事実のみです。
SNSでよくある一度ログインしたら次回からログイン済みになる仕組みは、クッキーを使用しています。
また、セッションにはIDが降ってあり、ブラウザ側はIDのみを管理しています。(中身のデータは見えません。)このIDはセッションIDとよびます。
セッションの中身はサーバーにあるので、取り出したいときはセッションIDを指定してサーバーから中身のデータを取り出します。

セッションの開始

セッションを使うには、「$_SESSION」というスーパーグローバル変数を使用します。セッション機能を始めるときにはsession_start関数をまず書きます。session_start関数はブラウザのクッキー情報に基づき、セッション変数を復元させます。

//セッションを使う
session_start();

セッションの削除

ログアウトするとき等、セッションを削除したい場合は以下のようにします。

// セッション変数を全て解除する
$_SESSION = array();

// 最終的に、セッションを破壊する
session_destroy();

$_SESSION = array();は、セッション変数を破棄、session_destroy();はサーバー側にセッションIDを削除しています。

セッションの寿命延ばし

セッションはsession_start()が行われた時に、1/100の確率で24分より古いセッションが削除されます。なので、「24分より古いセッション」の部分を変えることでセッションの寿命を伸ばすことができます。

以下の処理で、セッションを準備⇀開始⇀更新しています。

//セッションファイルの置き場を消えない場所に変更
session_save_path("/var/tmp/");
//ガーベジコレクションが削除するセッションの寿命を延ばす(60秒×60分×24時間×30日)
ini_set('session.gc_maxlifetime', 60*60*24*30);
//ブラウザを閉じてもセッションが切れないようにしたい場合はクッキー寿命も変更する
ini_set('session.cookie_lifetime', 60*60*24*30);
//セッションを使う
session_start();
//現在のセッションIDを新しく生成されたものと置き換える(なりすまし対策)
session_regenerate_id();

ログイン保持のためのセッションの使い方

セッション変数$_SESSION[‘login_date’] と$_SESSION[‘login_limit’]を足した値が、現在時刻を超えていないかで有効期限内であるかを判断します。
・$_SESSION[‘login_date’] = DBに登録されてあるログイン日時
・$_SESSION[‘limit_date’] = DBに登録されてあるログイン有効期限
・time()関数 = 現在日時を取得する

時間は数値で保存されているので、最終ログイン日時+有効期限の時間が現在時刻より小さいと、有効期限内と判断できます。

//ログイン認証
function isLogin(){
    //ログインしている場合
    if(!empty($_SESSION['login_date']) ){
        debug('ログイン済ユーザです');
        
    //有効期限オーバーの場合
    if( ($_SESSION['login_date'] + $_SESSION['login_limit']) < time()){
        debug('ログイン有効期限オーバーです');
        
        //セッションを削除
        session_destroy();
        return false;
    }else{
        debug('ログイン有効期限内です')
            return true;
    }
    }else{
        debug('未ログインユーザーです');
        return false;
    }
}

PDOを使ったDB操作について

PDOとは、何ですか?

PDOはPHPからDBを操作するときに使う技術のことです。DBによってやり方が違うとなると、DBを変更した場合にコード修正が面倒なのでPDOを使うとよい、らしいです。DB接続の処理のたびにPDO箇所が出てきて、うーん?となったので処理の流れを整理してみました。

PDOを使ってDB操作をする流れ
①connect(接続する)
②prepare(準備する)
③execute(実行する)
④fetch(取得する)

詳しくは以下を参考にできます。
https://qiita.com/mpyw/items/b00b72c5c95aac573b71

Qiita : PHPでデータベースに接続するときのまとめ

自己理解のためにも簡単な備忘として、記載します!

①connect(接続する)

DB接続関数として、汎用的なdbConnect()関数を作っておきます。
$dsnにはデータベース名、ホスト名、文字コードを入れます(DSNといいます。)$userはDBのユーザ名、$passwordはDBのパスワード、$optionは連想配列になっていますね。$optionはなんかややこしいですね~。後述します。

/DB接続関数
function dbConnect(){
    //DBへの接続準備
    $dsn = 'mysql:dbname=sweetslist;host=localhost;charset=utf8';
    $user = 'root';
    $password = 'root';
    $option = array(
    //SQL実行失敗時にはエラーコードのみ設定
        PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT,
    //デフォルトフェッチモードを連想配列形式に設定
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FEACH_ASSOC,
    //バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減)
    //SELECTで得た結果に対してもrowCountメソッドを使えるようにする
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    );
    //PDOオブジェクト生成(DBへ接続)
    $dbh = new PDO($dsn, $user, $password, $options);
    return $dbh;
}

オプション1:PDO::ATTR_ERRMODE
SQL実行でエラーが起こった際にどう処理するかを指定しています。 PDO::ERRMODE_SILENTなので、サイレントです。エラー時に何も報告しません。報告させたい場合はPDO::ERRMODE_WARNINGにしてあげます。

オプション2:PDO::ATTR_DEFAULT_FETCH_MODE
FETCHメソッドで取得する形式を指定します。PDO::FETCH_ASSOCは、カラム名をキーとする連想配列で取得します。通常これでいいらしい。

オプション3:PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
クエリにバッファを使用するかどうかです。SELECT した行数を取得する関数 rowCount() が使えるようになるというメリットがあります。

バッファについてはここを見ました。https://www.php.net/manual/ja/mysqlinfo.concepts.buffering.php

PHPマニュアル:バッファクエリと非バッファクエリ

オプションについては以上です。そして、 $dbh = new PDO($dsn, $user, $password, $options);のところで、詰め込んだ情報を使ってPDOのオブジェクトを生成しています。DBに突入するPDO君を生成!みたいなイメージで理解しました。最後にPDO君を関数の外でも扱えるように、return $dbh;で返してあげます。

②prepare(準備する)と③execute(実行する)

汎用的なクエリ実行関数queryPost()を作ります。
引数$dbhは dbConnect()関数で取得できます。$sqlには呼び出す際に使いたいSQL文を設定、$dataはプレースホルダ用でSQL文の値を補助するよう設定します。

//クエリ実行関数
function queryPost($dbh, $sql, $data){
    //クエリー作成
    $stmt = $dbh->prepare($sql);
    //プレースホルダに値をセットし、SQL文を実行
    if(!stmt->execute($data)){
        debug('クエリに失敗しました');
        debug('失敗したSQL:'.print_r($stmt,true));
        return 0;
    }
    debug('クエリ成功');
    return $stmt;
}

$stmt = $dbh->prepare($sql);にて、PDO君を使ったクエリ準備は完了です。
if(!stmt->execute($data))にて、クエリを実施します。
失敗した場合は「0」を返し、成功した場合はクエリを返します。

④fetch(取得する)

上記の//DB接続関数と、 //クエリ実行関数を準備しておき、DB操作で値を取得したい箇所では以下のような記載をします。

function getProduct($u_id, $p_id){   debug('ユーザーID:'.$u_id);   debug('商品ID:'.$p_id);   //例外処理   try {     // DBへ接続     $dbh = dbConnect();     // SQL文作成     $sql = 'SELECT * FROM product WHERE user_id = :u_id AND id = :p_id AND delete_flg = 0';     $data = array(':u_id' => $u_id, ':p_id' => $p_id);
    // クエリ実行
    $stmt = queryPost($dbh, $sql, $data);

    if($stmt){
      // クエリ結果のデータを1レコード返却
      return $stmt->fetch(PDO::FETCH_ASSOC);
    }else{
      return false;
    }

  } catch (Exception $e) {
    error_log('エラー発生:' . $e->getMessage());
  }
}

return $stmt->fetch(PDO::FETCH_ASSOC);にて、execute(実行)によってDBから抽出したデータを変数にfeach(取得)しています。


PDO::FETCH_ASSOCは、カラム名をキーとする連想配列で取得します。そのほか、FEACH_ALLすべてを取得します。

try&catchの例外処理

DB接続をする場合、try&catchの処理で実行されていました。これは何かといいますと、関数内で何らかのエラーがあった場合の、例外処理を設定できます。エラーがあった場合、例外処理に流れるようにしてあげます。DB操作のPHP処理は正しくても、DBサーバが落ちていた場合など、不測の事態の処理を事前に準備しておくためです。getMessageメソッドを実行することで発生したエラーメッセージを取得することができます。

try {     例外が発生する可能性がある関数(); } catch (Exception $e) {     例外が発生した場合に行う処理;  error_log('エラーメッセージ:' . $e->getMessage());
}

ログイン有効切れの場合はsession_destroy();でセッションを削除します。

プログラミングで稼ぎたい方におすすめのウェブカツはこちらです。
参考:女性割引のあるプログラミング学習スクールウェブカツ!!のURLはこちら

ウェブカツ公式サイト:https://webukatu.com/

プログラミング学習おまけ:OPどうしよ~

WEBサービス部1周目が終わり、やっとOP(アウトプット)作成に入れる~と喜んだのも束の間。手が動かないので「何から始めればいいのか」、「もしかして何も理解できていない?!やり直した方がいい??」とぷちパニックになりました。

OP何作ろ〜かなと悩む。。

WEBサービス部最初の方の動画を見直すと、ワイヤーフレーム作りや、DB構成についてちゃんと説明してあったので、まずは簡単にどんなものを作るか考えてみました。考えた結果、自分の食べたいスイーツを登録して、他ユーザのもお互い見れるようなサイトにしようかなと。もっとほかの案も考えたのですが、複雑になりそうだったので、復習がてら作れそうな機能でまずは作ろうと思っています。11月中完成を目指しています。

ここまで読んでくださりありがとうございます!
次はOPの作成状況を報告できればと思います。ではでは。

コメント

タイトルとURLをコピーしました