PHP之MVC學習

代碼架構進貨過程 php

one,混編

嵌入式腳本語言PHP
html與php混編的編碼方式 css

two,顯示和邏輯相分離

最後,須要將顯示和邏輯的結果放在一塊兒!
須要在 php頁面,將html代碼 載入才能夠!html

<?php // 業務邏輯部分 // 獲得數據 //獲得全部的比賽信息 mysql_connect('127.0.0.1:3306', 'root', '123456'); mysql_query('set names utf8'); mysql_query('use itcast'); $sql = "select p1.id as p1_id, p2.id as p2_id, m.match_time, p1.stu_name as p1_name, m.match_result, p2.stu_name as p2_name from select_match as m left join select_student as p1 on m.player_1=p1.id left join select_student as p2 on m.player_2=p2.id"; $result = mysql_query($sql); while($row=mysql_fetch_assoc($result)) { $rows[] = $row; } //載入 負責顯示的html代碼 require './template/match_list.html';

模板文件
注意當前的html頁面,出現:顯示格式部分由html代碼充當,而數據部分須要經過php來實現。數據,特指數據的展現。(數據的得到實在負責邏輯的php代碼中完成)
這樣的html文件,就被稱之爲模(mu)板文件(template)java

限制用戶訪問php邏輯文件
辦法多得是,典型的兩種: mysql

1,.htaccess
deny from all
利用Apache的對訪問的控制,將某個目錄設置成禁止訪問。將全部的模板都放入到目錄內!
注意,htaccess生效的前提是,Apache對目錄開啓了allowoverride :sql

<Directory "D:\amp\apache\htdocs\test">
     DirectoryIndex index.php
     AllowOverride All
     Allow from all     
</Directory>

2,將不容許用戶訪問的文件,包含模板文件,都放置文檔根目錄以外!
瀏覽器請求只能看到文檔根目錄下的文件。數據庫

three,處理數據(處理業務邏輯的代碼),從php代碼中分離

即MVC架構 apache

mvc,項目的分層思想,指的是完成一個業務邏輯,須要三大部分,分別是:
1,具體的業務邏輯實現的部分,數據操做,稱之爲 M,Model,模型!
2,具體顯示樣式的實現部分,html+css+js,稱之爲 V,View,視圖!
3,負責總體流程控制的部分,負責調用M和V。成爲 C,Controller,控制器! 數組

模型類
模型的處理最終都是要處理數據庫的,創建一個數據庫工具類 瀏覽器

<?php
/** * mysql數據操做類 */
class MySQLDB {
    //屬性
    //對象的初始化屬性
    private $host;
    private $port;
    private $user;
    private $pass;
    private $charset;
    private $dbname;

    //運行時生成的屬性
    private $link;
    private $last_sql;//最後執行的SQL

    private static $instance;//當前的實例對象

    /** * 構造方法 * @access private * * @param $params array 對象的選項 */
    private function __construct($params = array()) {

        //初始化 屬性
        $this->host = isset($params['host']) ? $params['host'] : '127.0.0.1';
        $this->port = isset($params['port']) ? $params['port'] : '3306';
        $this->user = isset($params['user']) ? $params['user'] : 'root';
        $this->pass = isset($params['pass']) ? $params['pass'] : '';
        $this->charset = isset($params['charset']) ? $params['charset'] : 'utf8';
        $this->dbname = isset($params['dbname']) ? $params['dbname'] : '';

        //鏈接數據庫
        $this->connect();
        //設置字符集
        $this->setCharset();
        //設置默認數據庫
        $this->selectDB();

    }
    /** * 克隆 * @access private */
    private function __clone() {
    }
    /** * 得到單例對象 */
    public static function getInstance($params) {
        if (! (self::$instance instanceof self) ) {
            //實例化時,須要將參數傳遞到構造方法內
            self::$instance = new self($params);
        }
        return self::$instance;
    }

    /** * 鏈接數據庫 */
    private function connect() {
        if(!$link = mysql_connect("$this->host:$this->port", $this->user, $this->pass)) {//$this->host . ':' . $this->port
            echo '鏈接失敗,請檢查mysql服務器,與用戶信息';
            die;
        } else {
            //鏈接成功,記錄鏈接資源
            $this->link = $link;
        }
    }

    /** * 設置字符集 */
    private function setCharset() {
        $sql = "set names $this->charset";
        return $this->query($sql);
    }

    /** * 設置默認數據庫 */
    private function selectDB() {
        //判斷是否存在一個數據庫名
        if($this->dbname === '') {
            return ;
        }

        $sql = "use `$this->dbname`";
        return $this->query($sql);
    }

    /** * 執行SQL的方法,PHPDocumentor * * @param $sql string 待執行的SQL * * @return mixed 成功返回 資源 或者 true,失敗,返回false */
    public function query($sql) {
        $this->last_sql = $sql;
        //執行,並返回結果
        if(!$result = mysql_query($sql, $this->link)) {
            echo 'SQL執行失敗<br>';
            echo '出錯了SQL是:', $sql, '<br>';
            echo '錯誤代碼是:', mysql_errno($this->link), '<br>';
            echo '錯誤信息是:', mysql_error($this->link), '<br>';
            die;
            return false;//象徵性的!
        } else {
            return $result;
        }
    }

