php MVC

来源:http://www.cnblogs.com/huodaihao/archive/2017/06/24/7074230.html
-Advertisement-
Play Games

./Factory.class.php ./match_list_c.php ./MatchModel.class.php ./Model.class.php ./MySQLDB.class.php ./template/.htaccess Deny from All ./template/matc ...


-- 比賽
create table `match` (
m_id int unsigned primary key auto_increment,
t1_id int unsigned comment '球隊一ID',
t2_id int unsigned comment '球隊二ID',
t1_score int comment '球隊一進球',
t2_score int comment '球隊二進球',
m_time int comment '比賽時間 時間戳'
)charset=utf8;
insert into `match` values 
(null, 3, 4, 1, 2, unix_timestamp('2015-01-31 17:00:00')),
(null, 1, 2, 2, 3, unix_timestamp('2015-01-30 17:00:00')),
(null, 4, 2, 2, 0, unix_timestamp('2015-01-27 17:00:00')),
(null, 3, 1, 2, 0, unix_timestamp('2015-01-26 17:00:00')),
(null, 5, 4, 0, 2, unix_timestamp('2015-01-22 18:30:00')),
(null, 8, 5, 0, 1, unix_timestamp('2015-01-10 17:00:00')),
(null, 5, 7, 2, 1, unix_timestamp('2015-01-14 17:00:00')),
(null, 5, 6, 2, 1, unix_timestamp('2015-01-18 17:00:00'));

-- 球隊
create table `team` (
t_id int unsigned primary key auto_increment,
t_name varchar(20)
)charset=utf8;
insert into `team` values 
(1, '伊拉克'), (2, '阿聯酋'), (3, '南韓'), (4, '澳大利亞'), (5, '中國'), (6, '北韓'), (7, '烏茲別克'), (8, '沙特');

-- 運動員
create table `player` (
p_id int unsigned primary key auto_increment,
p_name varchar(20),
t_id int unsigned comment '球隊ID'
)charset=utf8;
insert into `player` values 
(null, '張琳芃', 5),(null, '郜林', 5),(null, '孫可', 5),(null, '王大雷', 5),(null, '吳曦', 5) ,(null, '於海', 5);


select * from `match` ;

select t1.t_name, m.t1_score, m.t2_score, m.t2_id, m.m_time from `match` as m left join `team` as t1 ON m.t1_id = t1.t_id;

select t1.t_name, m.t1_score, m.t2_score, t2.t_name, m.m_time from `match` as m left join `team` as t1 ON m.t1_id = t1.t_id  left join `team` as t2 ON m.t2_id=t2.t_id;


select t1.t_name as t1_name, m.t1_score, m.t2_score, t2.t_name as t2_name, m.m_time from `match` as m left join `team` as t1 ON m.t1_id = t1.t_id  left join `team` as t2 ON m.t2_id=t2.t_id;

 

./Factory.class.php

 

<?php

/**
* 項目中的工廠類
*/
class Factory {
/**
* 生成模型的單例對象
*
* @param $model_name string
* @return object
*/
public static function M($model_name) {
static $model_list = array();//存儲已經實例化好的模型對象的列表,下標模型名,值模型對象
//判斷當前模型是否已經實例化

if(!isset($model_list[$model_name])) {
//沒有實例化過
require './' . $model_name . '.class.php';
$model_list[$model_name] = new $model_name;//可變標誌符,可變類
}

return $model_list[$model_name];

}
}

 

 

./match_list_c.php

<?php
# 比賽列表
date_default_timezone_set('PRC');
header('Content-Type: text/html; charset=utf-8');

// 實例化相應的模型類對象,調用某個方法,實現固定功能
// require './MatchModel.class.php';
// $m_match = new MatchModel();
//通過工廠獲得對象
require './Factory.class.php';
$m_match = Factory::M('MatchModel');
$match_list = $m_match->getList();
// $m_match2 = Factory::M('MatchModel');

// 載入負責顯示的html文件
require './template/match_list_v.html';

 

 

./MatchModel.class.php

