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)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
随机推荐
- 【题解】 [ZJOI2008] 泡泡堂(贪心/二分图/动态规划)
懒得复制,戳我戳我 Solution: 就是有一个贪心策略:(以下假设使\(A\)队分数更高) \(First:\)比较两个分值的最小值,如果\(A\)最小分比\(B\)最小分大就直接比较两个最小的, ...
- 解题:NOI 2018 归程
题面 清新友好的题目 跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值. 询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节 ...
- Qt QGraphicsItem 绕中心旋转、放缩
最近用到了QGraphicsItem,可以通过QGraphicsItemAnimation使其产生动画效果. QGraphicsItemAnimation自带了setPosAt().setRotati ...
- vim使用入门设置
分为以下四步. 1,安装vim 2,安装git yum -y install vim git (Fedora/CentOS) /apt-get install vim git (Debian/Ubun ...
- php 访问错误日志
/usr/local/php/var/log/php-fpm.log」—————————
- WEB前端技巧之JQuery为动态添加的元素绑定事件.md
jquery 为动态添加的元素绑定事件 如果直接写click函数的话,只能把事件绑定在已经存在的元素上,不能绑定在动态添加的元素上 可以用delegate来实现 .delegate( select ...
- 实现vue2.0响应式的基本思路
最近看了vue2.0源码关于响应式的实现,以下博文将通过简单的代码还原vue2.0关于响应式的实现思路. 注意,这里只是实现思路的还原,对于里面各种细节的实现,比如说数组里面数据的操作的监听,以及对象 ...
- ThinkPHP框架学习(二)
在上一节中,我主要讲到了如何获取ThinkPHP框架,以及虚拟目录和虚拟主机的配置.准备工作完成之后,就可以利用ThinkPHP去部署项目了. 先在工作目录(D:/zend/workspace)下新建 ...
- LINQ 查询
概述 事实上,对于LINQ to Objects来说,就是通过为IEnumerable<T>接口定义了一组约50个扩展方式来实现的. Lambda表达式(拉姆达表达式,Lambda Exp ...
- Linux - awk 文本处理工具五
awk 线上处理常用模式 awk 处理复杂日志 6.19: DHB_014_号百总机服务业务日报:广州 到达数异常! DHB_023_号百漏话提醒日报:珠海 到达数异常! 6.20: DHB_014_ ...