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)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
随机推荐
- Dubbo 生态添新兵,Dubbo Admin 发布 v0.1
为了提升 Dubbo 里程碑版本2.7.0的使用体验,我们于去年年中启动了 Dubbo Admin 的重构计划,并作为Dubbo生态的子项目,于近期发布了v0.1,重构后的项目在结构上的变化如下: 将 ...
- 【bzoj4765】 普通计算姬
题意 给出一棵有根树,$n$个点每个都有一个点权.$m$组操作每次可以修改一个点权或者询问编号在区间$[l,r]$的点的子树权值和的和. Solution 我们对节点编号分块,每一块统计该块中的节点的 ...
- Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)
Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- CAP定理为什么只能同时满足两个
Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容忍性) 可靠性 在网上看了很 ...
- kubespray 一键安装k8s集群
1. clone代码 git clone https://github.com/kubernetes-incubator/kubespray.git 2. 添加inventory/inventory ...
- create-react-app脚手架使用
1.安装脚手架和路由 npm i -g create-react-app npm i -S react-router react-router-dom 2.创建新项目 create-react-app ...
- bzoj千题计划258:bzoj3123: [Sdoi2013]森林
http://www.lydsy.com/JudgeOnline/problem.php?id=3123 启发式合并主席树 #include<cmath> #include<cstd ...
- MySql数据库资料收集
1.下载MySQL历史版本 https://downloads.mysql.com/archives/community/ https://downloads.mysql.com/archives/i ...
- mysql统计一个字段的多种状态
假如我有下面的表:ID Item status updatetime author1 a 1 2014-01-0 ...