<?php
/**
* match表的操作模型類
*/
require_once './Model.class.php';
class MatchModel extends Model {
/**
* 獲得所有的比賽列表
*/
public function getList() {
//獲得比賽列表數據
$sql = "select t1.t_name as t1_name, m.t1_score, m.t2_score, t2.t_name as t2_name, m.m_time from `match` as m left join `team` as t1 ON m.t1_id = t1.t_id left join `team` as t2 ON m.t2_id=t2.t_id;";
return $this->_dao->getAll($sql);
}

/**
* 刪除某場比賽
*/
public function removeMatch($m_id) {
$sql = "delete from `match` where m_id=$m_id";
return $this->_dao->query($sql);
}

public function rmTeam($t_id) {
return $this->_dao->query("delete from `team` where t_id = $t_id");
}
}

 

 

./Model.class.php

<?php


/**
* 基礎模型類
*/
class Model {
protected $_dao;//存儲DAO對象的屬性,可以在子類方法中被訪問,使用DAO對象

/**
* 初始化DAO
*/
protected function _initDAO() {
//初始化MySQLDB
$config = array('host' => '127.0.0.1',    'port' => '3306', 'username'=>'root', 'password' => 'h0000dh@', 'charset'=>'utf8', 'dbname'=>'itcast');
require_once './MySQLDB.class.php';
$this->_dao = MySQLDB::getInstance($config);//$dao , Database Access Object 資料庫操作對象(dao層)
}

/**
* 構造方法
*/
public function __construct() {
// 初始化DAO
$this->_initDAO();
}
}

 

./MySQLDB.class.php

<?php
//類名,也習慣上(推薦)使用跟文件名相似的名字
//定義一個mysql連接類,該類可以連接mysql資料庫
//並實現其單例模式
//該類的功能還能夠完成如下基本mysql操作:
//執行普通的增刪改非返回結果集的語句
//執行select語句並可以返回3種類型的數據:
//多行結果(二維數組),單行結果(一維數組)
//單行單列(單個數據)
class MySQLDB{
public $host;
public $port;
public $username;
public $password;
public $charset;
public $dbname;

//連接結果(資源)
private static $link;

private $resourc;

public static function getInstance($config){
if(!isset(self::$link)){
self::$link = new self($config);
}
return self::$link;
}

//構造函數:禁止new
private function __construct($config){
//初始化數據
$this->host = isset($config['host']) ? $config['host'] : 'localhost';
$this->port = isset($config['port']) ? $config['port'] : '3306';
$this->username = isset($config['username']) ? $config['username'] : 'root';
$this->password = isset($config['password']) ? $config['password'] : '';
$this->charset = isset($config['charset']) ? $config['charset'] : 'utf8';
$this->dbname = isset($config['dbname']) ? $config['dbname'] : '';

//連接資料庫
$this->connect();
//設定連接編碼
$this->setCharset($this->charset);
//選定資料庫
$this->selectDb($this->dbname);
}
//禁止克隆
private function __clone(){}
//這裡進行連接
public function connect(){
$this->resourc = mysql_connect("$this->host:$this->port", "$this->username","$this->password") or die("連接資料庫失敗!");
}
public function setCharset($charset){
mysql_set_charset($charset, $this->resourc); 
}
public function selectDb($dbname){
mysql_select_db($dbname, $this->resourc);
}

/**
* 功能:執行最基本(任何)sql語句
* 返回:如果失敗直接結束,如果成功,返回執行結果
*/
public function query($sql){
if(!$result = mysql_query($sql, $this->resourc))
{
echo ("<br />執行失敗。");
echo "<br />失敗的sql語句為:" . $sql;
echo "<br />出錯信息為:" . mysql_error();
echo "<br />錯誤代號為:" . mysql_errno();
die();
}
return $result;
}
/**
* 功能:執行select語句,返回2維數組
* 參數:$sql 字元串類型 select語句
*/
public function getAll($sql){
$result = $this->query($sql);
$arr = array();    //空數組
while( $rec = mysql_fetch_assoc( $result )){
$arr[] = $rec;//這樣就形成二維數組
}
return $arr;
}
//返回一行數據(作為一維數組)
public function getRow($sql){
$result = $this->query($sql);
//$rec = array();
if( $rec2 = mysql_fetch_assoc( $result )){//返回下標為欄位名的數組
//如果fetch出來有數據(也就是取得了一行數據),結果自然是數組
return $rec2;
}
return false;
}
//返回一個數據(select語句的第一行第一列)
//比如常見的:select count(*) as c from XXX where ...
public function getOne($sql){
$result = $this->query($sql);
$rec = mysql_fetch_row($result);//返回下標為數字的數組,且下標一定是0,1,2, 3.....
//如果沒有數據,返回false
if($result === false){
return false;
}
return $rec[0];    //該數組的第一項。

}
}

 

