此例子是MVC的简单应用, 要达到的效果如下:

用户列表:

姓名 年龄 学历 兴趣 出生地 账号创建时间 操作
keen 20 高中 篮球,足球 广东 2016-11-08 10:00:31 删除
andi 30 本科 乒乓球 上海 2016-11-22 10:00:55 删除
ddddddd 40 初中 台球 广州 2016-11-10 12:20:49 删除
eeeeeee 34 大专 慢跑 深圳 2016-11-15 12:21:26 删除

当前用户总数: 4

一.设计表

create table if not exists tab_users(
id int auto_increment primary key,
name varchar(50) not null,
age int default 18,
edu varchar(20),
hobby varchar(200),
born_place varchar(20),
create_time datetime
);

执行, 自己填入数据

二.相关类

1. 基本类, 已经构造了对数据库访问的链接资源

BaseModel.class.php

<?php
include './MySQLDB.class.php'; class BaseModel{
// 存储数据库工具类实例
protected $db = null; function __construct(){
$config = array(
'host' => 'localhost',
'port' => 3306,
'user' => 'root',
'pwd' => '123456',
'charset' => 'utf8',
'dbname' => 'db1'
); $this->db = MySQLDB::GetInstance($config);
}
}
?>

2.用户模型类, 封装了获取用户相关数据的方法

UserModel.class.php

<?php
/*
用户模型
*/
include './BaseModel.class.php'; class UserModel extends BaseModel{ function getAllUsers(){
$sql = "select * from tab_users";
return $this->db->getRows($sql);
} function getUsersCount(){
$sql = "select count(*) from tab_users";
return $this->db->getOneData($sql);
} function delUserById($id){
$sql = "delete from tab_users where id = '$id'";
return $this->db->exec($sql);
}
}
?>

3.单例工厂类: 通过类名,获取唯一实例

ModelFactory.class.php

<?php
/*
单例工厂类
*/
class ModelFactory{
static $models = array(); // 用于存储各个模型的唯一实例 static function M($className){
if(!isset(static::$models[$className]) || // 不存在
!(static::$models[$className] instanceof $className)){ // 不是其实例
static::$models[$className] = new $className();
}
return static::$models[$className];
}
}
?>

  

4.控制器: 先调用模型,获取数据.然后再载入视图,显示数据

showAllUserController.php

<?php
/*
显示所有用户的控制器
*/
header("content-type:text/html;charset=utf8"); // 设置输出的字符串编码为utf8
include './UserModel.class.php';
include './ModelFactory.class.php'; // 判断动作
if(!empty($_GET['act']) && $_GET['act'] == 'del'){
$id = $_GET['id'];
$obj = ModelFactory::M("UserModel");
$obj->delUserById($id);
echo "<p style='color:red;'>删除数据成功!</p>";
} // 获取数据
$user_obj = ModelFactory::M("UserModel");
$data1 = $user_obj->getAllUsers();
/*
echo "<pre>";
print_r($data1);
echo "</pre>";
*/
$data2 = $user_obj->getUsersCount(); // 载入视图文件, 显示数据
include './showAllUserView.html';
?>

5.视图

showAllUserView.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> <head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>网页标题</title>
<meta name="keywords" content="关键字列表" />
<meta name="description" content="网页描述" />
<link rel="stylesheet" type="text/css" href="" />
<style type="text/css"> </style>
<script type="text/javascript">
function del_confirm() {
console.log('进入 confirm 方法中...');
return window.confirm("你真的要删除吗?");
}
</script>
</head> <body>
用户列表:
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>学历</td>
<td>兴趣</td>
<td>出生地</td>
<td>账号创建时间</td>
<td>操作</td>
</tr>
<?php
foreach($data1 as $rec){
?>
<tr>
<td><?php echo $rec['name']; ?></td>
<td><?php echo $rec['age']; ?></td>
<td><?php echo $rec['edu']; ?></td>
<td><?php echo $rec['hobby']; ?></td>
<td><?php echo $rec['born_place']; ?></td>
<td><?php echo $rec['create_time']; ?></td>
<td>
<a href="?act=del&id=<?php echo $rec['id']; ?>" onclick="return del_confirm()">删除</a>
</td>
</tr>
<?php
}
?>
</table> 当前用户总数:
<?php echo $data2; ?>
</body> </html>

