LAMP:ログイン・ログアウト

①ファイルの作成
/var/www/html/
 index.php :インデックス画面
 logio.php :ログイン・ログアウトの制御
 conf.php  :DB接続情報管理用
 input.php :ログイン成功後の遷移先画面
②index.php

<html>
<head>
<title>ログイン ページ</title>
</head>
<body>
<script type="text/javascript">
<!--
function onKeyDown(e){
 // Enterキー入力
 if(e.keyCode == 13){
  login();
 }
}

// ログイン処理
function login(){
 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function(){
  if(xhr.readyState == 4 && xhr.status == 200){
   if(xhr.responseText == "1"){
     document.location.href = "input.php";
   }else if(xhr.responseText == "0"){
     document.getElementById("msg").innerHTML = "ユーザIDまたはパスワードが間違っています。";
     document.getElementById("pwd").focus();
   }else{
     document.getElementById("msg").innerHTML = xhr.responseText;
   }
  }
 }
 xhr.open("POST", "logio.php");
 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8;");
 var req = "mode=login";
 req += "&uid=" + encodeURI(document.getElementById("uid").value);
 req += "&pwd=" + encodeURI(document.getElementById("pwd").value);
 xhr.send(req);
}
//-->
</script>
<div id="msg"></div>
<table border=3>
 <tr>
  <td>ユーザID</td>
  <td><input type="text" style="width:150px;" id="uid" onkeydown="onKeyDown(event);"></td>
 </tr>
 <tr>
  <td>パスワード</td>
  <td><input type="password" style="width:150px;" id="pwd" onkeydown="onKeyDown(event);"></td>
 </tr>
 <tr>
  <td></td>
  <td><input type="button" style="width:150px;" value="ログイン!" onclick="login();"></td>
 </tr>
</table>
</body>
</html>

③logio.php
※SQL文を発行する場合は、mysqli::prepare("SQL文");を使用してSQLパラメータをバインドすれば、自動で文字列をエスケープしてくれるので、そちらの方が楽で安全かもしれないです。
<?php
$mode = $_POST["mode"];
$ret = "";

switch($mode){
 case "login":
  $ret = login($_POST["uid"], $_POST["pwd"]);
  break;
 case "logout":
  logout();
  break;
 default:
  break;
}
echo $ret;

// ログイン処理
function login($uid, $pwd){
 session_start();
 $ret = "";
 // 外部ファイルの読み込み
 require("conf.php");
 // 外部ファイルのメソッドを実行
 $mysqli = GetMySqli();
 if($mysqli == null){
  exit();
 }
 
 // ユーザ情報取得
 $sql = "SELECT username ";
 $sql .= "FROM auth ";
 $sql .= "WHERE uid='".$mysqli->real_escape_string($uid)."' ";
 $sql .= "AND   pwd=HEX(AES_ENCRYPT('".$mysqli->real_escape_string($pwd)."','encryptKey'))";
 
 // SQL実行
 if($result = $mysqli->query($sql)){
  // 取得レコードをフェッチ
  if($row = $result->fetch_row()){
   $_SESSION["username"] = $row[0];
   $ret = "1";
  }else{
   $ret = "0";
  }
 }else{
  // SQL実行エラー
  $ret = "Error executing sql:".$mysqli->error;
 }
 $mysqli->close();
 return $ret;
}

// ログアウト処理
function logout(){
 session_start();
 // セッションをクリア
 $_SESSION = array();
 // クッキーを破棄
 if (isset($_COOKIE[session_name()])) {
  setcookie(session_name(), "", time()-42000, "/");
 }
 // セッションを破棄
 session_destroy();
}
?>

④conf.php
<?php
function GetMySqli(){
 // ホスト名
 $host = "localhost";
 // ユーザID
 $uid = "root";
 // パスワード
 $pwd = "password";
 // DB名
 $db = "test_db";
 $mysqli = new mysqli($host, $uid, $pwd, $db);
 
 // 接続状況チェック
 if($mysqli->connect_errno){
  echo "Connection Error:".$mysqli->connect_error;
  return null;
 }
 
 // 文字セット変更
 if(!$mysqli->set_charset("utf8")){
  echo "Error loading character set utf8:".$mysqli->error;
  return null;
 }
 
 return $mysqli;
}
?>

④input.php
<?php
session_start();

// セッションが確立されているか判断
if(!isset($_SESSION["username"])){
 require("index.php");
 exit();
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登録 ページ</title>
</head>
<body>
<script type="text/javascript">
<!--
function logout(){
 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function(){
  if(xhr.readyState == 4 && xhr.status == 200){
    document.location.href = "/";
  }
 }
 xhr.open("POST", "logio.php");
 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8;");
 var req = "mode=logout";
 xhr.send(req);
}
//-->
</script>
<table border=3>
<tr>
<td>
ようこそ
<b>
<?php
 echo $_SESSION["username"];
?>
</b>
さん
</td>
<td>
<input type="button" value="ログアウト" onclick="logout();">
</td>
</tr>
<tr>
<td colspan=2>
<div id='list'>
WOW
</div>
</td>
</tr>
</table>
</body>
</html>
最終更新:2012年07月12日 00:14
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。