---
# System prepended metadata

title: 【InFiNiTO Club】プログラミング講座11回目

---

#  【InFiNiTO Club】プログラミング講座11回目
## 初期準備
### 授業資料のダウンロードと解凍
Teams上にアップロードした資料をダウンロードしてください。
Zipファイルですので解凍してください。

本日使う授業フォルダphp04に入っているもの。
```
cssフォルダ
fontsフォルダ
jsフォルダ
SQLフォルダ
index.php
insert.php
funcs.php
detail.php
delete.php
select.php
update.php
login.php
loguout.php
login_act.php
session01.php
session02.php
session_regenerate_id.php
```
### php04フォルダをMAMPのhtdocs階層に移動させてください。
先ほどCドライブにダウンロードしたMAMPの中にhtdocsというフォルダがあります。
ここに授業資料の「php04」フォルダを移動してください！

## セクション1 本日の授業用DB作成
### SQLファイルからデータをインポートしてみよう
〇〇.sqlというSQLファイルをインポートしてデータを作成します。
#### 1. gs_dbを選択した状態でインポートタブをクリック

#### 2. ファイルを選択をクリックして配布した資料内のSQLフォルダ内のgs_an_table.sqlを選択

#### 3. 実行してみる

#### 4. gs_an_tableが追加されているはずです。

#### 5. 同様にしてgs_user_tableを作成

## セクション２　SESSION基礎
SESSION変数は「サーバー側に変数を保持」することができる技術です。
これまでの変数と違いサーバー側に保存されているので変数値を別のファイルで呼び出すことができます。

### SESSIONを使ってみよう
#### 1.session01.phpに以下を記述
```
<?php
// SESSIONスタート
session_start();

// SESSIONのidを取得
$sid = session_id();

echo $sid;

?>
```
#### 2.session01.phpをブラウザでチェック
idが表示されているはずです。
このデータはブラウザからどこに保存されているかチェックできます。
`検証＞Application＞Cookies＞localhost`
の中にデータがあります。

#### 3.session01.phpのsession_id()の次に以下の処理を追加
```
// SESSION変数にデータを登録
$_SESSION["name"] = "中野";
$_SESSION["age"] = 26;
```

#### 4.session02.phpでSESSION変数に預けたデータを取得
```
// SESSIONスタート
session_start();

// SESSION変数を取得
$name = $_SESSION["name"];
$age = $_SESSION["age"];

echo $name;
echo $age;
```

#### 5.session_regenerate_id.phpの以下の部分に処理追記
`session_regenerate_id(true);//trueが大事！！`

#### 6.session_regenerate_id.phpをブラウザでチェック
ずっと同じsession_idだとセキュリティ的に危険なのでリジェネレイトします。

## セクション３　ユーザー認証の実装
login.phpからlogin_act.phpでログイン処理を経由して判定。ログインユーザーならばselect.phpに遷移、違う場合はlogin.phpにリダイレクト
### ログイン処理を実装
ユーザー情報があったらsession_idをSESSION変数に保存。つまりsession_idがあるのはログインユーザー
#### 1.login_act.phpに以下の記述を追加
```
//最初にSESSIONを開始！！ココ大事！！
session_start();

//POST値
$lid = $_POST['lid'];
$lpw = $_POST['lpw'];
```
#### 2.SQLを準備
```
//2. データ登録SQL作成
$stmt = $pdo->prepare("SELECT * FROM gs_user_table WHERE lid = :lid AND lpw=:lpw");
$stmt->bindValue(':lid', $lid, PDO::PARAM_STR);
$stmt->bindValue(':lpw', $lpw, PDO::PARAM_STR); //* Hash化する場合はコメントする
$status = $stmt->execute();
```

#### 3.処理後のリダイレクト先を設定
```
//5. 該当レコードがあればSESSIONに値を代入
//* if(password_verify($lpw, $val["lpw"])){
if( $val['id'] != "" ){
  //Login成功時
  $_SESSION['chk_ssid']  = session_id();
  $_SESSION['kanri_flg'] = $val['kanri_flg'];
  $_SESSION['name']      = $val['name'];
  redirect('select.php');
}else{
  //Login失敗時(Logout経由)
  redirect('login.php');
}
```

#### 4.funcs.phpにログインチェック関数を作成
```
//ログインチェック
function loginCheck(){
  if(!isset($_SESSION["chk_ssid"]) || $_SESSION["chk_ssid"]!=session_id()){
    exit("Login Error");
  }else{
    session_regenerate_id(true);
    $_SESSION["chk_ssid"] = session_id();
  }
}
```

#### 5.select.phpにログインチェック処理を追加
```
//SESSIONスタート
session_start();

//関数を呼び出す
require_once('funcs.php');

//ログインチェック
loginCheck();
//以下ログインユーザーのみ

```
＊これでselsect.phpはログインユーザーでないと見れないページになりました。

#### 6.その他ログインユーザーしかアクセスできないページを設定
detail.phpとdelete.phpのアンケートの管理機能はログインユーザーのみにしたいのでそれぞれのファイルにログインに関する処理を追加

### ログアウト処理
ログアウトの流れはSESSION変数を初期化してCookieに保存してある"SessionIDの保存期間を過去にして破棄
#### 1.logout.phpに処理が記述されているのでindex.phpのheaderを変更
```
<header>
  <nav class="navbar navbar-default">
    <div class="container-fluid">
    <div class="navbar-header"><a class="navbar-brand" href="select.php">データ一覧</a></div>
    <div class="navbar-header"><a class="navbar-brand" href="login.php">ログイン</a></div>
    <div class="navbar-header"><a class="navbar-brand" href="logout.php">ログアウト</a></div><!-- ここを追記 -->
    </div>
  </nav>
</header>
```

#### 2.ログアウトボタンをブラウザでクリック
アンケート一覧にアクセスするともう見ることはできなくなっているはずです。

## セクション４　パスワードのハッシュ化
### パスワードは基本的にハッシュ化（暗号化）して利用する。平文では使わない

#### 1.hash.phpを作成
#### 2.hash.php内にパスワードのハッシュ化の処理を記述
```
<?php
$pw = password_hash('test1',PASSWORD_DEFAULT);
echo $pw;
?>
```

#### 3.login_act.phpの中の処理を一部変更
```
//2. データ登録SQL作成
$stmt = $pdo->prepare("SELECT * FROM gs_user_table WHERE lid = :lid);//ここをlidだけに変更
$stmt->bindValue(':lid',$lid, PDO::PARAM_STR);
// $stmt->bindValue(':lpw',$lpw, PDO::PARAM_STR); //* Hash化する場合はコメントする
$status = $stmt->execute();
```
```
//5. 該当レコードがあればSESSIONに値を代入この部分のif文をpassword_verifyに変更
if( password_verify($lpw, $val["lpw"]) ){
  //Login成功時
  省略
}else{
  省略
}
```