php : MVC 演示(使用单例工厂)

此例子是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>
View Code

 

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;
    }
}
?>
View Code

 

 

 

 

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

 

posted @ 2016-11-10 12:52  KeenLeung  阅读(796)  评论(0编辑  收藏  举报