PHP与MySQL设计模式:代理模式
一、数据库连接通用类
重要的接口:
接口用来存储MySQL连接数据。实现这个接口的类都可以使用这些数据。
通过接口可以隔离出程序中一个简单而必要的部分,任何程序都可以实现这个接口。
接口通过interface来定义,通过implements实现。
<?php
//文件名IConnectInfo.php
interface IConnectInfo
{
const Host = "localhost";
const UserName = "root";
const Password = "";
const DBName = "bergift"; public function doConnect();
}
?>
通用MySQL连接类和静态变量:
接口实现都通过域解析操作符来连接访问值。使用私有静态变量接收,可以使用静态变量处理的速度优势,还可以保证封装性。
尽量避免使用全局变量,全局变量会破坏封装。静态变量有助于减少类的实例化。
<?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;
}
}
?>
通过一个类和接口实现简单的连接操作,可大大减少开发的时间,修改很容易,所有信息都存储在常量中。
代理模式:
保护代理在验证过请求之后,才会把请求发送到真实主题。这个真实主题就是请求的目标,如访问数据库信息。
个人理解:用户发送请求,代理模块接收到请求之后,转到验证模块,正确则返回真值,代理模块再导向真正请求的目标。
通过通用类完成数据库的连接,数据库的选择。
通用类包括:包含数据库信息的接口、实现数据库连接的类。
保护代理包括:接口、实现校验的代理模块、实现的客户端对象类。
流程:登录页面——>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");
}
}
?>
PHP与MySQL设计模式:代理模式的更多相关文章
- 9. 星际争霸之php设计模式--代理模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- PHP设计模式-代理模式
概念理解: 代理模式,是对简单处理程序(或指针)的增强,用于引用一个对象:这个指针被代理对象取代,代理对象位于客户端和真实程序之间,指针有一个可被多个目标利用的钩子. 参与者: client(参与者) ...
- Java设计模式-代理模式之动态代理(附源代码分析)
Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...
- 浅谈Python设计模式 - 代理模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 一.在某些应用中,我们想要在访问某个对象之前执行一个或者多个重要的操作,例如,访 ...
- Java 之 设计模式——代理模式
设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 代理模式
用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构
- Java设计模式 - 代理模式
1.什么是代理模式: 为另一个对象提供一个替身或占位符以访问这个对象. 2.代理模式有什么好处: (1)延迟加载 当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己 ...
- 深入浅出设计模式——代理模式(Proxy Pattern)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
随机推荐
- luogu1540 [NOIp2011]机器翻译 (队列)
#include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) ...
- Appium+python自动化获取toast消息(windows版)的方法
原来用的Appium1.5.3GUI版本,那为什么升级呢? 为了兼容最新版本的iOS10和Android7 Xcode8升级后,将不支持使用UIAutomation,而是改为使用XCUITest了,并 ...
- git 创建空提交
git commit --allow-empty -m "Empty Commit to setup deployments"
- Redis的持久化数据
Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF:持久化记录服务器执行的 ...
- First non-repeating character in a stream
First non-repeating character in a stream Given an input stream of n characters consisting only of s ...
- Intel 8086_通用寄存器|段寄存器
- centos7+mysql5.7.11实现主从复制
1 首先检测当前的系统是否已经安装了MySQL yum list installed | grep mysql 如果有的话,删除 2 下载rpm库资源,在网页 https://dev.mysql. ...
- springmvc常用注解标签详解-推荐
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- 学了display:flex垂直居中容易多了
以前div内部的文字垂直居中,使用height = line-height,现在可以使用display:flex来实现了 .div{ display:flex; align-items:center; ...
- Java SSM框架之MyBatis3(一)MyBatis入门
MyBatis3介绍 mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的o ...