此例子是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. STM32 assert_param

    在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用.如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义 ...

  2. hashmap的底层实现

    HashMap的底层实现都是数组+链表结构实现的,添加.删除.获取元素都是先计算hash值,根据hash值和table.length计算出index也就是table的数组的下标,然后进行相应的操作. ...

  3. 1-MySQL命令行

    0.显示数据库 show databases; 1.选择数据库 use 数据库名; 2.显示数据库中的表 show tables; 3.显示数据表的结构 describe 表名; 4.显示表中记录 S ...

  4. 基于webpack使用ES6新特性(转载)

    本文转载自: http://www.tuicool.com/articles/vye2ea6

  5. Android 开发基础及环境配置

    2011年买了第一部安卓操作系统的手机,当时势头正盛的HTC不可思议(incredible),当时的想法就是想学习下智能手机开发,但是由于各种原因,客观上是公司的项目太忙了,忙于项目管理.团队建设.客 ...

  6. rdesktop的使用方法

    工作时一般是开两台电脑 ,一台linux,一台windows,以前也用过虚拟机什么的,但是 有时候 跑起来拖泥带水的十分不爽,所以慢慢的就习惯了两台电脑的工作方式,一般我大部时间都在linux下面.用 ...

  7. 4.Git的安装

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...

  8. python之编写购物车(第二天)

    作业: 编写购物车 具体实现了如下功能: 1.可购买的商品信息显示 2.显示购物车内的商品信息.数量.总金额 3.购物车内的商品数量进行增加.减少和商品的删除 4.用户余额的充值 5.用户购买完成进行 ...

  9. CSS、HTML5、JS

    [att*=value]{}包含value属性的所有元素样式.[id*=div]{} a[href$=jpg]:after{} [att^=value]{}开头字符包含value属性的所有元素样式 [ ...

  10. [转]SSAS没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) (Microsoft Visual Studio)的解决办法

    转自:http://www.cnblogs.com/xvqm00/archive/2011/07/15/2107338.html 打开SSAS 数据源视图浏览数据时,提示 没有注册类别 (异常来自 H ...