四、session、cookie實(shí)戰(zhàn)之登錄功能mvc結(jié)構(gòu)

該項(xiàng)目文件結(jié)構(gòu)簡單,根據(jù)MVC設(shè)計(jì)思想,使用函數(shù)式編程,未使用類和面向?qū)ο缶幊?,簡化框架結(jié)構(gòu),輕量展示MVC編程結(jié)構(gòu)。使用原生php,實(shí)現(xiàn)注冊、登錄和筆記列表展示,可以加深session cookie工作原理的理解

項(xiàng)目源碼:https://github.com/onerole1024/functionmvc.git

mvc.jpg

index.php 是入口文件

引入使用mvc結(jié)構(gòu)的函數(shù)和工具【公共】函數(shù),并接收參入的參數(shù)c和a代表請求的控制器和動作方法,然后調(diào)用make函數(shù)調(diào)用控制器下的某個控制器中的某個方法處理這次請求。

<?php
include_once ('mvc.php');
include_once ('tool.php');
session_start();

if(isset($_GET['c']) && $_GET['c']){
  $control = $_GET['c'];
  unset($_GET['c']);
}else{
  $control ='welcome';
}


if(isset($_GET['a']) && $_GET['a']){
  $action = $_GET['a'];
  unset($_GET['a']);
}else{
  $action ='index';
}


try{
  make($control,$action);
}catch(Exception $e){
  make('error','index',array('except'=>$e));
}




?>

controls文件夾包含了所有控制器,welcome.php是默認(rèn)控制器,該控制器只有一個index方法,只設(shè)置了下頁面title,然后調(diào)用show方法,渲染views目錄下的視圖。

<?php

function index($control,$data){
    $data['pageTitle'] = '歡迎';
    show($control.'/index',$data);
}


?>

views文件夾里面都是視圖文件,文件夾的命名為控制器的名稱,方便管理。如何將控制器中的變量渲染到視圖文件使用了一個函數(shù)extract($data);以下是welcome.php控制器中index方法渲染的視圖文件index.php

歡迎來學(xué)習(xí)這個小小記事本項(xiàng)目,<?php echo url('./?c=user&a=reg','注冊');?>之后才可以查看自己的記事本<br/>
已有賬戶,<?php echo url('./?c=user&a=login','登錄');?>查看

視圖的頭部和腳部都不在每個視圖文件中,而在layout文件夾中,只要一前一后include 進(jìn)來就可以實(shí)現(xiàn)將每個頁面公共一樣的部分提取出來,方便管理。

welcome.php控制器中沒什么邏輯處理,但像user.php或者article.php控制器,需要對數(shù)據(jù)庫進(jìn)行操作,我們借助models文件夾下的相應(yīng)model來實(shí)現(xiàn)具體數(shù)據(jù)庫操作。例如article.php,我們使用mvc.php文件中的data方法實(shí)現(xiàn)db.php數(shù)據(jù)庫連接函數(shù)文件引入和models下相應(yīng)model文件引入。

function data($model){
    require_once ('db.php');
    $url = './models/'.$model.'.php';
    if (file_exists($url)) {
        include ($url);
    }else{
        throw new Exception('找不到該模型',404);
    }

}
<?php

function arlists($uid){
  $conn = db_connect();
  $result = $conn->query("select * from article where uid=".$uid);
  if (!$result) {
    return false;
  }

  $articles = array();
  while ($row = $result->fetch_assoc()) {
    $articles[] =$row;
  }
  $conn->close();
  return $articles;

}

?>

采用try catch 捕獲異常,錯誤手動拋出異?!?throw new Exception('連接不上數(shù)據(jù)庫');】,在入口文件中進(jìn)行異常捕獲,渲染錯誤頁面,列出錯誤信息

try{
  make($control,$action);
}catch(Exception $e){
  make('error','index',array('except'=>$e));
}


錯誤碼:<?php  echo $except->getCode();?><br/>
錯誤信息:<?php  echo $except->getMessage();?><br/>
錯誤文件:<?php  echo $except->getFile();?><br/>
錯誤行:<?php  echo $except->getLine();?>

這個mvc登錄小項(xiàng)目包含的數(shù)據(jù)庫結(jié)構(gòu)如下

create database login DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
use login;

create table user  (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(16) NOT NULL,
  `password` char(60) NOT NULL,
  `email` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用戶表';

create table article  (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL,
  `content` text DEFAULT NULL,
  `createtime` int(11) DEFAULT NULL,
  `updatetime` int(11) DEFAULT NULL,
  `uid` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='文章表';


-- 創(chuàng)建名為freeuser的用戶,%表示可以遠(yuǎn)程操作,ip不限。
CREATE USER 'freeuser'@'%' IDENTIFIED BY 'free99';
-- 分配login庫的所有權(quán)限給freeuser用戶
GRANT ALL PRIVILEGES ON login.* TO 'freeuser'@'%';

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容