ps:

MySQLDB.class.php

<?php
/*
设计一个类:mysql数据库操作类
设计目标:
1,该类一实例化,就可以自动连接上mysql数据库;
2,该类可以单独去设定要使用的连接编码(set names XXX)
3,该类可以单独去设定要使用的数据库(use XXX);
4,可以主动关闭连接;
*/ class MySQLDB{
private $link = null; // 用于存储成功链接后的资源 // 属性, 存储链接数据库的基本信息
private $host;
private $port;
private $user;
private $pwd;
private $charset;
private $dbname; // 1)私有化构造方法
private function __construct($config){
// 保存链接的基本信息
$this->host = !empty($config['host']) ? $config['host'] : "localhost";
$this->port = !empty($config['port']) ? $config['port'] : "3306";
$this->user = !empty($config['user']) ? $config['user'] : "root";
$this->pwd = !empty($config['pwd']) ? $config['pwd'] : "";
$this->charset = !empty($config['charset']) ? $config['charset'] : "utf8";
$this->dbname = !empty($config['dbname']) ? $config['dbname'] : "mysql"; // 链接数据库
$this->link = mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd")
or die("链接失败"); // 设定编码
//mysql_query("set names {$config['charset']}");
$this->setCharset($config['charset']); // 设定要使用的数据库名
//mysql_query("use {$config['dbname']}");
$this->selectDB($config['dbname']);
} // 2)单例, 存储唯一实例
private static $instance = null; // 3)静态方法,获取唯一实例
static function GetInstance($config){
//if(!isset(self::$instance)){ // ==>等价于
if(!(self::$instance instanceof self)){ // 更常用
self::$instance = new self($config); // 创建并保存起来
}
return self::$instance;
} // 4)私有化克隆方法
private function __clone(){} // 可设定要使用的编码
function setCharset($charset){
mysql_query("set names $charset", $this->link);
} // 可设定要使用的数据库
function selectDB($dbname){
mysql_query("use $dbname", $this->link);
} // 可关闭数据库链接
function closeDB(){
mysql_close($this->link);
} // 执行 sql 语句,进行错误处理,并返回结果
private function query($sql){
$result = mysql_query($sql, $this->link);
if($result === false){
// 失败处理
echo "sql语句执行失败,请参考如下信息:";
echo "<br />错误代码: " . mysql_errno();
echo "<br />错误信息: " . mysql_error();
echo "<br />错误语句: " . $sql;
die();
}
return $result;
} // 执行一条 增删改 sql语句,返回真或假
function exec($sql){
$result = $this->query($sql);
return true;
} // 执行一条 sql 语句,返回一行记录
function getOneRow($sql){
$result = $this->query($sql);
$rec = mysql_fetch_assoc($result);
// 提前销毁结果集,否则需要等待页面结束才能自动销毁
mysql_free_result($result);
return $rec;
} // 执行一条 sql 语句,返回多行记录
function getRows($sql){
$result = $this->query($sql);
$arr = array();
while($rec = mysql_fetch_assoc($result)){
$arr[] = $rec; // 二维数组
} mysql_free_result($result);
return $arr;
} // 执行一条 sql 语句,直接返回一个结果
// 类似于: select count(*) as c from user_list
function getOneData($sql){
$result = $this->query($sql);
$rec = mysql_fetch_row($result);
$data = $rec[0];
mysql_free_result($result);
return $data;
}
}
?>

 

生活不止眼前, 还有诗和远方. end.

