이 글은 주로 PHP 소스 코드에서 단일 항목 MVC 구조를 구현하는 방법을 소개합니다. 이제 이를 모든 사람과 공유합니다. 도움이 필요한 친구들은 이를 참조할 수 있습니다.
주로:
MVC 디렉토리 구조
데이터베이스 도구 클래스 제작
공용 모델 클래스 및 공용 컨트롤러 클래스 생성
--------------:-------------------------------------- blog ├─index.php 入口文件 ├─Model 模型 │ └─UserModel.class.php 用户模型类 ├─View 视图 │ └─login.html 登录表单页面 ├─Controller 控制器 │ └─UserController.class.php 用户控制器 ├─Frame 公共使用的类 │ ├─BaseModel.class.php 数据库连接类 │ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转) │ └─Db.class.php 数据库操作工具类 └─Public 静态公共文件(js,css,images) ├─js/ js文件 ├─css/ css样式文件 └─images img图片 -----------------------------------------------------------------
1) 준비: 브랜치 생성
1 $ git checkout master2 $ git checkout -b "mvc-dbtools-base"
2) 디렉토리 구조 생성:
MV C 디렉토리 : Model/ Controller/ View/
정적 리소스 디렉터리: Public/
3) 프로젝트 항목 파일 생성 [index.php]
원본 login.php의 인코딩 헤더를 복사합니다(...)
컨트롤러 UserController 및 모델 UserModel
1 <?php 2 /** 3 * 入口文件 4 */ 5 header("content-type:text/html;charset=utf-8"); 6 7 require_once('Model/UserModel.class.php'); 8 require_once 'Controller/UserController.class.php'; 9 10 //实例化控制器 11 $userCtr = new UserController(); 12 13 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; 14 15 $userCtr -> $a();
4) 컨트롤러 UserController 생성 [Controller/UserController.class.php]
1 <?php 2 /** 3 * UserController.class.php 用户控制器 4 */ 5 6 class UserController { 7 /** 8 * 展示登录界面 9 * @access public 10 */ 11 public function login() 12 { 13 include "View/login.html"; 14 } 15 16 /** 17 * 登录操作: 校验登录信息 18 */ 19 public function dlogin() 20 { 21 //接收登录信息 22 $data = array(); 23 $data['username'] = trim($_POST['username']); 24 $data['pwd'] = trim($_POST['pwd']); 25 26 //实例化模型,调用模型方法,校验用户名和密码 27 $model = new UserModel(); 28 $result = $model->checkLoginInfo($data); 29 30 //结果提示信息 31 if($result){ 32 exit('登录成功'); 33 } else { 34 echo "用户名或密码不正确!"; 35 header('refresh:3; url=?'); 36 } 37 } 38 }
5) 사용자 모델 클래스 UserModel 생성 [Model/UserModel.class.php]
구현 방법: checkLoginInfo() 사용자 이름 및 비밀번호 확인
<?php/** * UserModel.class.php * 用户模型类-操作表pbg_users */class UserModel { /** * 检验登录信息 * @param array $data 用户提交的登录信息 * @return bool true-校验成功 false-校验失败 */ public function checkLoginInfo($data) { //连接数据库 $conn = @mysql_connect('localhost','root','root') or die('连接数据库失败!'); mysql_query('set names utf8',$conn); mysql_query('use web',$conn); //查询数据库 $sql = "select username,pwd from pbg_users where username='{$data['username']}'"; $res = mysql_query($sql,$conn); //登录结果提示信息 if($res !== false){ $user = mysql_fetch_array($res); if( $user['pwd'] == md5($data['pwd']) ){ return true; } } return false; } }
사용자 모델 클래스 보기
6) 로그인 보기: [view/login.html]
소개 경로 수정,
양식 제출 동작 수정: action=?a=dlogin
1 <!DOCTYPE html> 2 <html lang="zh-CN"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>登录</title> 6 <link rel="stylesheet" type="text/css" href="public/layui/css/layui.css"> 7 <link rel="stylesheet" type="text/css" href="public/css/style.css"> 8 </head> 9 <body> 10 <p class="container"> 11 <p class="content"> 12 <form action="?a=dlogin" class="layui-form" method="post"> 13 <p class="layui-form-item"> 14 <h2>登录</h2> 15 </p><hr> 16 17 <p class="layui-form-item"> 18 <label class="layui-form-label">用户名:</label> 19 <p class="layui-input-block"> 20 <input type="text" name="username" class="layui-input" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" > 21 </p>22 </p>23 24 <p class="layui-form-item">25 <label class="layui-form-label">密 码:</label> 26 <p class="layui-input-block">27 <input type="password" name="pwd" required lay-verify="required" placeholder="请输入密码" class="layui-input"> 28 </p>29 </p>30 31 <p class="layui-form-item"> 32 <p class="layui-input-block"> 33 <button lay-submit class="layui-btn">登录</button> 34 <button type="reset" class="layui-btn layui-btn-primary">重置</button> 35 </p>36 </p>37 </form>38 </p>39 </p>40 <script type="text/javascript" src="public/layui/layui.js"></script>41 <script> 42 layui.use('form', function(){43 var form = layui.form;44 });45 </script>46 </body>47 </html>
로그인 보기 소스 코드 보기
데이터베이스 연결 작업은 모두 모델에 있으며, 이를 추출하여 데이터베이스 작업 도구 클래스를 만들 수 있습니다.
데이터베이스 연결, 인코딩 설정, 데이터베이스 선택
implement Singleton
get 한 행의 데이터 getOneRow, 단일 배열 getOneData, 여러 행 가져오기 getAllRows, 추가, 삭제, 수정 exec
자동으로 삽입 또는 업데이트 문 생성 autoExecute()
【Frame/Db.class. php】
1 <?php 2 /** 3 * Db.class.php 数据库操作工具类 4 * @author young 5 */ 6 7 class Db 8 { 9 private $host; //主机 10 private $user; //用户名 11 private $pwd; //密码 12 private $port; //端口 13 private $charset; //编码 14 private $dbname; //数据库 15 16 private $link=null; //存储数据库资源 17 private static $instance=null; //存储本类实例对象 18 19 /** 20 * 构造方法: 保存数据库连接信息,连接数据库 21 * @access private 22 * @param array $conf 数据库连接信息 23 */ 24 private function __construct($conf) 25 { 26 $this->host = !empty($conf['host']) ? $conf['host'] : 'localhost'; 27 $this->user = !empty($conf['user']) ? $conf['user'] : 'root'; 28 $this->pwd = !empty($conf['pwd']) ? $conf['pwd'] : 'root'; 29 $this->port = !empty($conf['port']) ? $conf['port'] : '3306'; 30 $this->charset = !empty($conf['charset']) ? $conf['charset'] : 'utf8'; 31 $this->dbname = !empty($conf['dbname']) ? $conf['dbname'] : 'web'; 32 33 $this->connect(); 34 } 35 36 /** 37 * 连接数据库,设置编码,选库 38 * @access private 39 */ 40 private function connect() 41 { 42 $this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") or die('连接失败!'.mysql_error()); 43 $this->setCharset($this->charset); 44 $this->useDb($this->dbname); 45 } 46 /** 47 * 设置字符便 48 * @access public 49 * @param string $char 字符编码 50 */ 51 public function setCharset($char) 52 { 53 $this->query("set names $char"); 54 } 55 /** 56 * 选择数据库 57 * @access public 58 * @param string $dbname 数据库名称 59 */ 60 public function useDb($dbname) 61 { 62 $this->query("use $dbname"); 63 } 64 65 /** 66 * 执行sql语句 67 * @param string $sql sql语句 68 * @return mixed 69 */ 70 private function query($sql) 71 { 72 $result = mysql_query($sql, $this->link); 73 if(false === $result) { 74 echo "<p>sql执行失败!<br>"; 75 echo "<br>失败语句:".$sql; 76 echo "<br>错误代号".mysql_errno(); 77 echo "<br>错误提示: ".mysql_error()."</p>"; 78 exit(); 79 } 80 return $result; 81 } 82 83 /** 84 * 获取本类实例 85 * @access public 86 * @param array $conf 数据库连接信息 87 * @return object 本类的单例对象 88 */ 89 public static function getDb($conf) 90 { 91 if(false === (static::$instance instanceof static)){ 92 static::$instance = new static($conf); 93 } 94 return static::$instance; 95 } 96 /** 97 * 禁止克隆 98 */ 99 public function __clone() 100 { 101 102 } 103 /** 104 * 关闭数据库连接 105 * @access public 106 */ 107 public function closeDb() 108 { 109 mysql_close($this->link); 110 } 111 112 public function exec($sql) 113 { 114 $result = $this->query($sql); 115 return $this->affectedRows(); 116 117 } 118 /** 119 * 受影响的行数 120 * @return int 返回受影响的行数 121 */ 122 private function affectedRows() 123 { 124 return mysql_affected_rows($this->link); 125 } 126 127 /** 128 * 执行 “返回一行数据”的查询 129 * @param string $sql sql语句 130 * @return array 一维数组(一行) 131 */ 132 public function getOneRow($sql) 133 { 134 $result = $this->query($sql); 135 $data = mysql_fetch_assoc($result); 136 mysql_free_result($result); 137 return $data; 138 } 139 /** 140 * 执行 "返回多行数据" 的查询 141 * @param string $sql sql语句 142 * @return array 二维数组 143 */ 144 public function getAllRows($sql) 145 { 146 $result = $this->query($sql); 147 $data = array(); 148 while($row = mysql_fetch_assoc($result)){ 149 $data[] = $row; 150 } 151 mysql_free_result($result); 152 return $data; 153 } 154 /** 155 * 执行“获取一个数据”的查询 156 * @param string $sql sql语句 157 * @return mixed 标量数据值 158 */ 159 public function getOneData($sql) 160 { 161 $result = $this->query($sql); 162 $data = mysql_fetch_row($result); 163 mysql_free_result($result); 164 return $data[0]; 165 } 166 167 /** 168 * 上次insert时的自增长id值 169 * @return int insert时的id值 170 */ 171 public function getInsertId() 172 { 173 return mysql_insert_id($this->link); 174 } 175 176 /** 177 * 序列化时,对指定数据进行序列化 178 * @return array 指定进行序列化的数据 179 */ 180 public function __sleep() 181 { 182 return array('host', 'port', 'user', 'pass','charset', 'dbname'); 183 } 184 /** 185 * 反序列化时,使用相应数据连接数据库 186 */ 187 public function __wakeup() 188 { 189 $this->connect(); //连接数据库 190 } 191 /** 192 * 自动生成insert语句或update语句 193 * @param array $data insert或update的数据 194 * @param string $table 操作的数据表 195 * @param string $act 是update还是insert操作 196 * @param string $where where条件 如 id=2 如果是update必须加,否则不执行直接返回false 197 * @return bool 执行insert与update的结果 198 */ 199 public function autoExecute($data, $table, $act='insert', $where='') 200 { 201 if($act == 'insert') { 202 $sql = "insert into ".$table."("; 203 $sql .=implode(",", array_keys($data)); 204 $sql .= ") values ('"; 205 $sql .= implode("','", array_values($data)); 206 $sql .= "')"; 207 208 $res = $this->exec($sql); 209 return $this->getInsertId(); 210 211 } else if($act == 'update') { 212 if(!$where) { return false; } 213 $sql = 'update '.$table.' set '; 214 foreach ($data as $k => $v) { 215 $sql .= $k."='".$v."',"; 216 } 217 $sql = substr($sql, 0, -1); 218 $sql .= ' where '.$where; 219 220 return $this->exec($sql); 221 } else { 222 return false; 223 } 224 225 } 226 }
툴 클래스 보기 클릭
1) 퍼블릭 모델 클래스 [Frame/BaseModel.class.php] 데이터베이스 운영 툴 클래스 인스턴스 가져오기
1 <?php 2 3 /** 4 * BaseModel.class.php 基础模型类 5 * 连接数据库 6 */ 7 class BaseModel 8 { 9 protected $db = null; 10 /** 11 * 构造方法: 实例化数据库类 12 * @access public13 * @param array $config 数据库配置信息 14 */ 15 function __construct(array $config=null) 16 { 17 $conf = array( 18 'host'=>'localhost', 19 'user'=>'root', 20 'pwd'=>'root', 21 'port'=>'3306', 22 'charset'=>'utf8', 23 'dbname'=>'web', 24 ); 25 $conf = empty($config)? $conf : array_merge($conf,$config); 26 $this->db = Db::getDb($conf); 27 } 28 }
2) 공용 컨트롤러 클래스 [Frame/BaseController]:
Unified Coding
프롬프트 메시지 점프
1 <?php 2 /** 3 * BaseController.class.php 公共控制器 4 * @author young 5 */ 6 7 class BaseController 8 { 9 /** 10 * 统一编码utf8 11 */ 12 public function __construct() 13 { 14 header("content-type:text/html;charset=utf-8"); 15 session_start(); 16 } 17 18 /** 19 * 跳转提示 20 * @access public 21 * @param string $msg 跳转提示信息 22 * @param string $url 跳转的地址 23 * @param integer $time 等待时间 秒数 24 */ 25 public function msg($msg='', $url='?', $time=3) 26 { 27 echo "<p><a href='$url'>返回</a></p>页面将在{$time}秒之后跳转!!"; 28 header("refresh: $time; url=$url"); 29 exit("<p><span style='color:red'>$msg</span></p>"); 30 } 31 }
3) 도구 클래스, 기본 모델 및 기본 컨트롤러 클래스를 항목 파일에 도입
[index.php]
1 <?php 2 /** 3 * 入口文件 4 */ 5 require_once 'Frame/Db.class.php'; 6 require_once 'Frame/BaseModel.class.php'; 7 require_once('Model/UserModel.class.php'); 8 require_once 'Frame/BaseController.class.php'; 9 require_once 'Controller/UserController.class.php'; 10 11 //实例化控制器 12 $userCtr = new UserController(); 13 14 $a = !empty($_GET['a']) ? $_GET['a'] : 'login'; 15 16 $userCtr -> $a();
항목 파일을 보려면 클릭하세요
4) 사용자 모델 클래스 최적화 【Model/UserModel.class.php】
1 <?php 2 3 /** 4 * UserModel.class.php 5 * 用户模型类-操作表pbg_users 6 */ 7 class UserModel extends BaseModel 8 { 9 /** 10 * 检验登录信息 11 * @param array $data 用户提交的登录信息 12 * @return bool true-校验成功 false-校验失败 13 */ 14 public function checkLoginInfo($data) 15 { 16 $sql = "select id,username,pwd from pbg_users where username='{$data['username']}'"; 17 $res = $this->db->getOneRow($sql); 18 return $res['pwd'] == md5($data['pwd']) ? : false; 19 } 20 }
5) 사용자 컨트롤러 로그인 작업, 점프 프롬프트 최적화
공용 컨트롤러 메서드 msg() 사용
1 。。。。。。。 2 /** 3 * 登录操作: 校验登录信息 4 */ 5 public function dlogin() 6 { 7 //接收登录信息 8 $data = array(); 9 $data['username'] = trim($_POST['username']); 10 $data['pwd'] = trim($_POST['pwd']); 11 12 //实例化模型,调用模型方法 13 $model = new UserModel(); 14 $result = $model->checkLoginInfo($data); 15 //跳转提示 16 if($result){ 17 $this->msg('登录成功!', '?a=index',3); 18 } else { 19 $this->msg('用户名或密码不正确!!'); 20 } 21 }
병합, 저장 및 git으로 푸시
1 $ git add -A 2 $ git commit -m "MVC结构,数据库操作类,基础模型类和基础控制器类制作" 3 $ git checkout master 4 $ git merge mvc-dbtools-base 5 $ git push origin master
요약: 디렉터리 구조 최적화, 데이터베이스 작업 클래스 만들기, 기본 모델 클래스 및 기본 컨트롤러 클래스 사용
다음 단계: 모델 클래스에서 싱글톤 구현, 디렉터리 구조 추가 최적화, 그리고 플랫폼 구분(프론트엔드, 백엔드 등)
위 내용은 이 글의 전체 내용입니다. 많은 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!
관련 권장 사항:
PHP 소스 코드에 대한 간략한 토론 5: 배열 배열 생성 정보
PHP 소스 코드에 대한 간략한 토론 1: 분해 및 내파 함수
위 내용은 단일 항목 MVC 구조를 구현하는 PHP 소스 코드 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!