Login の管理

ネットでおしゃべりの Login 管理版です。
<a href="http://maedakobe.rw.xsi.jp/php/login.php">Login 管理版</a><br>
リンクをクリックするとおしゃべりの Login 管理版が呼び出されます。
Login 管理版

プログラム設計

  1. サーバーを通じてネットでおしゃべりをするページは ネットでおしゃべり をクリックして下さい。
    ネットでおしゃべりをベースにログインとログアウトを管理します。
  2. 次のファイルを使います。
    1. log_class.php
      プログラムの骨格を構成する Log_class です。
    2. login.php
      ネットでおしゃべりの Login 管理版です。
    3. message.txt
      ネットでおしゃべりと共用のテキストメッセージファイルです。
      書き込みと読み込み属性を許可して下さい。
    4. login.txt
      ログインとログアウト(参加者)を記録するファイルです。
      書き込みと読み込み属性を許可して下さい。
  3. 参加者のIDをキーとして連想配列で管理します。
    1. 'LOGIN'のとき login.txt を調べてIDを登録する
    2. 'LOGOUT'のときIDを削除して message.txt に退室を表示する
    3. 'GET'のとき最新の message.txt を入力して表示する
    4. 'PUT'のとき message.txt に msg を追加して書き出す
    5. 'CLEAR'のとき login.txt をクリアする(全員退出)
      ログイン情報が合わなくなったときのリセットです。
  4. FORM で渡すパラメータです。

log_class.php

プログラムの骨格を構成する Log_class です。
Shift_JIS でタイプしてアップロードして下さい。
<?php
date_default_timezone_set("Asia/Tokyo"); 
class  log_class
{
    var $id_t;          //参加者のID配列(\r\n無し)
    var $msg_t;         //Message の配列(\r\n無し)
    // Constructor
    function log_class()
    {   $this->get_log();
        $this->get_msg();
        //$this->check();
    }
    // Game Action
    function  action($id, $mode, $msg)
    {   $srh= $this->id_t[$id];	// ID の登録を調べる
        if ($srh==false && $mode!='LOGIN')
        {   print "LOGIN して下さい<br>";
            return;
        }
	    switch($mode)
        {   case 'LOGIN':		// $this->id_t を調べてIDを登録する
                if ($srh!=false)
                {   print "$id は使用中です<br>";
                    return;
                }
                $val= date("Y/m/d  H:i:s");
                $this->id_t[$id]= $val; 
                $this->put_log();
                $this->msg_t[]= "$id さんが入室しました";
                $this->put_msg();
                break;
            case 'LOGOUT':		// IDを削除して退室を表示する
                unset($this->id_t[$id]);
                $this->put_log();
                $this->msg_t[]= "$id さんが退室しました";
                $this->put_msg();
                break;
            case 'GET':			// 最新の message.txt を入力して表示する
        		foreach($this->msg_t as $val)	print "$val<br>\r\n";
                break;
            case 'PUT':			// $this->get_msg に msg を追加する
                $this->msg_t[]= "$id : $msg";
				//20件を超えると削除
                while(count($this->msg_t)>20)	array_shift($this->msg_t);
        		foreach($this->msg_t as $val)	print "$val<br>\r\n";
                $this->put_msg();
                break;
            case 'CLEAR':		// login.txt をクリアする(全員退出)
                $this->id_t= array();
                $this->put_log();
                break;
            default:
                print "Mode Error [$mode]<br>";
                break;
        }	 
    }
    // $this->id_t, $this->msg_t を表示して確認
    function  check()
    {   print_r($this->id_t);
        print_r($this->msg_t);
    }
    // $this->id_t に参加者IDを読み込む
    function  get_log()
    {   if (!($fp = fopen("login.txt","r")))
        {   die('login.txt read open error');  }
        while(!feof($fp))
        {   $key= fgets($fp);
            $key= str_replace(array("\r", "\n"), '', $key);
            $val= fgets($fp);
            $val= str_replace(array("\r", "\n"), '', $val);
            if (strlen($key)>1) $this->id_t[$key]= $val;
        }
        fclose($fp);
    }
    // $this->id_t を "login.txt" に書き込む
    function  put_log()
    {   if (!($fp = fopen("login.txt","w")))
        {   die('login.txt write open error');  }
        foreach ($this->id_t as $key => $val)
        {   fputs($fp, "$key\r\n");
            fputs($fp, "$val\r\n");
        }
        fclose($fp);
    }
    // $this->msg_t に Message を読み込みます
    function  get_msg()
    {   if (!($fp = fopen("message.txt","r")))
        {   die('message.txt read open error');  }
        while(!feof($fp))
        {   $str= fgets($fp);
            $str= str_replace(array("\r", "\n"), '', $str);
            if (strlen($str)>2)	$this->msg_t[]= $str;
        }
        fclose($fp);
    }
    // $this->msg_t を "message.txt" に書き込む
    function  put_msg()
    {
        if (!($fp = fopen("message.txt","w")))
        {   die('message.txt write open error');  }
        foreach ($this->msg_t as $str)
        {   fputs($fp, "$str\r\n");
        }
        fclose($fp);
    }
    // Form を表示
    function form_call($php, $id)
    {   print("<br>ID<br>");
        print("<form action=\"$php\" method='post'>");
        print("<input type=text name='id' value=\"$id\"><br><br>");
        print("<textarea name='msg' rows='2' cols='80'></textarea><br>");
        print("<input type=submit name='mode' value='LOGIN'><br>");
        print("<input type=submit name='mode' value='LOGOUT'><br>");
        print("<input type=submit name='mode' value='GET'><br>");
        print("<input type=submit name='mode' value='PUT'><br>");
        print("<input type=submit name='mode' value='CLEAR'><br>");
        print("</form>");
    }
}
?>

