PHPでログイン(認証)処理 + ログアウト

はい、ということで前回の続きです。

チェックボックスで、Cookieを使った自動ログインできるようにしたのと、ログアウトの処理を加えました。

index.php

<?php

  require('../common/define.php');
  require('../common/function.php');
  require('../Connections/DB.php');

  //セッションの開始(セッション名:memolog)
  session_name('memolog');
  session_start();

  //cookie用のkeyがDBに入っていてそれが一致したら自動ログイン
  if(isset($_COOKIE['mini_auto_login'])){
    $sql="
      SELECT name FROM mini_users
        WHERE
          auto='".myesc($_COOKIE['mini_auto_login'])."'    ";
    $rs = mysql_query($sql,$DB) or die(mysql_error());
    $flg = mysql_num_rows($rs);
    login_update_info();
  }

  //postされたときに実行
  if($_SERVER['REQUEST_METHOD'] == "POST"){
    //nameとpwdがmini_usersに格納されているかチェック
    $sql="
      SELECT name FROM mini_users
        WHERE
          name='".myesc($_POST['name'])."' AND
          pwd='".sha1(myesc($_POST['pwd']))."'
    ";
    $rs = mysql_query($sql,$DB) or die(mysql_error());
    $flg = mysql_num_rows($rs);
    login_update_info();
  }

  //ログインページに移動+情報書き込みの関数
  function login_update_info(){
    global $DB;
    global $flg;
    //存在したら
    if(isset($flg) && $flg!=""){
      //自動ログインにチェックがあったらsession_nameをクッキーに書き込む
      if(isset($_POST['auto']) && $_POST['auto']=="1"){
        $key=sha1(uniqid(rand(),true));
        setcookie('mini_auto_login',$key,time()+3600*24*7);
        //update文用
        $sql_auto=",auto='".$key."'";
      }
      //IPとログイン時間を記憶
      $sql="
        UPDATE mini_users
          SET
            last_ip='".myesc($_SERVER['REMOTE_ADDR'])."',
            last_login='".myesc(date('Y-m-d H:i:s'))."'
            ".$sql_auto."
      ";
      $rs = mysql_query($sql,$DB) or die(mysql_error());
      //セッションIDを変更
      session_regenerate_id();
      //login.phpに飛ばす
      header("location:login.php");
    }
  }

?>

一部関数化したけど、だいぶ長くなってしまって見づらいな。。あとCookieの中身の文字列がDBに格納してあったら即ログインするようにしてるんだけどこれってやっぱまずいんかな…。でもCookieにユーザ名とかパスワードとか持たせたくないからなぁ。

logout.php

<?php

  require('../common/define.php');
  require('../common/function.php');
  require('../Connections/DB.php');

  session_name("memolog");
  session_start();

  //自動ログインクッキーを削除
  if (isset($_COOKIE['mini_auto_login'])) {
    //DBからも情報を削除
    $sql="
        UPDATE mini_users
          SET
            auto=''
    ";
    $rs = mysql_query($sql,$DB) or die(mysql_error());
    setcookie('mini_auto_login', '', time()-42000, '/users/');
  }

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

  //セッションクッキーを削除
  if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', time()-42000, '/');
  }

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

  header("Location: ./index.php");

?>

MW WP Form

MW WP Form はショートコードベースのフォームプラグインです。多くの機能を持っており、例えば、多くのバリデーションルール、問い合わせデータの保存、そしてグラフ機能集計などを使用することができます。

さらに詳しく
Habakiri

Habakiri

Bootstrap ベースのシンプルな WordPress テーマ。レスポンシブ、多くのカスタマイズ機能。圧縮された CSS・JS を使用する高速化対策。Microformats 対応。Sass、クラスベースの functions.php。

さらに詳しく
basis-stylus

Basis

軽量なレスポンシブ Stylus/CSS フレームワーク。Flexbox ベースのグリッドシステム、疎結合なコンポーネント、バーティカルリズム。

さらに詳しく