php源碼建庫建表-設定檔-錯誤記錄檔的方法

來源:互聯網
上載者:User
這篇文章主要介紹了關於php建庫建表-設定檔-錯誤記錄檔的方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

主要:

  1. 整理架構

  2. 建庫建表

  3. 設定檔類

  4. 錯誤記錄檔記錄

--------------本篇後檔案結構:--------------------------------------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!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.