プログラムの説明

  1. $id_t はログイン, ログアウトを記録する連想配列です。
    $msg_t はおしゃべりを記録する文字列の配列です。
    class  log_class
    {
        var $id_t;          //参加者のID配列(\r\n無し)
        var $msg_t;         //Message の配列(\r\n無し)
    
  2. Constructor では "login.txt", "message.txt" を $id_t, $msg_t に読み込みます。
    Form から再起的に呼び出される度に、最新のデータが読み込まれています。
        // Constructor
        function log_class()
        {   $this->get_log();
            $this->get_msg();
        }
    
  3. action() 関数で $mode に従って処理します。
    ID が登録されたいないと LOGIN しか実行できません。
        function  action($id, $mode, $msg)
        {   $srh= $this->id_t[$id];	// ID の登録を調べる
            if ($srh==false && $mode!='LOGIN')
            {   print "LOGIN して下さい<br>";
                return;
            }
    	    switch($mode)
            {   case 'LOGIN':		// $this->id_t を調べてIDを登録する
                      ・・・
                case 'LOGOUT':		// IDを削除して退室を表示する
                      ・・・
                case 'GET':			// 最新の message.txt を入力して表示する
                      ・・・
                case 'PUT':			// $this->get_msg に msg を追加する
                      ・・・
                case 'CLEAR':		// login.txt をクリアする(全員退出)
                      ・・・
    
  4. ファイル⇔連想配列の関数です。
    連想配列に登録するときは、改行コードを削除して下さい。
    詳細は 連想配列の入出力 を参照して下さい。
        // $this->id_t に参加者IDを読み込む
        function  get_log()
        {   ・・・
        }
        // $this->id_t を "login.txt" に書き込む
        function  put_log()
        {   ・・・
        }
    
  5. ファイル⇔配列の関数です。
        // $this->msg_t に Message を読み込みます
        function  get_msg()
        {   ・・・
        }
        // $this->msg_t を "message.txt" に書き込む
        function  put_msg()
        {   ・・・
        }
    
  6. データをタイプ入力する Form です。
        // Form を表示
        function form_call($php, $id)
        {   print("<br>ID<br>");
            print("<form action=\"$php\" method='post'>");
            print("<input type=text name='id' value=\"$id\"><br><br>");
            print("<textarea name='msg' rows='2' cols='80'></textarea><br>");
            print("<input type=submit name='mode' value='LOGIN'><br>");
            print("<input type=submit name='mode' value='LOGOUT'><br>");
            print("<input type=submit name='mode' value='GET'><br>");
            print("<input type=submit name='mode' value='PUT'><br>");
            print("<input type=submit name='mode' value='CLEAR'><br>");
            print("</form>");
        }
    
  7. function check() はデバッグ用の関数です。

login.php

ネットでおしゃべりの Login 管理版のメインプログラムです。
Log_class を組み込んでいます。
Shift_JIS でタイプしてアップロードして下さい。
<html>
<body bgcolor=#fafeff>
  <h2>ネットでおしゃべり</h2>
  <?php
  require_once("log_class.php");
  $game= new log_class();
  $id= $_POST['id'];
  if (!isset($id))
  {   print("<br>ID をタイプして LOGIN して下さい<br>\r\n");  }
  else
  {   $mode= $_POST['mode'];
      $msg= $_POST['msg'];
      $game->action($id, $mode, $msg);
  }
  $game->form_call("login.php", $id);
  ?>
</body>
</html>

プログラムの説明

  1. require_once("log_class.php"); で Log_class を組み込みます。
    $game= new log_class(); で Log_class を生成します。
  2. Form から渡された $_POST['id']; を取得します。
    最初に "login.html" から呼び出されたときはパラメータは設定されていません。
  3. 'id' が渡されたときは 'mode' と 'msg' を取得して action() 関数を呼び出します。
  4. 最後に form_call() 関数を呼び出して login.php を再起コールします。
  5. Data Base を使った掲示板のプログラムは 掲示板 を参照して下さい。

前田稔の超初心者のプログラム入門
PHP Program