ログイン機能の実装サンプル(PHP/MySQL)

ログイン機能とは

ログイン機能は、ID・メールアドレスとパスワードによってユーザーを特定し、そのユーザーに個別のページを見せる機能です。

会員制サイトでは絶対に必要になる機能ですね。

CakePHPなどのフレームワークではすでに標準的に機能がついているものもあると思いますが、スクラッチで開発しようとするときに、なかなかベースとなるコードが見つからないなどの場合もあると思います。

今回は、LAMP環境のウェブアプリケーションのスクラッチでの開発において、ベースとなるログイン機能の実装サンプルということで、できるだけ簡略化したものを紹介してみたいと思います。
 

主なプログラム構成と動作

主な構成要素は以下です。

  • ・データベース(accountsテーブル)
  • ・ログイン画面(login.php)
  • ・ログイン認証ファイル(auth.php)
  • ・データベースアクセスファイル(database.php)

ログイン画面で、メールアドレスとパスワードで認証して、成功すれば「ログインしました」と表示し終了、失敗したらエラー表示の上、再度ログインフォームを表示する動作を目指したいと思います。
 

データベース(accountsテーブル)


・id・・・int型
・email・・・text型
・password・・・varchar型

必要最低限のカラム構成にしていますが、実際に実装するときには、アクセストークンを追加して、ウェブブラウザ側のセッションとデータベースのトークンの整合性をチェックするなどのセキュリティ対策は必要になるかもしれません。
 

ログイン画面(login.php)


<?php
session_start();
require_once('./database.php'); // データベースアクセスファイル読み込み
require_once('./auth.php'); // ログイン認証ファイル読み込み
$errorMessage = ""; // エラーメッセージ初期化
// ログイン処理
if ($_POST['mode']=="login") {
  if(!empty($_POST['form']['email']) && !empty($_POST['form']['password'])){
    if ($account=login($_POST['form']['email'], $_POST['form']['password'])){
      $_SESSION['account'] = $account;
      header("Location: ./login.php");
    // ログイン失敗時の表示
    } else {
      $errorMessage = "ログインに失敗しました。";
    }
  } else {
    $errorMessage = "メールアドレスとパスワードを入力してください。";
  }
}
?>
<?php if($login){ ?>
  echo "ログインしました。";
<?php } else { ?>
  <?php echo $errorMessage; ?>
  <input type="text" name="form[email]" value="" placeholder="メールアドレスを入力して下さい。">
  <input type="password" name="form[password]" value="" placeholder="パスワードを入力して下さい。">
  <input type="hidden" name="mode" value="login">
  <input type="submit" name="login" value="ログイン">
<?php } ?>

実際に利用する際には、ログイン済の場合はトップページやマイページにリダイレクトするなりして使用するとよいかと思います。

汎用性を考慮して、デザイン性を一切排除したシンプルなコーディングにしています。
 

ログイン認証ファイル(auth.php)


<?php
session_start();
// セッションにアカウント情報がある場合
if(isset($_SESSION['account'])){
  // 認証処理
  $account = authCheck($_SESSION['account']['email'], $_SESSION['account']['password']);
  if(isset($account)){
    // ログインフラグをtrueにする
    $login = true;
    // セッションにユーザー情報を格納
    $_SESSION['account'] = $account;
  } else {
    // ログインフラグをfalseにする
    $login = false;
    // セッションを破棄
    unset($_SESSION['account']);
  }
// セッションにアカウント情報がない場合
} else {
  // ログインフラグをfalseにする
  $login = false;
}
?>

このファイルは、会員向けページのすべてで最初に読み込んで表示を切り分けるようにします。
 

データベースアクセスファイル(database.php)


<?php
// ログイン処理
function login($email, $password){
  $db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
  $db->query('SET NAMES utf8');
  $sql = "SELECT *  FROM accounts  WHERE email = :email AND  password = :password";
  $stt = $db->prepare($sql);
  $stt->bindParam(':email', $email);
  $stt->bindParam(':password', $password);
  $stt->execute();
  while($row=$stt->fetch()){
    $result['id'] = $row['id'];
    $result['name'] = $row['name'];
    $result['email'] = $row['email'];
    $result['password'] = $row['password'];
  }
  if(isset($result)){
    return $result;
  }
}
// ログイン認証
function authCheck($email, $password){
  $db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
  $db->query('SET NAMES utf8');
  $sql = "SELECT * FROM accounts WHERE email = :email AND password = :password ";
  $stt = $db->prepare($sql);
  $stt->bindParam(':email', $email);
  $stt->bindParam(':password', $password);
  $stt->execute();
  while($row=$stt->fetch()){
    $result['id'] = $row['id'];
    $result['name'] = $row['name'];
    $result['email'] = $row['email'];
    $result['password'] = $row['password'];
  }
  if(isset($result)){
    return $result;
  }
}
?>

 

コーディング代行料金