    /** * @param $sql string 待執行的sql * @return array 二維 */
    public function fetchAll($sql) {
        //執行
        if ($result = $this->query($sql)) {
            //成功
            //遍歷全部數據,造成一個二維數組
            $rows = array();//初始化
            while($row = mysql_fetch_assoc($result)) {
                $rows[] = $row;
            }
            //釋放結果集
            mysql_free_result($result);
            return $rows;  
        } else {
            //執行失敗
            return false;
        }
    }

    /** * 執行SQL,得到符合條件的第一條記錄 * * @param $sql string 待執行的SQL * * @return array 一維數組 */
    public function fetchRow($sql) {
        if ($result = $this->query($sql)) {
            $row = mysql_fetch_assoc($result);
            mysql_free_result($result);
            return $row;
        } else {
            return false;
        }
    }

    /** * 利用一個SQL,返回符合條件的第一條記錄的第一個字段的值 * * @param $sql string 待執行的SQL * * @return string 執行結果 */
    public function fetchColumn($sql) {
        if ($result = $this->query($sql) ) {
            if ($row = mysql_fetch_row($result)) {//row返回的是索引數組,所以0元素,必定是第一列
                mysql_free_result($result);
                return $row[0];
            } else {
                return false;
            }
        } else {
            return false;
        }
    }



    /** * 在序列化時被調用 * * 用於負責指明哪些屬性須要被序列化 * * @return array */
    public function __sleep() {
        return array('host', 'port', 'user', 'pass', 'charset', 'dbname');
    }

    /** * 在反序列化時調用 * * 用於 對對象的屬性進行初始化 */
    public function __wakeup() {
        //鏈接數據庫
        $this->connect();
        //設置字符集
        $this->setCharset();
        //設置默認數據庫
        $this->selectDB();
    }

}

創建一個model父類處理數據

<?php

/** * 模型的基礎類 */
class Model {
    protected $db;//保存MySQLDB類的對象

    /** * 構造方法 */
    public function __construct() {
        //鏈接數據庫
        $this->initLink();
    }

    /** * 初始化數據庫的鏈接 */
    protected function initLink() {
        require './MySQLDB.class.php';
        $options = array(
            'host'=>'127.0.0.1',
            'port'=>'3306',
            'user'=>'root',
            'pass'=>'123456',
            'charset'=>'utf8',
            'dbname'=>'test'
        );
        $this->db = MySQLDB::getInstance($options);

// mysql_connect('127.0.0.1:3306', 'root', '123456');
// mysql_query('set names utf8');
// mysql_query('use itcast');
    }
}

子類繼承它並獲得相應數據

<?php require_once './Model.class.php'; class ClassModel extends Model { public function getList() { // mysql_connect('127.0.0.1:3306', 'root', '123456'); // mysql_query('set names utf8'); // mysql_query('use itcast'); $sql = "select c.*, count(s.id) as s_count from select_class as c left join select_student as s on c.class_id=s.class_id group by c.class_id"; return $this->db->fetchAll($sql); // $result = mysql_query($sql); // while($row=mysql_fetch_assoc($result)) { // $rows[] = $row; // } // return $rows; } }

在Controller中調用便可

<?php //調用模型得到數據 require './ClassModel.class.php'; $model_class = new ClassModel; $rows = $model_class->getList(); //調用視圖顯示數據 require './template/class_view.html';

控制器的處理

每增長一個功能,都要增長一個控制器,加入模塊的概念,表示操做的集合。

<?php // 班級管理模塊 // 全部班級的功能,全都放在該文件中完成! $action = isset($_GET['a']) ? $_GET['a'] : 'list'; if ('list' == $action) { //功能一:班級列表操做 //調用模型得到數據 require './ClassModel.class.php'; $model_class = new ClassModel; $rows = $model_class->getList(); //調用視圖顯示數據 require './template/class_view.html'; } elseif ('del' == $action) { //功能二:班級刪除功能 //刪除班級的控制器 //獲得須要刪除的ID //要利用模型,將相應的數據刪除 require './ClassModel.class.php'; $model_class = new ClassModel; $model_class->delClass($_GET['id']); //不須要視圖,直接返回列表頁面便可 header('Location: class_controller.php'); } elseif ('N' == $action) { //功能N: } else { header('Location: class_module.php'); }

控制器類
將剛剛所完成一個控制器模塊文件,升級成一個控制器類

<?php class ClassController { public function listAction() { //調用模型得到數據 require './ClassModel.class.php'; $model_class = new ClassModel; $rows = $model_class->getList(); //調用視圖顯示數據 require './template/class_view.html'; } public function delAction() { require './ClassModel.class.php'; $model_class = new ClassModel; $model_class->delClass($_GET['id']); //不須要視圖,直接跳轉返回列表頁面便可 header('Location: index.php?a=list'); } }

利用index.php做爲程序的入口

<?php //肯定當前的控制器類 $c = isset($_GET['c']) ? $_GET['c'] : 'Class'; $controller_name = $c . 'Controller'; //實例化控制器類,調用Action方法執行 //require './ClassController.class.php'; require './' . $controller_name . '.class.php'; $controller = new $controller_name;//可變類名的語法 //調用? $action = isset($_GET['a']) ? $_GET['a'] : 'list'; $action_name = $action . 'Action'; $controller->$action_name();//利用了可變函數
相關文章
相關標籤/搜索