這篇文章主要介紹了關於php建庫建表-設定檔-錯誤記錄檔的方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
主要:
整理架構
建庫建表
設定檔類
錯誤記錄檔記錄
--------------本篇後檔案結構:--------------------------------------blog├─App│ ├─Model 模型目錄│ ├─View 視圖目錄│ │ ├─Admin後台目錄│ │ └─Home前台目錄│ ├─Common 配置目錄│ │ └─config.php 設定檔│ ├─Log 日誌目錄│ │ └─log.txt 記錄檔│ ├─Controller 控制器│ │ ├─Admin後台│ │ │ └─DemoController.class.php 測試控制器│ │ └─Home前台├─Public 靜態公用檔案(js,css,images)│ ├─Plugins 外掛程式│ ├─Back後台│ └─Home前台├─Frame 公用使用的類│ ├─BaseModel.class.php 資料庫連接類│ ├─BaseController.class.php 控制器公用操作(設定編碼,資訊跳轉)│ ├─FactoryModel.class.php 模型工廠類│ ├─Log.class.php 日誌廠類│ ├─Config.class.php 設定檔讀取類│ ├─Init.class.php 初始化應用類│ └─MySQLDB.class.php 資料庫操作工具類└─index.php 入口檔案-----------------------------------------------------------------------------------------------------
利用上篇中搭建好的mvc架構結構,正式開始開發部落格項目。首先建立資料表,然後開始搭建後台,資料前台展示,完成部落客要模組展示。
下載查看該項目源碼: https://gitee.com/NewbiesYang/young_blog
整理架構
清理測試頁面
1)前面構建架構結構,使用了使用者登入測試頁面以及後台首頁頁面。在此全部去掉,從新開始構建前台和後台頁面。類似於我們下載了一個ThinkPHP或Laravel或其他的架構。 現在開始在這個微型架構上來構建我們的項目
2) 實際開發,會用前端人員做好的靜態頁面來進行開發。所以也可以在 【模板之家】或其他網站 下載 後台模板和前台部落格靜態頁面。然後專註於後端開發,可以加快速度。本項目供學習研究使用,也就不那麼著急了。
原本是準備全部利用別人寫好的前端頁面(包括最上層顯示和後台頁面),專註於後端邏輯的開發。而且已經把分類頁面列表都做好了。還提交傳送了。 此刻,仔細想想,要是這樣玩,那我直接用架構更好了。既然做後端開發,自己寫個後端頁面+程式處理,沒什麼問題吧..., 置於最上層顯示頁面,那再用前輩寫的前端頁面倒是可以的 於是乎,捲起柚子,說幹就幹,先來整理架構,開始搭建部落格。。。。。
架構結構:
--------------清理後MVC架構檔案結構:--------------------------------------blog├─App│ ├─Model 模型目錄│ ├─View 視圖目錄│ │ ├─Back後台│ │ └─Home前台│ ├─Controller 控制器目錄│ │ ├─Back後台│ │ └─Home前台├─Public 靜態公用檔案(js,css,images)│ ├─Plugins 外掛程式│ ├─Back後台│ └─Home前台 ├─Frame 公用使用的類│ ├─BaseModel.class.php 資料庫連接類│ ├─BaseController.class.php 控制器公用操作(設定編碼,資訊跳轉)│ ├─FactoryModel.class.php 模型工廠類│ ├─Init.class.php 初始化應用類│ └─MySQLDB.class.php 資料庫操作工具類└─index.php 入口檔案-----------------------------------------------------------------
後續的開發只需要複製該目錄結構檔案, 就可以在此基礎上進行開發了。
提交傳送代碼
git add -Agit commit -m "清理MVC結構"git push origin master
外掛程式準備
1) layui外掛程式: 搭建背景程式,準備使用layui前端架構,這個架構個人認為做後台介面還是不錯的。它還包含一些比較使用模組。
用bootstrap也可以,我更加傾向於用它來做前台頁面。
下載網址: http://www.layui.com/
2) jQuery庫: 更方便操作DOM, 尤其是經常使用ajax請求。
3) 其他外掛程式: 如Ueditor編輯器等 需要使用時再下載吧。一般外掛程式都會有demo樣本, 按照樣本和手冊,懂web開發基本能使用。
上述外掛程式暫時不熟悉沒有關係,官網上有手冊,需要什麼模組,便查手冊便使用,就像搭積木,如果要做得更好,當然要花更多的時間多練習。我本著後台給程式管理員使用,也不一定要非常漂亮,實用就好。
建庫建表
準備: 建立分支
$ git checkout master$ git checkout -b "start-admin-module"
建表思路:
根據部落格模板,從首頁開始分析, 分析哪些需要動態資料,以便建立對應資料表。
使用者: 登入, 註冊, 修改, 刪除
文章: 分類管理, 博文管理, 評論管理
角色管理: 管理員,普通使用者
菜單管理: 不同許可權人員,對應功能表列也有區別
建表工具可以任意選擇。初期手工寫建表語句,熟悉後直接使用工具。 本項目中使用 Navicat 建立資料庫和表
資料庫,表
1) 建立資料庫:php_blog
create database php_blog charset utf8
2) 使用者表: y_users
CREATE TABLE `y_user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '使用者主鍵', `username` varchar(20) NOT NULL COMMENT '使用者名稱', `password` char(32) NOT NULL COMMENT '密碼', `email` varchar(50) NOT NULL DEFAULT '' COMMENT '註冊郵箱', `token_email` varchar(32) NOT NULL DEFAULT '' COMMENT '郵箱驗證', `status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '狀態, 0-正常,1-禁用', `gid` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '角色id,1-管理員,2-普通使用者,0-無效', `login_ip` varchar(20) NOT NULL DEFAULT '' COMMENT '最後登入的ip地址', `login_times` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '登入次數', `created_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '註冊時間', `updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最後一次登入時間', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='使用者表';
使用者表SQL
3)角色表: y_user_group
CREATE TABLE `y_user_group` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '角色id', `name` varchar(20) NOT NULL DEFAULT '' COMMENT '角色名稱', `auths` varchar(255) NOT NULL DEFAULT '' COMMENT '角色許可權', PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
角色表SQL
4) 菜單表: y_menus
CREATE TABLE `y_menus` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '菜單id', `title` varchar(20) DEFAULT '' COMMENT '菜單名稱', `controller` varchar(30) DEFAULT '' COMMENT '控制器名稱', `action` varchar(30) DEFAULT '' COMMENT '操作名稱', `status` tinyint(1) unsigned DEFAULT '1' COMMENT '狀態,1-正常,0-禁用', `is_hidden` tinyint(1) unsigned DEFAULT '0' COMMENT '是否隱藏,0-正常顯示,1-隱藏', `sort` int(10) unsigned DEFAULT '0' COMMENT '排序', `pid` int(10) unsigned DEFAULT '0' COMMENT '上一級菜單', PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='菜單表';
菜單表SQL
5) 文章表 y_article
CREATE TABLE `y_article` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '文章id', `title` varchar(60) NOT NULL DEFAULT '' COMMENT '標題', `description` varchar(200) NOT NULL DEFAULT '' COMMENT '文章簡介', `content` text NOT NULL COMMENT '內容', `cid` int(10) unsigned NOT NULL COMMENT '文章類別', `pic` varchar(150) NOT NULL DEFAULT '' COMMENT '文章封面圖', `pic_watermark` varchar(150) NOT NULL DEFAULT '' COMMENT '浮水印圖', `pic_thumb` varchar(150) NOT NULL DEFAULT '' COMMENT '縮圖', `uid` int(10) unsigned NOT NULL COMMENT '作者', `clicks` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '閱讀數(點擊數)', `updated_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新時間', `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '發布時間', PRIMARY KEY (`id`), KEY `title` (`title`), KEY `uid` (`uid`), KEY `clicks` (`clicks`), KEY `cid` (`cid`) USING BTREE) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='文章表';
文章表SQL
6) 文章類別表 y_category
CREATE TABLE `y_category` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分類id', `catename` varchar(15) NOT NULL COMMENT '分類名', `description` varchar(255) NOT NULL DEFAULT '' COMMENT '簡介', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='文章類別表';
文章類別表SQL
7) 評論(回複)表 y_comment
CREATE TABLE `y_comment` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '評論id', `uid` int(10) unsigned NOT NULL COMMENT '評論者', `created_at` int(11) DEFAULT NULL COMMENT '評論時間', `content` varchar(255) NOT NULL DEFAULT '' COMMENT '評論內容', `aid` int(10) unsigned NOT NULL COMMENT '被評論的文章', PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='評論(回複)表';
評論(回複)表SQL
8) session資料表 y_session (其實可以不用這個,目的是為了操作 "將session寫入資料庫" )
CREATE TABLE `y_session` ( `sess_id` varchar(50) NOT NULL DEFAULT '' COMMENT 'session id', `data` text NOT NULL COMMENT 'session資料', `created_at` int(11) NOT NULL COMMENT 'session建立時間', PRIMARY KEY (`sess_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='session資料表';
session資料表SQL
為了避免弄的太複雜, 暫時建立這些資料表,欄位後續可以進行調整。如果需要加入模組功能,可以相應增加相應資料表。
串連資料庫
在badeModel中修改資料連線的數組資訊 【Frame/BaseModel.class.php】 (如果使用設定檔類,此處就可以省略了)
1 class BaseModel { 2 。。。 3 。。。 4 。。。 5 function __construct(array $config=null) 6 { 7 $conf = array( 8 'host'=>'localhost', 9 'user'=>'root', 10 'pwd'=>'root', 11 'port'=>'3306', 12 'charset'=>'utf8', 13 'dbname'=>'php_blog', 14 ); 15 $conf = empty($config)? $conf : array_merge($conf,$config); 16 $this->db = Db::getDb($conf); 17 } 18 }
設定串連資料庫資訊
設定檔類
需求分析:
為了架構便於資料庫連接以及方便讀取設定檔。如 希望在 App/Common/config.php 做一些配置項,要求能讀取這些配置並應用到項目
思路:
step 1: 建立檔案 App/Common/config.php 並將資料庫連接資訊寫入該設定檔step 2: 在Frame/目錄下建立讀取設定檔類 Config.class.phpstep 3: 設定自動載入 讀取配置類step 4: 基本模型類執行個體化 讀取配置類。 操作資料庫必須要經過基本模型類step 5: 調整資料庫工具類擷取配置資訊,既 其構造方法中通過傳遞進來的資料配置資訊對象擷取step 6: 測試連接資料結果,驗證擷取配置
實現串連資料庫-讀取資料庫配置資訊思路
代碼實現
1) 建立設定檔config.php 【App/Common/Config.php】
<?php/** * 設定檔 * User: young */return [ //資料庫連接配置 'host'=>'localhost', 'user'=>'root', 'pwd'=>'root', 'port'=>'3306', 'charset'=>'utf8', 'dbname'=>'php_blog',];
設定檔-資料庫配置資訊
2) 建立讀取設定檔類 【Frame/Config.class.php】
1 <?php 2 /** 3 * 設定檔讀取類 4 * User: young 5 */ 6 7 class Config 8 { 9 protected static $ins = null; //本類執行個體 10 protected $cfg = array(); //儲存配置項 11 12 /** 13 * 擷取本類執行個體 14 * @access public 15 * @return object 本類的單例對象 16 */ 17 public static function getIns() { 18 if(false === (self::$ins instanceof self)){ 19 self::$ins = new self(); 20 } 21 return self::$ins; 22 } 23 24 /** 25 * 構造方法: 讀取配置項 26 * @access public 27 * @return void 28 */ 29 final protected function __construct() { 30 require APP.'Common'.DS.'config.php'; //讀取配置項 31 $this->cfg = $cfg; 32 } 33 34 /** 35 * 根據指定的配置項,返回該配置項的值 36 * @param string $k 配置項 37 * @return mixed|null 返回配置項的資料 38 */ 39 public function __get($k) { 40 if(!isset($this->cfg[$k])) { 41 return null; 42 } 43 return $this->cfg[$k]; 44 } 45 46 47 /** 48 * 根據指定的配置項,返回配置項的值 49 * @param string $k 配置項名稱 50 * @param string $v 配置項對應的值 51 */ 52 public function __set($k,$v) { 53 $this->cfg[$k] = $v; 54 } 55 }
3) 自動載入配置類
需要自動載入該類, 該類在Frame目錄下, 所以可以寫入到 Init.class.php 類中的屬性數組中 【Frame/Init.class.php】
<?php/** * 初始化應用類 * User: young */class Init{ protected static $frame = array('BaseController','BaseModel','Db','FactoryModel','Config');。。。。。。。。。自動載入配置類
4)基本模型類執行個體化配置類【Frame/BaseModel.class.php】
<?php/** * BaseModel.class.php 基本模型類 * 串連資料庫 * @author young */class BaseModel{ protected $db = null; /** * 構造方法: 執行個體化資料庫類 * @access public */ function __construct() { $conf = Config::getIns(); //讀取配置項執行個體 $this->db = Db::getDb($conf); }}
5)資料庫讀取配置項資訊 【Frame/Db.class.php】
<?php/** * Db.class.php 資料庫操作工具類 * @author young */class Db {。。。。。。。。。 /** * 構造方法: 儲存資料庫連接資訊,串連資料庫 * @access private * @param array $conf 資料庫連接資訊 */ private function __construct($conf) { $this->host = $conf->host; $this->user = $conf->user; $this->pwd = $conf->pwd; $this->port = $conf->port; $this->charset = $conf->charset; $this->dbname = $conf->dbname; $this->connect(); }。。。。。。。。。}資料庫工具類擷取配置資訊
6) 測試 在App/Controller/Home/DemoController.class.php 用於測試資料庫連接情況
<?php/** * 測試控制器類 * User: young */class DemoController extends BaseController{ public function test() { $db = new BaseModel(); $data = $db->db->getAllRows("select * from y_user"); var_dump($data); }}
測試控制器類測試連接資料庫
註: 前提,需要將BaseModel.class.php中的$db屬性先臨時修改為public公開,才能測試成功 (原因:在Demo控制器中執行個體化的基本模型類,資料庫操作執行個體是放在類的屬性db中,外部不能訪問protected屬性), 本節所有測試,可以臨時將db設定為公開的。
還可以使用配置如: 上傳目錄,網站配置資訊等,根據需求自訂配置需求,再通過讀取配置類讀取配置的資料
提交代碼
git add -Agit commit -m "完成讀取設定檔類"
錯誤記錄檔記錄
除了開發階段調試錯誤, 項目上線一般會將錯誤資訊寫入指定檔案中。安全性更好。
需求分析:
將錯誤寫入記錄檔中,這裡暫時主要記錄資料庫操作的錯誤。 如:預設將錯誤記錄在App/log/logError.txt。 如果在設定檔中進行了配置,則將日誌資訊寫入到配置項log指定的目錄中
思路:
step 1: 製作日誌類Frame/Log.class.php, 用於將錯誤資訊寫入到指定檔案中。 (設定記錄檔位置,正好可以利用上面寫的配置項,通過讀取配置來實現)step 2: 在基本模型類BaseModel中,讀取配置項後, 可以將日誌目錄路徑寫入常量。 使用try..catch 捕捉異常,將錯誤寫入日誌step 3: 實現日誌類自動載入。Log類在Frame目錄中,所以只要在初始化應用類Init中的屬性$frame數組中加入 “Log”step 4: 記錄錯誤。 資料庫連接可能失敗, sql語句可能執行失敗step 5: 測試錯誤記錄檔記錄功
實現錯誤記錄檔記錄過程思路
代碼實現
1) 製作錯誤記錄檔類 【Frame/Log.class.php】
<?php/** * Db.class.php 資料庫操作工具類 * @author young */class Db {。。。。。。。。。 /** * 構造方法: 儲存資料庫連接資訊,串連資料庫 * @access private * @param array $conf 資料庫連接資訊 */ private function __construct($conf) { $this->host = $conf->host; $this->user = $conf->user; $this->pwd = $conf->pwd; $this->port = $conf->port; $this->charset = $conf->charset; $this->dbname = $conf->dbname; $this->connect(); }。。。。。。。。。}資料庫工具類擷取配置資訊
2) 讀取日誌位置,捕捉錯誤 【Frame/BaseModel.class.php】
發生錯誤記錄後,這裡只是簡單使用exit(..)退出, 可以自定error錯誤頁面會更好
<?php/** * BaseModel.class.php 基本模型類 * 串連資料庫,捕捉記錄錯誤 * @author young */class BaseModel{ Public $db = null; /** * 構造方法: 執行個體化資料庫類 * @access public */ function __construct() { $conf = Config::getIns(); //讀取配置項執行個體 //讀取日誌設定項目 並寫成常量 $logPath = $conf->log; $logPath = !isset($logPath) ? APP."log".DS : $logPath; define('LOG',$logPath); //監控資料庫操作 try { $this->db = Db::getDb($conf); }catch(Exception $e) { $err = ''; $err .= '錯誤碼:' . $e->getCode() . "\r\n"; $err .= '錯誤資訊:' . $e->getMessage() . "\r\n"; $err .= '檔案:' . $e->getFile() . "\r\n"; $err .= '行號:' . $e->getLine() . "\r\n\r\n"; Log::write($err); exit("<h2>客官!頁面暫時無法響應,請稍後訪問</h2>"); } }}點擊查看【基本模型類中監測並記錄錯誤】
3)自動載入日誌記錄類 【Frame/Init.class.php】
<?php/** * 初始化應用類 * User: young */class Init{ protected static $frame = array('BaseController','BaseModel','Db','FactoryModel','Config','Log');。。。。。。。。。點擊查看【自動載入日誌類】
4) 記錄錯誤 【Frame/Db.class.php】
資料庫連接可能發生錯誤處理
class Db{。。。。。。。。。 /** * 串連資料庫,設定編碼,選庫 * @access private */ private function connect() { $this->link = @ mysql_connect("{$this->host}:{$this->port}", "$this->user", "$this->pwd") ; if(!$this -> link) { $error = new Exception("資料庫連接不上",10000); throw $error; } $this->setCharset($this->charset); $this->useDb($this->dbname); }。。。。。。。。。點擊查看【資料庫連接錯誤拋出】
sql語句發生錯誤處理
class Db {。。。。。。。。。 /** * 執行sql語句 * @param string $sql sql語句 * @return mixed */ private function query($sql) { $result = mysql_query($sql, $this->link);// if(false === $result) {// echo "<p>sql執行失敗!<br>";// echo "<br>失敗語句:".$sql;// echo "<br>錯誤代號".mysql_errno();// echo "<br>錯誤提示: ".mysql_error()."</p>";// exit();// } if(false === $result) { $err = "sql執行失敗!\r\n失敗語句:".$sql."\r\n錯誤代號:".mysql_errno()."\r\n錯誤提示:".mysql_error()."\r\n\r\n"; Log::write($err); exit("<h2>查詢出錯,請稍後訪問</h2>"); } return $result; }。。。。。。。。。點擊查看【執行SQL錯誤處理】
測試
可以在【App/Common/config.php】中配置記錄檔目錄。 如果不進行配置, 預設記錄在App/log/目錄中
<?php/** * 設定檔 * User: young */return [ //資料庫連接配置 。。。、 。。。 。。。 //記錄檔位置配置 'log' => APP,];點擊查看【記錄檔配置】
以下測試可以 開啟配置項中的配置log 和關閉後分別測試。 注意: 如果沒有做配置log, 則要首先在App目錄下建立一個log目錄
1. 在設定檔中故意寫錯資料庫連接資訊,如密碼寫錯
2. 執行sql錯誤
最後說明: 配置目錄,日誌目錄都是不希望瀏覽器直接存取的,所以需要將.htaccess檔案放入目錄中 (由於App目錄中已經存在,故也可以省略)
提交傳送代碼
git add -Agit commit -m "完成日誌類"git checkout mastergit merge start-admin-modulegit push origin master
小結: 本篇主要實現了 架構清理,部落格資料庫表搭建,建立配置讀取類,日誌記錄類。
實際上,到此仍然只是更加完善了一下架構結構,增加了2個功能。正如前篇所提,還有很多是可以改進的。這裡就暫時不再繼續增加功能了。
提出問題:
1. 如何使用該自製架構搭建項目 ==> 使用者操作+mvc實現
2. 如何著手使用ajax實現後台登入功能 ==> ajax應用
3. 如何著手實現分類別模組功能,它有哪些操作 ==> 增刪改查
下一步: 後台模板視圖製作,後台登入,文章分類別模組功能。
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!