日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP之MVC学习

發布時間:2024/7/23 php 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP之MVC学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

代碼架構進貨過程

one,混編

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

two,顯示和邏輯相分離

最后,需要將顯示和邏輯的結果放在一起!
需要在 php頁面,將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)

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

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

<Directory "D:\amp\apache\htdocs\test">DirectoryIndex index.phpAllowOverride AllAllow from all </Directory>

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

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

即MVC架構

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;//最后執行的SQLprivate 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->portecho '連接失敗,請檢查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');} }

子類繼承它并得到相應數據

<?phprequire_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'); }

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

<?phpclass 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();//利用了可變函數

總結

以上是生活随笔為你收集整理的PHP之MVC学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。