./template/.htaccess

Deny from All

./template/match_list_v.html

<!-- 模板文件,利用HTML代碼展示數據 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>比賽列表</title>
</head>
<body>

<table>
<tr>
<th>球隊一</th><th>比分</th><th>球隊二</th><th>時間</th>
</tr>
<?php foreach($match_list as $row) : ?>
<tr>
<td><?php echo $row['t1_name'];?></td>
<td><?php echo $row['t1_score'];?>:<?php echo $row['t2_score'];?></td>
<td><?php echo $row['t2_name'];?></td>
<td><?php echo date('Y-m-d H:i', $row['m_time']);?></td>
</tr>
<?php endForeach;?>
</table>    
</body>
</html>

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 滑鼠事件監聽機制的三個方面: 1.事件源對象: 事件源對象就是能夠產生動作的對象。在Java語言中所有的容器組件和元素組件都是事件監聽中的事件源對象。Java中根據事件的動作來區分不同的事件源對象,動作發生在哪個組件上,那麼該組件就是事件源對象 2.事件監聽方法: addMouseListener( ...
  • 我們在flask的學習中,會難免遇到多對多表的查詢,今天我也遇到了這個問題。那麼我想了好久。也沒有想到一個解決的辦法,試了幾種方法,可能是思路的限制我放棄了,後來,我就在網上百度,可是發現百度出來的結果和自己想要的還有一定的差距,那麼我根據百度上得來的思路,那麼我也對我的數據結構進行了探索, 下麵來 ...
  • java中的map遍歷有多種方法,從最早的Iterator,到java5支持的foreach,再到java8 Lambda,讓我們一起來看下具體的用法以及各自的優缺點 先初始化一個map keySet values 如果只需要map的key或者value,用map的keySet或values方法無疑 ...
  • 開發環境信息 1、基本環境信息如下: [root@localhost lib] cat /etc/os release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PR ...
  • 題目描述 博艾市將要舉行一場汽車拉力比賽。 賽場凹凸不平,所以被描述為M*N的網格來表示海拔高度(1≤ M,N ≤500),每個單元格的海拔範圍在0到10^9之間。 其中一些單元格被定義為路標。組織者希望給整個路線指定一個難度繫數D,這樣參賽選手從任一路標到達別的路標所經過的路徑上相鄰單元格的海拔高 ...
  • Course Schedule 選課方案問題,題目說的很清楚了就是bfs或者dfs,然後加個字典優化,弄了好久沒弄出來··網上查的演算法··提交的是bfs的演算法,dfs的演算法給的用例好像是遞歸太深了· python編譯器直接崩了··本地調試也是直接崩了·· bfs的核心是用一個數組記錄每個數字的深度· ...
  • 題目描述 魯賓遜先生有一隻寵物猴,名叫多多。這天,他們兩個正沿著鄉間小路散步,突然發現路邊的告示牌上貼著一張小小的紙條:“歡迎免費品嘗我種的花生!――熊字”。 魯賓遜先生和多多都很開心,因為花生正是他們的最愛。在告示牌背後,路邊真的有一塊花生田,花生植株整齊地排列成矩形網格(如圖1)。有經驗的多多一 ...
  • 1. JVM簡介 初識JVM JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的電腦,是通過在實際的電腦上模擬模擬各種電腦功能來實現的。 Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機是實現這一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...