5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPで簡易ログイン機能を実装する

Last updated at Posted at 2020-06-15

#概要

PHP初心者・非エンジニアさん向け。
ログイン機能を実装したい!でもDBを使うほどではないし工数を削減したい…という場合です。
以下の記事を参照しながら、PHP初心者の引っかかったポイントやメモをまとめます。

【PHPで簡易ログイン機能】DBを使わず固定文字列で取り敢えずログイン機能の実装
http://crought.com/blog/%E3%80%90php%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%A9%9F%E8%83%BD%E3%80%91db%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E5%9B%BA%E5%AE%9A%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E5%8F%96%E3%82%8A%E6%95%A2-82/#html

PHPのheader関数でリダイレクト処理を行う方法【初心者向け】
https://techacademy.jp/magazine/11609

#やっていきましょう
入力情報としてパスワードだけを必要としたため、元記事よりもやや簡易な実装になっています。

  • login.php … ログインするための画面
  • member-index.php … ログインしたメンバーのみがアクセスできる初期画面
  • index.php … ログインしていない人向け画面


ログイン画面

login.php
<?php
session_start(); // セッション開始宣言

// ログイン済みかを確認
if (isset($_SESSION['USER'])) {
    header('Location: member-index.php'); // ログインしていればmember-index.phpへリダイレクトする
    exit; // 処理終了
}
// ログイン機能
$error_message = '';
if(isset($_POST['login'])) { // name="login"と対応している
    if($_POST['password'] == 'qwerty123') { // パスワード
        $_SESSION['USER'] = 'user'; // 
        header('Location: member-index.php');
        exit;
    } else {
        $error_message = 'パスワードが違うみたいです';
    }
}
?>
<!doctype html>
<html>
  <body>
    <!-- 中略 -->
    <div>
      <p style="color:red;"><?php echo $error_message ?></p>
      <form id="memberLogin" method="post" action="login.php">
        <p>パスワードを入力してください。</p>
        <p>
          <input type="password" id="password" name="password" size="20" />
        </p>
        <p>
          <input type="checkbox" id="password-check" name="" value="" />
          <label for="password-check" onclick="">パスワードを表示する</label>
        </p>
        <p>
          <button type="button" onclick="history.back()">もどる</button>
          <button type="submit" name="login" size="" value="">送信</button>
        </p>
      </form>
    </div>
  </body>
</html>


ログイン後初期画面(ログアウト機能つき)

member-index.php
<?php 
session_start();

//ログイン済みかを確認
if (!isset($_SESSION['USER'])) {
    header('Location: login.php');
    exit;
}

//ログアウト機能
if(isset($_POST['logout'])){
    $_SESSION = [];
    session_destroy(); // セッションを完全に破棄
    header('Location: index.php'); // ログインしていない人向け画面に遷移
    exit;
}
?>
<!doctype html>
<html>
  <body>
    <!-- 中略 -->
    <div>
      <form method="post" action="member-index.php">
        <input type="submit" name="logout" value="ログアウト"><br>
        <p class="button-nav">一般ページに戻ります</p>
      </form>
    </div>
  </body>
</html>

#留意点
###PHP初心者向けメモ

  • form action="" の向き先
    当たり前のことを…と思うかもしれませんが、html内でform action=""に指定するのは自画面のURLで、いったん自画面のphp処理を走らせてリダイレクトさせるのが正しい流れです(最初PHPの処理の流れがピンとこず別画面のURLを指定してしまっていた)。

  • $_POST['login']
    []内は受け取りたいフォームのname属性と対応している。
    パスワード以外のものをGETメソッドで受け取りたいときは$_GET['hoge']を使用する。

  • $_SESSION['USER']
    必ずセッション開始宣言 session_start(); を行ってから使用する。
    ここでは固定文字列を突っ込んでいますが、もちろん入力されたusernameなどを代入して応用するのもあり。

  • header('Location: member-index.php');
    リダイレクト処理ができるいわゆる「header関数」。Locationに続けて絶対パスを指定する。

###セキュリティ面(2023/6追記)
当然ながら、パスワードを平文で載っけている超簡易的な方法なので実装の際は十分セキュリティに配慮してください。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?