PHP與MySQL設計模式:代理模式

  1、數據庫鏈接通用類php

  重要的接口:mysql

  接口用來存儲MySQL鏈接數據。實現這個接口的類均可以使用這些數據。sql

  經過接口能夠隔離出程序中一個簡單而必要的部分,任何程序均可以實現這個接口。數據庫

  接口經過interface來定義,經過implements實現。安全

<?php
//文件名IConnectInfo.php
interface IConnectInfo
{
    const Host     = "localhost";
    const UserName = "root";
    const Password = "";
    const DBName   = "bergift";
    
    public function doConnect();
}
?>

  通用MySQL鏈接類和靜態變量:session

  接口實現都經過域解析操做符來鏈接訪問值。使用私有靜態變量接收,能夠使用靜態變量處理的速度優點,還能夠保證封裝性。fetch

  儘可能避免使用全局變量,全局變量會破壞封裝。靜態變量有助於減小類的實例化。網站

<?php
include_once('IConnectInfo.php');
class UniversalConnect implements IConnectInfo
{
    private static $Server    = IConnectInfo::Host;
    private static $CurrentDB = IConnectInfo::DBName;
    private static $User      = IConnectInfo::UserName;
    private static $Password  = IConnectInfo::Password;
    private static $HookUp;
    
    public function doConnect(){
        self::$HookUp = mysqli_connect(self::$Server,self::$User,self::$Password,self::$CurrentDB);
        
        if(self::$HookUp){
            
        }elseif(mysqli_connect_error(self::$HookUp)){
            echo "Fail: ".mysqli_connect_error;
        }
        return self::$HookUp;
    }
}
?>

  經過一個類和接口實現簡單的鏈接操做,可大大減小開發的時間,修改很容易,全部信息都存儲在常量中。this

  代理模式:spa

  保護代理在驗證過請求以後,纔會把請求發送到真實主題。這個真實主題就是請求的目標,如訪問數據庫信息。

  我的理解:用戶發送請求,代理模塊接收到請求以後,轉到驗證模塊,正確則返回真值,代理模塊再導向真正請求的目標。

  經過通用類完成數據庫的鏈接,數據庫的選擇。

  通用類包括:包含數據庫信息的接口、實現數據庫鏈接的類。

  保護代理包括:接口、實現校驗的代理模塊、實現的客戶端對象類。

  流程:登陸頁面——>Client.php(實現的客戶端對象類)——>Proxy.php(代理模塊)——>使用通用類鏈接數據庫進行判斷,正確則返回代理真值——>代理將頁面導向至realProject.php進行處理。

  代理的做用是確保有權限的用戶才能訪問網站。

  能夠把代理模式中代理參與者看作是一個場所,在用戶訪問真實主題前能夠在這裏作一些真正確保高安全性的操做。

  代理模塊是一個簡單的口令檢查,能夠調用一個高安全性模塊來處理敏感信息。

  接口文件

<?php
//文件名ISubject.php
Interface ISubject
{
    function request();
}
?>

  代理類

<?php
//文件名Proxy.php
include_once('ISubject.php');
include_once('RealSubject.php');
include_once('UniversalConnect.php');

class Proxy implements ISubject
{
    private $TableMaster;
    private $HookUp;
    private $LoginSuccess;
    private $RealSubject;
    
    public function login($UserNow,$PassNow)
    {
        $UserName = $UserNow;
        $PassWord = md5($PassNow);
        $this->LoginSuccess = false;
        $this->TableMaster  = "BAdmin";
        $this->HookUp        = UniversalConnect::doConnect();
        
        $sql = "SELECT password from $this->TableMaster WHERE username = '$UserName'";
        if($result = $this->HookUp->query($sql))
        {
            $row = $result->fetch_array(MYSQLI_ASSOC);
            if($row['password']==$PassWord)
            {
                $this->LoginSuccess = true;
            }
            $result->close();
        }
        elseif(($result = $this->HookUp->query($sql))===false)
        {
            echo "Failed".$this->HookUp->error;
            exit();
        }
        $this->HookUp->close();
        if($this->LoginSuccess)
        {
            $this->request();
        }
        else
        {
            header("Location:index.php");
        }
    }
    public function register($UserNow,$PassNow)
    {
        $UserName = $UserNow;
        $PassWord = md5($PassNow);
        $this->LoginSuccess = false;
        $this->TableMaster  = "BAdmin";
        $this->HookUp        = UniversalConnect::doConnect();
        
        $sql = "INSERT INTO $this->TableMaster VALUES('$UserName','$PassWord')";
        if($result = $this->HookUp->query($sql))
        {
            $this->LoginSuccess = true;
        }
        elseif(($result = $this->HookUp->query($sql))===false)
        {
            echo "Failed".$this->HookUp->error;
            exit();
            //header("Location:index.php");
        }
        $this->HookUp->close();
        if($this->LoginSuccess)
        {
            echo "<script>alert('Success!');</script>";
        }
        else
        {
            header("Location:index.php");
        }
    }
    public function request()
    {
        $this->realSubject = new RealSubject();
        $this->realSubject->request();
    }
}
?>

 

  接收客戶端發送的信息的Client類,發送消息到代理類進行驗證。

<?php
//文件名Client.php
include_once('Proxy.php');
class Client
{
    private $Proxy;
    private $UserName;
    private $PassWord;
    
    public function __construct()
    {
        $this->TableMaster = 'BAdmin';
        $this->HookUp      = UniversalConnect::doConnect();
        $this->UserName    = $this->HookUp->real_escape_string(trim($_POST['username']));
        $this->PassWord    = $this->HookUp->real_escape_string(trim($_POST['password']));
        if($_GET['do']==='register')
        {
            $this->getRegis($this->proxy=new Proxy());
        }elseif($_GET['do']==='login')
        {
            $this->getIface($this->proxy=new Proxy());
        }
    }
    private function getIface(ISubject $proxy)
    {
        $proxy->login($this->UserName,$this->PassWord);
    }
    private function getRegis(ISubject $proxy)
    {
        $proxy->register($this->UserName,$this->PassWord);
    }
}
$Worker = new Client();
?>

  真實主題,只能由代理類進入。

<?php
//文件名RealSubject.php
include_once('ISubject.php');
class RealSubject implements ISubject
{
    public function request()
    {
        session_save_path(dirname(__FILE__).'/sess/');
        @session_start();
        $_SESSION['bergift'] = 'admin';
        header("Location:main.php");
    }
}
?>
相關文章
相關標籤/搜索