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)
模式动机在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到 ...
随机推荐
- 【题解】 bzoj1055: [HAOI2008]玩具取名 (动态规划)
bzoj1055,懒得复制,戳我戳我 Solution: 区间动规(以后开始动规会在solution前面标注是啥动规 我觉的这道题挺难想了,但其实状态定义了一下子就出来了(还是不行啊) 我们定义状态\ ...
- c++函数写的都对,还是说incompatible或者not found的解决办法
vs2010,c++,定义了一个函数如下,在BianHuanYuDib.h文件中: 在BianHuanYuDib.cpp中: 写的完全正确,但还是会报错: 很明显,连std都报错了,一般不是真的有很大 ...
- 关于NIO一些优化
1. 使用NIO开发web服务,传输文件内容,可以使用FileChannel.transferTo(position,count,socketChannel)来提升性能: 经过测试,确实能提升10% ...
- asp.net性能优化之使用Redis缓存(入门)
1:使用Redis缓存的优化思路 redis的使用场景很多,仅说下本人所用的一个场景: 1.1对于大量的数据读取,为了缓解数据库的压力将一些不经常变化的而又读取频繁的数据存入redis缓存 大致思路如 ...
- linux命令总结mpstat命令
简介 mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查 ...
- Java基础-SSM之mybatis快速入门篇
Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...
- AngularJs分层结构小demo
后端mvc分层,前端也要分层才对嘛.分层的好处不言而喻.简直太清晰,容易维护.反正清爽的一逼.不信你看. 思路:分为controller层和service层.controller层再提取一个公共的层. ...
- Spark记录-Scala变量/访问修饰符/运算符
变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...
- haproxy acl访问限制IP
http-request: 7层过滤 tcp-request content: tcp层过滤,四层过滤 注意 四层 采用 accept和reject 七层采用 allow和deny ...
- Easy2Boot-小清新教程
Author:KillerLegend Date:2014.8.14 From:http://www.cnblogs.com/killerlegend/p/3913614.html 之所以说是小清新, ...