php : MVC 演示(使用单例工厂)的更多相关文章

  1. 如何将业务代码写得像诗一样(使用注解+单例+工厂去掉一大波if和else判断)

    1.订单控制器,提供一个根据商品id和银行渠道id计算商品折后价格的接口: import org.springframework.web.bind.annotation.GetMapping; imp ...

  2. asp.net mvc 中使用单例

    有这样一个service,需要运行的asp.net站点上,但要保证这个实例是唯一的.单例用来启用聊天机器人,保证唯一,以免启动多个,造成客户端发送消息的时候,会造成每个机器人都发送消息,app收到多条 ...

  3. 002-创建型-03-单例模式(Singleton)【7种】、spring单例及原理

    一.概述 保证一个类仅有一个实例,并提供一个全局访问点 私有构造器.线程安全.延迟加载.序列化和反序列化安全.反射攻击 1.1.适用场景 1.在多个线程之间,比如servlet环境,共享同一个资源或者 ...

  4. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  5. (原创)spring mvc和jersey rest 组合使用时单例对像实例化两次的BUG及解决办法

    项目中没用spring 的restTemplate 而是采用 jersey来做rest 的实现,一直用着,也没发现有什么不对,后来加入了,以quartz用硬编码方式实现,结果启动项目的时候报错 ,具体 ...

  6. 适配器、工厂模式、线程池、线程组、互斥锁、Timer类、Runtime类、单例设计模式(二十四)

    1.多线程方法 * Thread 里面的俩个方法* 1.yield让出CPU,又称为礼让线程* 2.setPriority()设置线程的优先级 * 优先级最大是10,Thread.MAX_PRIORI ...

  7. iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)

    关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...

  8. C#中的简单工厂和单例

    下面首先来说说简单工厂 举个例子: 首先是父类 public abstract class Pizza { public abstract string Info(); } } 子类 public c ...

  9. spring mvc 的Controller类默认Scope是单例(singleton)的

    使用Spring MVC有一段时间了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 说是因为线程安全问题,对于Spring MVC中bean默认都是(s ...

随机推荐

  1. sp_helpdb

    语法 sp_helpdb [ [ @dbname= ] 'name' ] 参数 [@dbname=] 'name' 是要为其提供信息的数据库名称.name 的数据类型为 sysname,无默认值.如果 ...

  2. Infinite V2 Release Note

    游戏地址 PLAY 玩法说明 - WASD 控制角色移动 - 按下J键 进入攻击模式(WASD 可以继续移动) 更新内容 - 完成角色锁定目标后边移动边攻击 开发心得 状态机的设计 最初的设计很乱, ...

  3. filter过滤器怎么写

    package com.wh.filter; import java.io.IOException;import javax.servlet.Filter;import javax.servlet.F ...

  4. com.caucho.hessian.io.HessianProtocolException: is unknown code 解决方案

    问题: Cannot access Hessian remote service at [http://....../remote/syllabusService]; nested exception ...

  5. 使用Cobbler无人值守安装CentOS6.5(一)

    Cobbler是一个快速网络安装linux的服务,而且在经过调整也可以支持网络安装windows.该工具使用python开发,小巧轻便(才15k行代码),使用简单的命令即可完成PXE网络安装环境的配置 ...

  6. java快速学习

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品 ...

  7. CSRF 攻击

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  8. mysql 卸载 linux

    root@localhost ~]# rpm -qa | grep -i mysqlMySQL-client-5.5.52-1.linux2.6.x86_64MySQL-server-5.5.52-1 ...

  9. Linux字符界面安装VMware tools

    以往用VMware虚拟机都是装的桌面版,无奈实验室电脑属于老爷机,跑桌面linux实在有点吃不消,只能装个Basic Server玩玩了... 在桌面环境下装VMwaretools很简单,直接点击VM ...

  10. htm5l,第一个script代码练习

    <body>    <canvas id="mycanvas" width="500" height="300">  ...