1.擁有關係:用戶表和身份證表關聯,HAS_ONE(一對一),表示一個用戶只有一個身份證。
User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.phpjavascript
ThinkPHP框架介紹
一.框架和庫
框架:英文是(Framework)能夠理解爲骨架、架構、書架、書框。在程序裏面理解,就各類條條框框像個有規則的書架同樣,讓你按照它的代碼規範、編碼模式(好比不少框架是基於MVC模式的)去開發應用程序。固然,框架內可能也包含了庫的功能,也提供了各類封裝功能的集合包。
庫:英文是(Library)能夠理解爲倉庫、圖書館、存書室。在程序裏面理解,就是各類代碼的封裝集合包,提供原生內置並不存在的功能和方法。
二.ThinkPHP框架的優點
1.我的項目開發中,使用框架比採用原生代碼開發優點較爲明顯:
(1)效率極高:由於框架已經幫你疏通了管道、構建了廠房、安好了水電、裝全了設備、排好了書架,你要作的就是按照書架的佈局或規格,整齊的把書放上,就完了。若是你不用框架建設,你還須要本身疏通管道、構建廠房、安水電、裝設備、排書架,效率大大提升。
(2)安全性高:框架的開發難度較高,通常都是身經百戰的架構高手們通過多年、多版本研發、更新迭代孕育而成。通過大量市場和用戶的輪番測試和考驗,保證了不一樣狀況和情況的穩定性。而若是你是低手或者新手,且本身架構,頗有可能會遇到廠房崩塌、漏水漏電等不安全的狀況發生。
(3)穩定性高:基本同上,由於各類部件進行有有條不紊的架構,致使在不一樣程度的運行中保證流暢。而自行架構的,在某些極端狀況下可能會遇到管道堵塞的問題發生。
2.在公司團隊項目開發中,使用主流框架比原生或自行開發框架優點較爲明顯:
(1)團隊協做力強:開源框架提供了統一的規範和編碼模式,且模塊與模塊之間相對獨立。對於程序員來講,只要根據這種規範來編碼,團隊之間的協調性會很是容易。並且主流的開源框架在招募人才方面較爲容易,上來就能使用,下降的培訓成本。
(2)下降培訓成本:若是使用原生代碼,當另外一個團隊人員接受或參與,幾乎看不到懂以前的技術員人代碼,最終可能要重構,成本巨大。若是使用公司研發的框架,那麼也須要必定時間的培訓才能上手,成本也是巨大的。而使用主流框架,大部分技術人員在來公司以前就已經掌握。
(3)去技術人員化:一個公司把核心代碼掌握在某個技術人員手裏,這是極其危險的事。當這個項目的原生或者自行開發的框架是某一個技術人員設計的,當他離職後,代碼將是一堆垃圾,沒人能看懂。若是使用主流框架,那麼公司的核心是項目和業務自己,下降技術人員的價值。任何一個技術人員離職,都不會影響項目的研發進度,只要懂主流框架的技術人員,上手便可繼續。
三.框架和開源系統
所謂開源系統,就是開放源代碼的系統。這些系統,包括好比discuz論壇系統、phpcms內容管理系統、shopex商城系統。這些系統,都是定製某種領域功能的、已經開發好的系統。原則上,這些系統已經不須要技術人員來編碼了,能夠直接上線運營了。由於這些是定製的系統,因此係統會專門根據此領域的狀況進行特定的優化。那麼也就是說,這些開源系統在安全性、穩定性和效率上要高於用框架開發的同類產品。因此,不少公司大量招聘開源系統的二次開發人才。
ThinkPHP的安裝與配置
ThinkPHP是一款免費開源的框架,基於MVC設計模式和麪向對象開發。
一.獲取ThinkPHP
直接登陸ThinkPHP的官網下載頻道:http://www.thinkphp.cn/down.html
1.解壓ThinkPHP,打開它或導入到項目中去,展開六個文件及文件夾:
Application --應用程序目錄(至關於一個網站,能夠同時作好幾個分支網站),當程序開發時自動生成,默認爲空;
Public --公共資源文件目錄,存放一些公用的文件,默認爲空;
ThinkPHP --框架目錄,框架的核心架構程序包;
README.md --說明文件,可刪;
.htaccess --配置文件,通常用於配置僞靜態;
Index.php --入口文件,全部程序都經過這裏訪問。
2.對於ThinkPHP框架目錄內,也含有大量的目錄及文件:
Common --核心公共函數目錄
Conf --核心配置目錄
Lang --核心語言包目錄
Library --框架類庫目錄
|--Think --核心Think類庫包目錄
|--Behavior --行爲類庫目錄
|--Org --Org類庫包目錄
|--Vendor --第三方類庫目錄
|--... --更多類庫目錄
Mode --框架應用模式目錄
Tpl --系統模版目錄
LICENSE.txt --框架受權協議文件
logo.png --框架LOGO文件
README.txt --框架README文件
index.php --框架入口文件
二.入口文件
ThinkPHP採用單一入口模式對項目進行部署和訪問的,因此咱們須要經過index.php進行一些部署工做,保證其正確訪問。
1.將完整版壓縮包解壓的內容,拷貝到指定的服務器文件夾內
2.打開ThinkPHP提供的index.php文件,咱們發現以下代碼:php
<?php //應用入口文件 //檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); //開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false //define('APP_DEBUG',True); //定義應用目錄 define('APP_PATH','./Application/'); //引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php';
3.若是想按照本身的意願設置應用目錄名稱,能夠修改爲這樣:css
<?php //應用入口文件 //檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); //開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false //define('APP_DEBUG',True); //修改框架目錄 define('APP_PATH','./Weibo/'); //修改框架目錄 require './Think/ThinkPHP.php';
當第一次運行了這個配置後的應用程序,將會在根目錄生成一個Weibo文件夾,應用程序的全部文件將所有存放在這裏。
三.自動生成
當第一次訪問應用入口文件的時候,會自動生成Weibo這個應用程序目錄。裏面包含了各類目錄,說明以下:
Common --應用公共模塊
|--Common --應用公共函數目錄
|--Conf --應用公共配置文件目錄
Home --默認生成的Home模塊
|--Conf --模塊配置文件目錄
|--Common --模塊函數公共目錄
|--Controller --模塊控制器目錄
|--Model --模塊模型目錄
|--View --模塊視圖文件目錄
Runtime --運行時目錄
|--Cache --模版緩存目錄
|--Data --數據目錄
|--Logs --日誌目錄
|--Temp --緩存目錄
一個站是一個入口,index.php只有一個入口,就是應用程序入口。若是有多個站,或者後臺,那就須要另外一個入口。
1.建立另外一個站admin.php,應用目錄改爲對應的便可。html
<?php //應用入口文件 //檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); //開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false define('APP_DEBUG',True); //定義應用目錄 define('APP_PATH','./Admin/'); //引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php';
2.在自動生成的目錄中,爲了防止訪問到應用程序的目錄結構,會建立個index.html文件。固然,你也能夠自行設置。
運行http://localhost/ThinkPHP/admin.php生成Admin/Home/Conf/default.htmlhtml5
<?php //應用入口文件 //檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); //開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false define('APP_DEBUG',True); //定義應用目錄 define('APP_PATH','./Admin/'); //設定目錄生成的文件 define('DIR_SECURE_FILENAME', 'default.html'); //引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php';
運行http://localhost/ThinkPHP/admin.php生成Admin/Home/Conf/default.html並給文件裏設置目錄頁面內容java
<?php //應用入口文件 //檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); //開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false define('APP_DEBUG',True); //定義應用目錄 define('APP_PATH','./Admin/'); //設定目錄生成的文件 define('DIR_SECURE_FILENAME', 'default.html'); //設置目錄頁面內容 define('DIR_SECURE_CONTENT', '目錄禁止'); //引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php';
通常來講,第一次生成應用程序,應該加上靜態主頁防止目錄結構暴露。但若是你的環境很是安全,能夠關閉生成靜態主頁。
運行http://localhost/ThinkPHP/admin.php不會生成主頁mysql
<?php //應用入口文件 //檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); //開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false define('APP_DEBUG',True); //定義應用目錄 define('APP_PATH','./Admin/'); //禁止目錄主頁生成 define('BUILD_DIR_SECURE', false); //引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php';
四.訪問控制器
1.控制器路徑在:Weibo/Home/Controller下,有一個默認的控制器IndexController.class.php文件。
2.控制器類的命名方式:控制器名(駝峯式,首字母大寫)+Controller
3.控制器文件的命名方式:類名+class.php
建立一個控制器須要三個部分:1.設置命名空間;2.導入命名空間;3.控制器類程序員
//設置命名空間 namespace Home\Controller; //根據Home主模塊加上當前IndexController.class.php文件的目錄 //導入命名空間 use Think\Controller; //class IndexController繼承了Controller父類,父類的命名空間就是Think //控制器類 class IndexController extends Controller { public function index() { //... } }
4.訪問方式:
首頁直接訪問:http://localhost/ThinkPHP/
若是想用完整形式則是:http://localhost/ThinkPHP/admin.php/Home/Index/index
注意:在這裏的完整URL中,index.php是單一入口文件,Home是主模塊,Index是控制器名錶明IndexController,index是控制器裏的一個方法
5.若是建立一個test()方法,那麼URL就是:
http://localhost/ThinkPHP/index.php/Home/Index/index/test
6.建立一個User模塊,那麼能夠建立一個User控制器。ajax
<?php //本身建立控制器 namespace Home\Controller; //聲明本身命名空間 use Think\Controller; //會自動生成 class UserController extends Controller { //生成UserController繼承父類Controller public function index() { echo 'user'; } public function test() { //index會默認被執行test就須要調用 echo 'user test'; } }
URL訪問路徑爲:http://localhost/ThinkPHP/Home/User/
URL訪問User模塊下的test()方法的路徑爲:http://localhost/ThinkPHP/Home/User/test(index會默認被執行test就須要調用)
ThinkPHP--模塊化和URL模式
一.模塊化設計
建立Weibo框架
採用ThinkPHP模塊化架構思想,把Weibo內的Home目錄看成前臺、Weibo/Admin目錄看成後臺。
操做方法:把Home目錄複製一份到同級目錄,更名爲Admin。把Admin中的Controller內的IndexController.class.php的命名空間改成以下:正則表達式
//修改Admin模塊的命名空間 <?php //本類由系統自動生成,僅供測試用途 namespace Admin\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ //$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微軟雅黑"; color: #333;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>歡迎使用 <b>ThinkPHP</b>!</p></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>','utf-8'); echo 'Admin'; } }
最終訪問的地址就是:http://localhost/ThinkPHP/index.php/Admin
1.被用戶禁止訪問的,好比Common和Runtime模塊。固然,框架已經在默認就禁止訪問了。當強行訪問Common模塊的時候,會提示:「沒法加載模塊:Common」的錯誤信息。
Weibo/Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //禁止訪問模塊(系統內置的) 'MODULE_DENY_LIST' => array('Common','Runtime'), );
注意:當你去掉數組裏的'Common',那麼會提示:「沒法加載控制器:Index」的錯誤信息。說明這個模塊已經能夠訪問了。
2.容許訪問模塊的設置。當設置了此選項,就務必把全部容許訪問的模塊都添加上,不然會變成拒絕訪問。
Weibo/Common/Conf/config.php
<?php return array( //容許訪問的模塊,設置了,就必須寫全,漏寫的將沒法訪問 'MODULE_ALLOW_LIST' => array('Home','Admin'), );
3.若是有多個訪問模塊,那麼在默認URL訪問的時候,應該有一個首選訪問。默認是Home,想設置Admin爲默認,能夠這麼設置:
Weibo/Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //設置默認加載模塊 'DEFAULT_MODULE' => 'Admin', );
訪問目錄默認加載Admin模塊:http://localhost/ThinkPHP/
4.應用項目若是隻容許單個模塊的話,能夠設置拒絕多個模塊,這樣建立更多的模塊將失效。
Weibo/Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //只容許訪問一個模塊設置 'MULTI_MODULE' => false, );
5.有時,你會以爲index.php/Admin這樣很麻煩。你可能想直接admin.php就表明後臺就方便不少,那麼可使用多入口設置。
這裏的多入口和上一節多個應用項目不一樣,而是經過admin.php訪問Weibo目錄下的Admin模塊。將index.php複製出來改爲admin.php,而後添加以下代碼:
Weibo/admin.php
// 應用入口文件 // 檢測PHP環境是否大於5.3 if(version_compare(PHP_VERSION,'5.3.0','<')) die('require PHP > 5.3.0 !'); // 開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false define('APP_DEBUG',True); //Admin加載admin模塊 $_GET['m'] = 'Admin'; //默認指向Index控制器 $_GET['c'] = 'Index'; // 定義應用目錄 define('APP_PATH','./Weibo/'); // 引入ThinkPHP入口文件 require './ThinkPHP/ThinkPHP.php';
二.URL模式
ThinkPHP的URL模式有四種,默認是PATHINFO模式,其餘三種分別爲:普通模式、REWRITE和兼容模式。
1.PATHINFO模式
Weibo/Home/Controller/UserController.class.php
<?php // 本類由系統自動生成,僅供測試用途 namespace Home\Controller; use Think\Controller; class UserController extends Controller { //用戶密碼傳參 public function test($user, $pass) { echo 'user:'.$user.'<br />pass:'.$pass; } }
傳遞用戶和密碼:http://localhost/ThinkPHP/Home/User/test/user/xixi/pass/123
user:xixi
pass:123
在這條URL上,Home表示模塊,User表示控制器,test表示方法,user/xixi表示第一個鍵值對,pass/123表示第二個鍵值對。
PATHINFO模式下默認的分隔符是/,咱們能夠設置爲你想要的,好比:_
Weibo/Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //設置鍵值對分隔符 'URL_PATHINFO_DEPR'=>'_', );
設置了分隔符的URL:http://localhost/ThinkPHP/Home_User_test_user_xixi_pass_123
user:xixi
pass:123
2.普通模式
普通模式下的URL:http://localhost/ThinkPHP/index.php?m=Home&c=User&a=test&user=xixi&pass=123
在這條URL上,咱們發現採用的就是傳統的GET模式,m表示模塊,c表示控制器,a表示方法,後面的表示鍵值對。
普通模式的m、c、a能夠自行設置爲你習慣的鍵名稱:
<?php return array( //'配置項'=>'配置值' //修改鍵名稱 'VAR_MODULE' => 'mm', 'VAR_CONTROLLER' => 'cc', 'VAR_ACTION' => 'aa', );
修改鍵名稱後URL:http://localhost/ThinkPHP/index.php?mm=Home&cc=User&aa=test&user=xixi&pass=123
user:xixi
pass:123
ThinkPHP--模型(model)操做部分---數據庫操做
ThinkPHP模型操做部分模型是MVC中的M,表示應用程序核心(能夠理解爲操做數據庫部分操做)
一.建立數據庫
使用模型操做以前,首先建立一個數據庫:thinkphp。建立一個用戶表:think_user。添加一些數據便可。
ThinkPHP內置了抽象數據庫訪問層,把不一樣的數據庫操做封裝起來。咱們只須要使用公共的Db類進行操做,無須針對不一樣的數據庫寫不一樣的代碼和底層實現。Db類會自動調用相應的數據庫驅動來處理。
目前支持的數據庫包括Mysql(包含mysql和mysqli)、SqlServer、PgSQL、Sqlite、Oracle、Ibase、Mongo、PDO等。
1.全局配置定義(mysql)
Weibo/Common/Conf/config.php配置
<?php return array( //'配置項'=>'配置值' //全局配置定義 'DB_TYPE'=>'mysql', //數據庫類型 'DB_HOST'=>'127.0.0.1', //服務器地址 'DB_NAME'=>'thinkphp', //數據庫名 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PORT'=>3306, //端口 'DB_PREFIX'=>'think_', //數據庫表前綴 );
2.數據庫全局配置信息除了PDO,都可以採用上面的設置。
Weibo/Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //PDO專用定義 'DB_TYPE'=>'pdo', //數據庫類型 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PREFIX'=>'think_', //數據庫表前綴 'DB_DSN'=>'mysql:host=127.0.0.1;dbname=thinkphp;charset=UTF8', //服務器地址,數據庫名字鏈接 );
二.實例化模型
鏈接上數據庫後須要從數據庫裏操做數據,那麼就須要實例化模型類。
調試輔助工具
Weibo/Common/Conf/config.php
<?php return array( //'配置項'=>'配置值' //頁面Trace,調試輔助工具 'SHOW_PAGE_TRACE' =>true, );
1.Model基類處理方式(實例化Model類,傳一個數據表名)
Weibo/Home/Controller/UserController.class.php配置
namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //建立變量user,這個user將獲得Model基類的句柄 $user = new Model('User'); //建立Model基類傳遞第一個參數(User表) //顯示變量結構(檢測是否鏈接數據庫成功) //var_dump($user); //打印出全部數據結構 //var_dump($user->select()); } }
2.Model基類處理方式傳遞三個參數:Model(['模型名'],['數據表前綴'],['數據庫鏈接信息']);
Weibo/Home/Controller/UserController.class.php配置
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //Model(['模型名User'],['數據表前綴think'],['數據庫鏈接信息mysql:...']) $user = new Model('User','think_','mysql://xixi:123456@127.0.0.1/thinkphp'); //打印出全部數據結構 var_dump($user->select()); } }
3.使用Model基類還須要導入命名空間,而使用M()方法,則不須要。
Weibo/Home/Controller/UserController.class.php配置
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model () { //用M調用的是Model $user = M('User'); //打印出全部數據結構 var_dump($user->select()); } }
4.對應數據表的模型定義UserModel。這種模型類並不是必須定義的,只有當存在獨立的業務邏輯或者屬性的時候才須要。
Weibo/Home/Mode/UserModel.class.php
<?php //User模型類 namespace Home\Model; use Think\Model; //繼承Moder的基類 class UserModel extends Model { //UserModel的User要跟數據表名一一對應(若是寫成UserModel對應的數據表就是think_user) }
建立了UserModel模型類後,控制器那頭就能夠直接聲明
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function model () { //顯示變量UserModel結構 $user = new UserModel(); //打印出全部數據結構 var_dump($user->select()); } }
爲何UserModel模型類沒有指定任何表便可直接訪問呢?由於這種模型類基本是直接操做數據表的,因此在命名規範上和數據表名是對應的。
雖然使用模型類和數據表對應較爲方便,但當有時咱們須要更換表名、前綴、附加數據庫名等,就須要一些字段定義的操做。爲了更加方便的瞭解數據表的變化,咱們使用一下頁面Trace工具,能夠時時的查詢SQL的變化。
數據表定義:
(1)字段屬性tablePrefix:定義模型對應數據表的前綴
(2)字段屬性tableName:不包含表前綴的數據表名稱
(3)字段屬性trueTableName:包含表前綴的數據表名稱
(4)字段屬性dbName:定義模型當前對應的數據庫名稱
Weibo/Home/Mode/UserModel.class.php
<?php //User模型類 namespace Home\Model; use Think\Model; //從新定義完整的帶前綴的表名 class UserModel extends Model { //定義模型對應數據表的前綴 //protected $tablePrefix = 'tp_'; //think_user變成tp_user //不包含前綴的數據表名稱 //protected $tableName = 'abc'; //think_user變成think_abc //同時改前綴加表名 //protected $trueTableName = 'tp_abc'; //think_user變成tp_abc //附加數據庫名 //protected $dbName = 'tp'; //thinkphp表改爲tp表 }
若是你僅僅使用CURD等數據庫基本操做(增刪改查),建議使用基於Model基類的M()方法。使用M()方法因爲不須要加載具體的模型類(好比UserModel類),因此性能會更高。
5.D()方法來直接是實例化模型類,而且還能夠免去引入命名空間等操做。
Weibo/Home/Mode/UserController.class.php
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model () { //用D調用的是User-Model $user = D('User'); //打印出全部數據結構 var_dump($user->select()); } }
怎麼知道D()方法是調用的UserModel
Weibo/Home/Mode/UserModel.class.php
<?php //User模型類 namespace Home\Model; use Think\Model; class UserModel extends Model { public function __construct(){ //構造函數打印出 parent::__construct(); //由於UserModel沒有數據庫鏈接數據庫獲取功能(去鏈接構造函數) echo '\Home'; //打印出\Home } }
6.使用D()方法比直接使用模型類更加的智能,若是在\Home\Model\UserModel找不到該模型類,那麼就會去公共模塊下找\Common\Model\UserModel去找。若是還找不到,就會直接實例化基類Model()類,也就是等同於使用M()方法。
把Weibo/Home/Mode/UserModel.class.php的UserModel.class.php移動到\Common\Model\UserModel下
<?php //User模型類 namespace Common\Model; use Think\Model; class UserModel extends Model { public function __construct($name = '', $tablePrefix = '', $connection = ''){ parent::__construct(); echo '\Common'; } }
7.D()方法能夠直接調用當前模塊的模型類,那麼若是跨模塊調用的話,那怎麼處理呢?好比Admin後臺模塊,可使用目錄聲明。
Weibo/Admin/Model\UserModel.class.php
<?php namespace Admin\Model; use Think\Model; class UserModel extends model { public function __construct() { parent::__construct(); echo '\Admin'; } }
調用Weibo/Admin/Model\UserModel.class.php
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model () { //跨模塊實例化 $user = D('Admin/User'); //打印出全部數據結構 var_dump($user->select()); } }
8.有時,你可能想使用原生的SQL語句進行操做數據庫。那麼能夠採用實例化空模型基類或者空M()方法。
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model () { //用D調用的是User-Model $user = D('Admin/User'); //空M()方法 $user = M(); //或者new Model();空基類 var_dump($user->query("SELECT * FROM think_user WHERE user='蠟筆小新'")); } }
三.字段定義
每一個模型類操做着每一個對應的數據表,在大多數狀況下,系統會自動獲取當前數據表的字段信息。而當模型類第一次實例化時,系統會自動緩存字段,而且永久緩存,除非刪除了運行時緩存或者設置不緩存。
若是調試模式下,則不會生成字段緩存文件,每次都是從數據表裏從新獲取。生成緩存的目的顯而易見,就是爲了快速響應。ThinkPHP默認是開啓字段緩存,由於在實際運行中,不會更改字段結構。
字段緩存文件保存在Runtime/Data/_fields/目錄裏,當你在開發階段,字段和表會常常變更,因此要關閉緩存。關閉緩存的方法爲:
// 關閉字段緩存 'DB_FIELDS_CACHE'=>false //開啓了調試模式,自動關閉
PS:若是開啓緩存狀態,新增了字段,那麼可能新字段沒法刷新出來,必須刪除/Data/_fields文件夾,從新獲取字段。
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model () { $user = M('User'); //查看字段結構 var_dump($user->getDbFields()); } }
可使用手動定義數據表字段的方式取代字段緩存方式,這種方式能夠提升性能,避免IO開銷。
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model () { $user = D('User'); //查看字段結構 var_dump($user->getDbFields()); } }
ThinkPHP--模型操做部分-數據庫操做-SQL查詢語句
一.查詢方式
ThinkPHP提供了三種基本的查詢方式:字符串條件查詢、索引數組條件查詢和對象條件查詢。在大多數狀況下,推薦使用索引數組和對象方式做爲查詢條件,由於會更加安全
1.使用字符串做爲條件查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //字符串做爲條件查詢 $user = M('User'); var_dump($user->where('id=1')->select()); //連貫操做:user指向where,where自己又返回的user對象因此還能指向select } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( id=1 )
2.使用索引數組做爲查詢條件
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //索引數組做爲條件查詢 $user = M('User'); $condition['id'] = 1; //建立數組變量 $condition['user'] = '蠟筆小新'; //建立數組變量 var_dump($user->where($condition)->select()); //只須要傳變量就能夠了不須要寫字符串形式 } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = '蠟筆小新' )
索引數組查詢的默認邏輯關係是AND,若是想改變爲OR,可使用_logic定義查詢邏輯。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //索引數組做爲條件查詢 $user = M('User'); $condition['id'] = 1; //建立數組變量 $condition['user'] = '蠟筆小新'; //建立數組變量 $condition['_logic'] = 'OR'; //將默認AND改爲OR var_dump($user->where($condition)->select()); //只須要傳變量就能夠了不須要寫字符串形式 } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` = 1 ) OR ( `user` = '蠟筆小新' )
3.使用對象方式來查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //對象做爲條件查詢 $user = M('User'); $condition = new \stdClass(); //聲明對象=stdClass類 $condition->id = 1; //添加成員 $condition->user = '蠟筆小新'; //添加成員 var_dump($user->where($condition)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = '蠟筆小新' )
stdClass類是PHP內置的類,能夠理解爲一個空類,在這裏能夠理解爲把條件的字段做爲成員保存到stdClass類裏。而這裏的'\'是將命名空間設置爲根目錄,不然會致使當前目錄找不到此類。使用對象和數組查詢,效果是同樣的,能夠互換。在大多數狀況下,ThinkPHP推薦使用數組形式更加高效。
二.表達式查詢
對於那些要實現模糊判斷的查詢,好比大於、等於、小於之類的SQL查詢,可使用表達式查詢方式。
查詢表達式格式:$map['字段名'] = array('表達式','查詢條件');
表達式查詢表
(1)EQ表達式等於(=)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //EQ:等於(=) $user = M('User'); $map['id'] = array('eq', 1); //where爲id=1 var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` = 1 )
(2)NEQ表達式不等於(<>)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //NEQ:不等於(<>) $user = M('User'); $map['id'] = array('neq', 1); //where爲id<>1 var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` <> 1 )
(3)GT表達式大於(>)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //GT:大於(>) $user = M('User'); $map['id'] = array('gt', 1); //where爲id>1 var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` > 1 )
(4)EGT表達式大於等於(>=)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //EGT:大於等於(>=) $user = M('User'); $map['id'] = array('egt', 1); //where爲id>=1 var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` >= 1 )
(5)LT表達式小於(<)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //LT:小於(<) $user = M('User'); $map['id'] = array('lt', 2); //where爲id<2 var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` < 2 )
(6)ELT表達式小於等於(<=)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //ELT:小於等於(<=) $user = M('User'); $map['id'] = array('elt', 1); //where爲id<=1 var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( `id` <= 1 )
(7)[NOT]LIKE表達式模糊查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT]LIKE:模糊查詢 $user = M('User'); $map['user'] = array('like', '%小%'); //where爲like %小% var_dump($user->where($map)->select()); } }
最終生成的SQL語句(包含小字的):SELECT * FROM `think_user` WHERE ( `user` LIKE '%小%' )
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT]LIKE:模糊查詢 $user = M('User'); $map['user'] = array('notlike', '%小%'); //where爲not like %小% var_dump($user->where($map)->select()); } }
最終生成的SQL語句(不包含小字的):SELECT * FROM `think_user` WHERE ( `user` NOT LIKE '%小%' )
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT]LIKE:模糊查詢的數組方式 $user = M('User'); $map['user'] = array('like', array('%小%', '%蠟%'), 'AND'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(包含小還包含蠟字):SELECT * FROM `think_user` WHERE ( (`user` LIKE '%小%' AND `user` LIKE '%蠟%') )
(8)[NOT] BETWEEN表達式(不在)區間查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT] BETWEEN:區間查詢 $user = M('User'); $map['id'] = array('between','1,3'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(範圍在id1-3):SELECT * FROM `think_user` WHERE ( (`id` BETWEEN '1' AND '3' ) )
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT] BETWEEN:區間查詢 $user = M('User'); $map['id'] = array('not between','1,3'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(範圍不在id1-3):SELECT * FROM `think_user` WHERE ( (`id` NOT BETWEEN '1' AND '3' ) )
(9)[NOT] IN表達式(不在)IN查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT] IN:區間查詢 $user = M('User'); $map['id'] = array('in','1,2,4'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(範圍在id是1,2,4):SELECT * FROM `think_user` WHERE ( `id` IN ('1','2','4') )
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //[NOT] IN:區間查詢 $user = M('User'); $map['id'] = array('not in','1,2,4'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(範圍不在id是1,2,4):SELECT * FROM `think_user` WHERE ( `id` NOT IN ('1','2','4') )
(10)EXP表達式查詢支持SQL語法
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //EXP:自定義 $user = M('User'); $map['id'] = array('exp','in (1,2,4)'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(範圍在id是1,2,4)SELECT * FROM `think_user` WHERE ( (`id` in (1,2,4)) )
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //EXP:自定義增長OR語句 $user = M('User'); $map['id'] = array('exp', '=1'); $map['user'] = array('exp', '="蠟筆小新"'); $map['_logic'] = 'OR'; var_dump($user->where($map)->select()); } }
最終生成的SQL語句:SELECT * FROM `think_user` WHERE ( (`id` =1) ) OR ( (`user` ="蠟筆小新") )
三.快捷查詢
快捷查詢方式是一種多字段查詢的簡化寫法,在多個字段之間用'|'隔開表示OR,用'&'隔開表示AND。
1.不一樣字段相同查詢條件
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //使用相同查詢條件 $user = M('User'); $map['user|email'] = '蠟筆小新'; //'|'換成'&'變成AND var_dump($user->where($map)->select()); } }
最終生成的SQL語句(user=蠟筆小新或者email=蠟筆小新):SELECT * FROM `think_user` WHERE ( (`user` = '蠟筆小新') OR (`email` = '蠟筆小新') )
2.不一樣字段不一樣查詢條件
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //使用不一樣查詢條件 $user = M('User'); $map['id&user'] = array(1,'蠟筆小新','_multi'=>true); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID=1,user=蠟筆當心的):SELECT * FROM `think_user` WHERE ( (`id` = 1) AND (`user` = '蠟筆小新') )
注意:設置'_multi'爲true,是爲了讓id對應1,讓user對應'蠟筆小新',不然就會出現id對應了1還要對應'蠟筆小新'的狀況。並且,這設置要在放在數組最後。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //支持使用表達式結合快捷查詢 $user = M('User'); $map['id&user'] = array(array('gt', 0),'蠟筆小新','_multi'=>true); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID>0的,user=蠟筆小新):SELECT * FROM `think_user` WHERE ( (`id` > 0) AND (`user` = '蠟筆小新') )
四.區間查詢
ThinkPHP支持對某個字段的區間查詢。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //區間查詢 $user = M('User'); $map['id'] = array(array('gt', 1), array('lt', 4)); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID>1的而且ID<4的):SELECT * FROM `think_user` WHERE ( (`id` > 1) AND (`id` < 4) )
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //第三個參數設置邏輯OR $user = M('User'); $map['id'] = array(array('gt', 1), array('lt', 4), 'OR'); var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID>1或者ID<4的):SELECT * FROM `think_user` WHERE ( (`id` > 1) OR (`id` < 4) )
五.組合查詢
組合查詢是基於索引數組查詢方式的一個擴展性查詢,添加了字符串查詢(_string)、複合查詢(_complex)、請求字符串查詢(_query),因爲採用的是索引數組,重複的會被覆蓋。
方式一:安全性低
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //字符串查詢(_string) $user = M('User'); $map['id'] = array('eq', 1); $map['_string'] ='user="蠟筆小新" AND email="xiaoxin@163.com"'; var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID=1而且user=蠟筆小新而且email=xiaoxin@163.com):SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( user="蠟筆小新" AND email="xiaoxin@163.com" )
方式二:所有以鏈接符(安全推薦)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //請求字符串查詢(_query) $user = M('User'); $map['id'] = array('eq', 1); $map['_query'] ='user=蠟筆小新&email=xiaoxin@163.com&_logic=OR'; var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID=1而且user=蠟筆小新而且email=xiaoxin@163.com):SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( `user` = '蠟筆小新' OR `email` = 'xiaoxin@163.com' )
方式三:
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //複合查詢(_complex) $user = M('User'); $where['user'] = array('like', '%小%'); $where['id'] = 1; $where['_logic'] = 'OR'; $map['_complex'] = $where; $map['id'] = 3; $map['_logic'] = 'OR'; var_dump($user->where($map)->select()); } }
最終生成的SQL語句(查詢ID=1或者user=小或者ID=3):SELECT * FROM `think_user` WHERE ( ( `user` LIKE '%小%' ) OR ( `id` = 1 ) ) OR ( `id` = 3 )
六.統計查詢
ThinkPHP提供了一些數據統計查詢的方法。
統計查詢出幾個字段
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //數據總條數 $user = M('User'); var_dump($user->count()); } }
統計查詢出幾個字段:string '2' (length=1)語句:SELECT COUNT(*) AS tp_count FROM `think_user` LIMIT 1
統計查詢出幾個字段(遇到空不統計)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //字段總條數,遇到NULL不統計 $user = M('User'); var_dump($user->count('email')); } }
統計查詢出幾個字段(遇到空不統計):string '2' (length=1)語句:SELECT COUNT(email) AS tp_count FROM `think_user` LIMIT 1
最大值:
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //最大值 $user = M('User'); var_dump($user->max('id')); } }
統計查詢最大值:string '2' (length=1)語句:SELECT MAX(id) AS tp_max FROM `think_user` LIMIT 1
最小值:
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //最小值 $user = M('User'); var_dump($user->min('id')); } }
查詢最小值:string '1' (length=1)語句:SELECT MIN(id) AS tp_min FROM `think_user` LIMIT 1
平均值:
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //平均值 $user = M('User'); var_dump($user->avg('id')); } }
查詢平均值:string '1.5000' (length=6)語句:SELECT AVG(id) AS tp_avg FROM `think_user` LIMIT 1
總和:
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //求總和 $user = M('User'); var_dump($user->sum('id')); } }
查詢總和值:string '3' (length=1)語句:SELECT SUM(id) AS tp_sum FROM `think_user` LIMIT 1
七.動態查詢
藉助PHP5語言的特性,ThinkPHP實現了動態查詢。
1.getBy動態查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //查找email=xiaoin@163.com的數據 $user = M('User'); var_dump($user->getByemail('xiaoxin@163.com')); } }
查找email=xiaoin@163.com的數據sql語句:SELECT * FROM `think_user` WHERE ( `email` = 'xiaoxin@163.com' ) LIMIT 1
2.getFieldBy動態查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //經過user獲得相對應id值 $user = M('User'); var_dump($user->getFieldByUser('蠟筆小新', 'id')); } }
經過user獲得蠟筆小新相對應id值string '1' (length=1)語句:SELECT `id` FROM `think_user` WHERE ( `user` = '蠟筆小新' ) LIMIT 1
八.SQL查詢
ThinkPHP支持原生SQL查詢。
1.query讀取
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //查詢結果集,若是採用分佈式讀寫分離,則始終在讀服務器執行 $user = M('User'); var_dump($user->query('SELECT * FROM think_user')); } }
查詢think_user表sql語句:SELECT * FROM think_user
2.execute寫入
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //更新和寫入,若是採用分佈式讀寫分離,則始終在寫服務器執行 $user = M('User'); var_dump($user->execute('UPDATE think_user set user="蠟筆大新" WHERE id=1')); } }
修改ID=1的user=蠟筆大新sql語句:int 1語句:UPDATE think_user set user="蠟筆大新" WHERE id=1
ThinkPHP--模型操做部分---數據庫操做--SQL連貫操做
ThinkPHP模型基礎類提供的連貫操做,經過連貫操做能夠有效的提供數據存取的代碼清晰度和開發效率,而且支持全部的CURD操做。
一.連貫入門
連貫操做使用起來很是簡單,好比查找到id爲1,2,3,4中按照建立時間的倒序的前兩位。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //連貫操做入門 $user = M('User'); var_dump($user->where('id in (1,2,3)')->order('date DESC')->limit(2)->select()); } }
查詢id=1,2,3裏的前倆個數據sql語句:SELECT * FROM `think_user` WHERE ( id in (1,2,3) ) ORDER BY date DESC LIMIT 2
注意:這裏的where、order和limit方法都是連貫操做方法,因此它們都能返回$user自己,能夠互換位置。而select方法不是連貫方法,須要放在最後,用以顯示數據集。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //數組操做 $user = M('User'); var_dump($user->select(array('where'=>array('id'=>array('neq',1)),'order'=>'date DESC'))); } }
查詢id不等於1的按照時間排序sql語句:SELECT * FROM `think_user` WHERE ( `id` <> 1 )
刪除
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //CURD處理 $user = M('User'); var_dump($user->where('id=3')->delete()); } }
把ID=3的刪除
DELETE FROM `think_user` WHERE ( id=3 )
二.連貫方法
1.where
where方法支持字符串條件、數組條件(推薦用法)和屢次調用。
字符串方式(不推薦)
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //字符串方式 $user = M('User'); var_dump($user->where('id=1')->select()); } }
查詢ID=1的sql語句:SELECT * FROM `think_user` WHERE ( id=1 )
索引數組方式
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //索引數組方式 $user = M('User'); $map['id'] = 1; //使用表達式array('eq', 1); var_dump($user->where($map)->select()); } }
查詢ID=1的sql語句:SELECT * FROM `think_user` WHERE ( `id` = 1 )
屢次調用方式
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //屢次調用方式 $user = M('User'); $map['id'] = array('eq', 1); var_dump($user->where($map)->where('user="蠟筆小新"')->select()); } }
查詢ID=1而且user=蠟筆小新的sql語句:SELECT * FROM `think_user` WHERE ( `id` = 1 ) AND ( user="蠟筆小新" )
2.order
order用於對結果集排序。
倒序
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //倒序 $user = M('User'); $map['id'] = array('eq', 1); var_dump($user->order('id desc')->select()); //正序默認或ASC } }
查詢ID倒序的sql:SELECT * FROM `think_user` ORDER BY id desc
數組形式防止字段和mysql關鍵字衝突
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //數組形式防止字段和mysql關鍵字衝突 $user = M('User'); $map['id'] = array('eq', 1); var_dump($user->order(array('id'=>'DESC'))->select()); } }
查詢ID倒序的sql:SELECT * FROM `think_user` ORDER BY `id` DESC
3.feild
feild方法能夠返回或操做字段,能夠用於查詢和寫入操做。
只顯示id和user兩個字段
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //只顯示id和user兩個字段 $user = M('User'); var_dump($user->field('id, user')->select()); } }
只顯示id和user兩個字段的sql:SELECT `id`,`user` FROM `think_user`
使用SQL函數和別名
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //使用SQL函數和別名 $user = M('User'); var_dump($user->field('SUM(id) as count, user')->select()); } }
統計ID的總和和別名:SELECT SUM(id) as count,`user` FROM `think_user`
使用數組參數結合SQL函數
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //使用數組參數結合SQL函數 $user = M('User'); var_dump($user->field(array('id','LEFT(user,3)'=>'left_user'))->select()); } }
取id和user的前三位把別名改變爲left_user直接指向left_user:SELECT `id`,LEFT(user,3) AS `left_user` FROM `think_user`
獲取全部數據
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //獲取全部字段 $user = M('User'); var_dump($user->field()->select()); //能夠傳入*號,或者省略方法 } }
獲取全部數據sql:SELECT * FROM `think_user`
3.limit
limit方法主要用於指定查詢和操做的數量。
限制結果集數量
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //限制結果集數量 $user = M('User'); var_dump($user->limit(2)->select()); } }
只顯示倆條sql:SELECT * FROM `think_user` LIMIT 2
分頁查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //分頁查詢 $user = M('User'); var_dump($user->limit(0,2)->select()); //0表明從第1條開始,2表明顯示倆條 } }
從第1條開始每頁顯示倆條sql:SELECT * FROM `think_user` LIMIT 0,2
4.page
page方法徹底用於分頁查詢。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //page分頁 $user = M('User'); var_dump($user->page(1,2)->select()); //1表明第一頁,2表明每頁顯示倆條 } }
從第1條開始每頁顯示倆條sql:SELECT * FROM `think_user` LIMIT 0,2
5.table
table方法用於數據表操做,主要是切換數據表或多表操做。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //切換數據表 $user = M('User'); var_dump($user->table('think_info')->select()); } }
切換到think_info這張表:SELECT * FROM `think_info`
獲取簡化表名
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { ///獲取簡化表名 $user = M('User'); var_dump($user->table('__USER__')->select()); //__INFO__尚可 } }
切換到think_info這張表:SELECT * FROM `think_user`
多表查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //多表查詢 $user = M('User'); var_dump($user->field('a.id,b.id')->table('__USER__ a,__INFO__ b')->select()); } }
查詢雙表think_user a,think_info b語句:SELECT a.id,b.id FROM think_user a,think_info b
數組形式奪標查詢
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //多表查詢,使用數組形式避免關鍵字衝突 $user = M('User'); var_dump($user->field('a.id,b.id')->table(array('think_user'=>'a', 'think_info'=>'b'))->select()); } }
語句:SELECT a.id,b.id FROM `think_user` `a`,`think_info` `b`
6.alias
alias用於設置數據表別名
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //設置別名 $user = M('User'); var_dump($user->alias('a')->select()); } }
設置數據表的別名爲think_user a語句:SELECT * FROM think_user a
7.group
group方法一般用於對結合函數統計的結果集分組。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //分組統計 $user = M('User'); var_dump($user->field('user,max(id)')->group('id')->select()); } }
以ID進行分組:SELECT `user`,max(id) FROM `think_user` GROUP BY id
8.having
having方法通常用於配合group方法完成從分組的結果中再篩選數據。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //分組統計結合having $user = M('User'); var_dump($user->field('user,max(id)')->group('id')->having('id>2')->select()); } }
sql語句:SELECT `user`,max(id) FROM `think_user` GROUP BY id HAVING id>2
9.comment
comment方法用於對SQL語句進行註釋
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //SQL註釋 $user = M('User'); var_dump($user->comment('全部用戶')->select()); } }
sql註釋語句:SELECT * FROM `think_user` /* 全部用戶 */
10.join
join方法用於多表的鏈接查詢。
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //JOIN多表關聯,默認是INNER JOIN $user = M('User'); var_dump($user->join('think_user ON think_info.id = think_user.id')->select()); //__USER__和__INFO__代替 } }
查看think_info.id表和think_user.id表ID是否同樣語句:SELECT * FROM `think_user` INNER JOIN think_user ON think_info.id = think_user.id
11.union
union方法用於合併多個SELECT的結果集
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //合併多個SELECT結果集 $user = M('User'); var_dump($user->union("SELECT * FROM think_info")->select()); } }
合併think_user和think_info的結果集語句:SELECT * FROM `think_user` UNION SELECT * FROM think_info
12.distinct
distinct方法用於返回惟一不一樣的值
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //返回不重複的列 $user = M('User'); var_dump($user->distinct(true)->field('user')->select()); } }
返回不重複的user語句:SELECT DISTINCT `user` FROM `think_user`
13.cache
cache用於查詢緩存操做
<?php namespace Home\Controller; use Think\Controller; use Think\Model; class UserController extends Controller { public function model () { //查詢緩存,第二次讀取緩存內容 $user = M('User'); var_dump($user->cache(true)->select()); } }
查詢think_user表用緩存語句:SELECT * FROM `think_user`
注意:第一次查詢數據庫,第二次查詢相同的內容直接調用緩存,不用再查詢數據庫
三.命名範圍
命名範圍其實就是將SQL語句封裝在模型定義類裏,而不在控制器裏。這樣的分層操做有利於代碼的可讀性,避免開發人員在寫CURD操做時出現問題。架構人員只要在命名範圍內合理的規劃便可,相似於架構師架構了接口,讓開發人員面向接口開發同樣。
要使用命名範圍,第一步要定義屬性:Weibo\Home\Model\UserModel.class.php
<?php namespace Home\Model; use Think\Model; class UserModel extends Model { protected $_scope = array( //建立屬性,屬性名必須是_scope,作一個數組array 'sql1'=>array( 'where'=>array('id'=>1), ), 'sql2'=>array( 'order'=>'date DESC', 'limit'=>2, ), 'default'=>array( 'where'=>array('id'=>2), ), ); }
命名範圍支持的屬性有:where、field、order、table、limit、page、having、group、lock、distinct、cache。
調用端:
單個scope方法
<?php namespace Home\Controller; use Think\Controller; use Think\Model; use Home\Model\UserModel; class UserController extends Controller { public function model () { //調用命名範圍 $user = D('User'); var_dump($user->scope('sql1')->select()); //scope方法調用 } }
調用Weibo\Home\Model\UserModel.class.php裏的sql1語句:SELECT * FROM `think_user` WHERE ( `id` = 1 )
多個scope方法
<?php namespace Home\Controller; use Think\Controller; use Think\Model; use Home\Model\UserModel; class UserController extends Controller { public function model () { //支持調用多個scope方法 $user = D('User'); var_dump($user->scope('sql1')->scope('sql2')->select()); } }
調用Weibo\Home\Model\UserModel.class.php裏的sql1和sql2
default默認
<?php namespace Home\Controller; use Think\Controller; use Think\Model; use Home\Model\UserModel; class UserController extends Controller { public function model () { //default默認 $user = D('User'); var_dump($user->scope()->select()); //傳遞default也行 } }
調用Weibo\Home\Model\UserModel.class.php裏的default語句:SELECT * FROM `think_user` WHERE ( `id` = 2 )
對命名範圍的SQL進行調整
<?php namespace Home\Controller; use Think\Controller; use Think\Model; use Home\Model\UserModel; class UserController extends Controller { public function model () { //對命名範圍的SQL進行調整 $user = D('User'); var_dump($user->scope('sql2', array('limit'=>4))->select()); } }
調用Weibo\Home\Model\UserModel.class.php裏的sql2把'limit'=>4語句:SELECT * FROM `think_user` ORDER BY date DESC LIMIT 2
直接覆蓋命名範圍
<?php namespace Home\Controller; use Think\Controller; use Think\Model; use Home\Model\UserModel; class UserController extends Controller { public function model () { //直接覆蓋命名範圍 $user = D('User'); var_dump($user->scope(array('where'=>1,'order'=>'date DESC','limit'=>2))->select()); }
直接覆蓋命名範圍語句:SELECT * FROM `think_user` ORDER BY date DESC LIMIT 2
直接用命名範圍名調用
<?php namespace Home\Controller; use Think\Controller; use Think\Model; use Home\Model\UserModel; class UserController extends Controller { public function model () { //直接用命名範圍名調用 $user = D('User'); var_dump($user->sql2()->select()); } }
SELECT * FROM `think_user` ORDER BY date DESC LIMIT 2
ThinkPHP--模型操做部分---數據庫操做--CURD(增刪改查)操做
一.數據建立
1.在數據庫添加等操做以前,咱們首先須要對數據進行建立。何爲數據建立,就是接受提交過來的數據,好比表單提交的POST(默認)數據。接受到數據後,還能夠對數據進行有效的驗證、完成、生成等工做。
作一個提交頁面做於測試:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP/Home/User/create"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <p>生日:<input type="text" name="birthday"></p> <input type="submit" value="提交"> </form>
當提交數據傳輸到http://localhost/ThinkPHP/Home/User/create
路徑:ThinkPHP/Weibo/Home/Common/Controller/UserController.class.php代碼
方式一:根據表單提交的POST數據,建立數據對象
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function create() { //根據表單提交的POST數據,建立數據對象 $user = M('User'); var_dump($user->create()); //create只提交跟user對應的字段 } }
create返回了一個數組數組包含user和email,生日沒有提交出去,由於生日不存在User表裏的:
array (size=2)
'user' => string '蠟筆小新' (length=12)
'email' => string 'xiaoxin@qq.com' (length=14)
注意:這裏create()方法就是數據建立,數據的結果就是提交的POST數據的鍵值對。特別注意的是:提交過來的字段和數據表字段是對應的,不然沒法解析。
作一個提交頁面做於測試:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP/Home/User/create"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
方式二:經過數組手工獲取數據,覆蓋提交的
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function create() { //經過數組手工獲取數據,覆蓋提交的 $user = M('User'); $data['user'] = $_POST['user']; //直接用post接收user $data['email'] = $_POST['email']; //直接用post接收email $data['date'] = date('Y-m-d H:i:s'); //時間不須要提交過來,本身直接作,和數據表對應,不然無效 var_dump($user->create($data)); } }
經過數組手工提交獲取數據結果:
array (size=3)
'user' => string '西西' (length=6)
'email' => string 'xixi@qq.com' (length=11)
'date' => string '2018-04-14 13:30:41' (length=19)
方式三:經過對象手工獲取數據,覆蓋提交的
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function create() { //經過對象手工獲取數據,覆蓋提交的 $user = M('User'); $data = new \stdClass(); $data->user = $_POST['user']; $data->email = $_POST['email']; $data->date = date('Y-m-d H:i:s'); var_dump($user->create($data)); } }
經過對象手工提交獲取數據結果:
array (size=3)
'user' => string '西西' (length=6)
'email' => string 'xixi@qq.com' (length=11)
'date' => string '2018-04-14 13:30:41' (length=19)
2.經過get方式發送
作一個提交頁面做於測試把post方式改成get方式:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="get" action="http://localhost/ThinkPHP/Home/User/create"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
傳遞$_GET
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function create() { //默認是$_POST,傳遞$_GET修改 $user = M('User'); var_dump($user->create($_GET)); } }
create()方法的內部工做分爲9步:
1.獲取數據源(默認是POST);
2.驗證數據合法性(非數據或對象會過濾),失敗則返回false;
3.檢查字段映射;
4.判斷數據狀態(新增仍是修改);
5.數據自動驗證,失敗則返回false;
6.表單令牌驗證,失敗則返回false;
7.表單數據賦值(過濾非法字段和字符串處理);
8.數據自動完成;
9.生成數據對象(保存在內存)。
create()方法能夠配合連貫操做配合數據建立,支持的連貫操做有:
作一個提交頁面做於測試:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP/Home/User/create"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
1.field,用於定義合法的字段;
(1)限制可操做的字段:email
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function create() { //限制可操做的字段user $user = M('User'); var_dump($user->field('user')->create()); } }
只顯示user
array (size=1)
'user' => string '蠟筆小新' (length=12)
(2)在模型類裏限制字段email
路徑:ThinkPHP/Weibo/Home/Common/Model/UserModle.class.php代碼
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { protected $insertFields = 'user'; protected $updateFields = 'user'; }
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function create() { //限制可操做的字段 $user = D('User'); var_dump($user->field('user')->create()); } }
只顯示user:
array (size=1)
'user' => string '蠟筆小新' (length=12)
2.validate,用於數據自動驗證;
3.auto,用於數據自動完成;
4.token,用於令牌驗證
二.數據寫入(add)
數據寫入使用的是add()方法。
方式一:普通方式新增一條數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //新增一條數據 $user = M('User'); $data['user'] = '西西'; $data['email'] = 'xixi.163@.com'; $data['date'] = date('Y-m-d H:i:s'); $user->add($data); } }
sql語句:INSERT INTO `think_user` (`user`,`email`,`date`) VALUES ('西西','xixi.163@.com','2018-04-14 13:44:35')
方式二:結合create()方法
作一個add寫入提交頁面:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP/Home/User/add"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //結合create()方法 $user = M('User'); $data = $user->create(); $data['date'] = date('Y-m-d H:i:s'); $user->add($data); } }
經過提交頁面提交後sql語句:INSERT INTO `think_user` (`user`,`email`,`date`) VALUES ('西西123','xixi@qq.com','2018-04-14 13:47:16')
add()方法支持的連貫操做有:
1.table,定義數據表名稱;
2.data,指定要寫入的數據對象;
(1)使用data連貫方法
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //使用data連貫方法 $user = M('User'); $data = $user->create(); $data['date'] = date('Y-m-d H:i:s'); $user->data($data)->add(); } }
經過提交頁面提交後sql語句:INSERT INTO `think_user` (`user`,`email`,`date`) VALUES ('西西456','xixi@qq.com','2018-04-14 13:50:44')
(2)data連貫方法 支持字符串、數組、對象
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //data連貫方法 支持字符串、數組、對象 $user = M('User'); $data = 'user=星矢&mail=xinshi@qq.com&date='.date('Y-m-d H:i:s'); $user->data($data)->add(); } }
經過提交頁面提交後sql語句:INSERT INTO `think_user` (`user`,`date`) VALUES ('星矢','2018-04-14 13:52:41')
3.field,定義要寫入的字段;
4.relation,關聯查詢;
5.validate,數據自動驗證;
6.auto,數據自動完成;
7.filter,數據過濾;
8.scope*,命名範圍;
9.bind,數據綁定操做;
10.token,令牌驗證;
11.comment,SQL註釋;
三.數據讀取()
數據讀取的功能select()方法。結合各類連貫方法能夠實現數據讀取的不一樣要求,支持連貫的方法有:
1.where,查詢或更新條件;
2.table,要操做的數據表名稱;
3.alias,數據表別名;
4.field,查詢字段;
5.order,結果排序;
6.group,查詢分組;
7.having,分組再查詢;
8.join,多表連接查詢;
9.union,合併SELECT;
10.distinct,取惟一值;
11.lock,鎖;
12.cache,緩存;
13.relation,關聯查詢;
14.result,數據轉換;
15.scope,命名範圍;
16.bind,數據綁定操做;
17.comment,SQL註釋。
顯示默認第一條數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //顯示默認第一條數據 $user = M('User'); var_dump($user->find()); //能夠傳遞數字參數,AR模式 } }
sql語句:SELECT * FROM `think_user` LIMIT 1
顯示默認全部數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //顯示默認全部數據 $user = M('User'); var_dump($user->select()); //能夠傳遞數組形式的SQL } }
sql語句:SELECT * FROM `think_user`
獲取第一條user字段的值
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //獲取第一條user字段的值 $user = M('User'); var_dump($user->getField('user')); } }
sql語句:SELECT `user` FROM `think_user` LIMIT 1
獲取全部user字段的值
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //獲取全部user字段的值 $user = M('User'); var_dump($user->getField('user',true)); } }
sql語句:SELECT `user` FROM `think_user`
傳遞多個字段,獲取全部(重複的被屏蔽)
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //傳遞多個字段,獲取全部 $user = M('User'); var_dump($user->getField('user,email')); } }
sql語句:SELECT `user`,`email` FROM `think_user`
用id冒號分隔
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //id冒號分隔 $user = M('User'); var_dump($user->getField('id,user,email',':')); } }
sql語句:SELECT `id`,`user`,`email` FROM `think_user`
限制2條數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function select() { //限制2條數據 $user = M('User'); var_dump($user->getField('id,user,email',2)); } }
sql語句:SELECT `id`,`user`,`email` FROM `think_user` LIMIT 2
四.數據更新(save)
數據更新使用的方法是save()方法,主要是對數據的修改操做。
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function save() { //修改第一條數據 $user = M('User'); $data['user'] = '蠟筆大新'; $data['email'] = 'daxin@qq.com'; $map['id'] = 1; $user->where($map)->save($data); //成功後返回1,不然0 } }
sql語句:UPDATE `think_user` SET `user`='蠟筆大新',`email`='daxin@qq.com' WHERE ( `id` = 1 )
判斷主鍵是條件(可讀性差)
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function save() { //默認主鍵爲條件 $user = M('User'); $data['id'] = 1; $data['user'] = '蠟筆小新'; $data['email'] = 'xiaoxin@163.com'; $user->save($data); } }
sql語句:UPDATE `think_user` SET `user`='蠟筆小新',`email`='xiaoxin@163.com' WHERE ( `id` = 1 )
數據更新的save()方法支持的連貫方法有:
1.where,查詢或更新條件;
2.table,要操做的數據表名稱;
3.alias,數據表別名;
4.field,查詢字段;
5.order,結果排序;
6.lock,鎖;
7.relation,關聯查詢;
8.scope,命名範圍;
9.bind,數據綁定操做;
10.comment,SQL註釋。
作一個save更新提交頁面:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP/Home/User/save"> <input type="hidden" name="id" value="1"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
結合create()可讀性更差
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function save() { //結合create() $user = M('User'); $user->create(); //POST必須包含主鍵 $user->save(); } }
結合create提交後sql語句:UPDATE `think_user` SET `user`='蠟筆大新',`email`='113194773@qq.com' WHERE ( `id` = 1 )
修改某一個值
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function save() { //修改某一個值 $user = M('User'); $map['id'] = 1; $user->where($map)->setField('user', '蠟筆小新'); } }
sql語句:UPDATE `think_user` SET `user`='蠟筆小新' WHERE ( `id` = 1 )
統計累計,累加count字段加1
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function save() { //統計累計,累加 $user = M('User'); $map['id'] = 1; $user->where($map)->setInc('count',1); //累加 } }
sql語句:UPDATE `think_user` SET `count`=count+1 WHERE ( `id` = 1 )
統計累計,累減count字段減1
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller {
public function save() {
//統計累計,累加累減
$user = M('User');
$map['id'] = 1;
$user->where($map)->setDec('count',1); //setDec累減
}
}
sql語句:UPDATE `think_user` SET `count`=count-1 WHERE ( `id` = 1 )
五.數據刪除(delete)
數據刪除使用的方法是delete()方法。
直接刪除主鍵(id=4)
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function delete() { //直接刪除主鍵(id=4) $user = M('User'); $user->delete(4); } }
sql語句:DELETE FROM `think_user` WHERE ( `id` = 4 )
根據ID來刪除
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function delete() { //根據ID來刪除 $user = M('User'); $map['id'] = 5; $user->where($map)->delete(); } }
sql語句:DELETE FROM `think_user` WHERE ( `id` = 5 )
批量刪除多個
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function delete() { //批量刪除多個 $user = M('User'); $user->where($map)->delete('7,10,11'); } }
sql語句:DELETE FROM `think_user` WHERE ( `id` IN ('7','10','11') )
刪除count爲0且按時間倒序的前五個
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function delete() { //刪除count爲0且按時間倒序的前倆個 $user = M('User'); $map['count'] = 0; //count爲0刪掉還剩一個 $user->where($map)->order(array('date'=>'DESC'))->limit(2)->delete(); //排序order把最後倆個刪掉 } }
sql語句:DELETE FROM `think_user` WHERE ( `count` = 0 ) ORDER BY `date` DESC LIMIT 2
刪除全部數據,謹慎
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function delete() { //刪除全部數據 $user = M('User'); echo $user->where('1')->delete(); } }
delete()方法支持的連貫操做有:
1.where,查詢或更新條件;
2.table,要操做的數據表名稱;
3.alias,數據表別名;
4.order,結果排序;
5.lock,鎖;
6.relation,關聯查詢;
7.scope,命名範圍;
8.bind,數據綁定操做;
9.comment,SQL註釋。
六.ActiveReocrd模式(ar)
這種模式最大的特別就是簡化了CURD的操做,而且採用對象化的操做方式,便於使用和理解。
ActiveReocrd模式添加一條數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function ar() { //添加一條數據 $user = M('User'); $user->user = '火影忍者'; $user->email = 'huoyin@qq.com'; $user->date = date('Y-m-d H:i:s'); $user->add(); } }
sql語句:INSERT INTO `think_user` (`user`,`email`,`date`) VALUES ('火影忍者','huoyin@qq.com','2018-04-14 12:35:33')
找到主鍵爲2的值
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function ar() { //找到主鍵爲2的值 $user = M('User'); var_dump($user->find(2)); } }
sql語句:SELECT * FROM `think_user` WHERE ( `id` = 2 ) LIMIT 1
查找user=西西的記錄並輸出
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function ar() { //查找user=西西的記錄 $user = M('User'); var_dump($user->getByUser('西西')); //輸出user echo $user->user; } }
sql語句:SELECT * FROM `think_user` WHERE ( `user` = '西西' ) LIMIT 1
經過主鍵查詢1,2,3數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function ar() { //經過主鍵查詢多個 $user = M('User'); var_dump($user->select('1,2,3')); } }
sql語句:SELECT * FROM `think_user` WHERE ( `id` IN ('1','2','3') )
查找id=3的把user改爲蠟筆老新(效率不高)
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function ar() { //修改一條數據 $user = M('User'); $user->find(3); //找到第一條 $user->user = '蠟筆老新'; //改爲 $user->save(); } }
sql語句:
SELECT * FROM `think_user` WHERE ( `id` = 3 ) LIMIT 1
UPDATE `think_user` SET `user`='蠟筆老新',`email`='xixi.163@.com',`count`=null,`date`='2018-04-14 11:44:44' WHERE ( `id` = 3 )
查找id=3的刪除掉(效率不高)
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function ar() { //刪除當前找到的數據 $user = M('User'); $user->find(3); $user->delete(); } }
sql語句:
SELECT * FROM `think_user` WHERE ( `id` = 3 ) LIMIT 1
DELETE FROM `think_user` WHERE ( `id` = 3 )
七.字段映射
字段映射能夠將表單裏的name名稱對應到數據表裏的字段,這樣防止系統自動屏蔽掉不對應的POST值。
作一個model寫入提交頁面:http://localhost/ThinkPHP/index.html
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP/Home/User/model"> <p>用戶:<input type="text" name="xingming"></p> <p>郵箱:<input type="text" name="youxiang"></p> <input type="submit" value="提交"> </form>
UserModle.class.php代碼:在模型類型裏限制字段xingming=user,youxiang=email
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { protected $_map = array( 'xingming'=>'user', 'youxiang'=>'email', ); }
UserController.class.php最後實現字段映射獲取
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function model() { //字段映射獲取 $user = D('User'); var_dump($user->create()); } }
ThinkPHP--模型操做部分----數據庫操做---自動驗證
ThinkPHP模型層提供的一種數據驗證方法,能夠在使用create建立數據對象的時候進行自動驗證。
一.驗證規則
數據驗證能夠對錶單中的字段進行非法的驗證操做。通常提供了兩種驗證方式:靜態定義($_validate屬性處理字段的)和動態驗證(validate()方法靈活性比較高)。
ThinkPHP/Weibo/Home/Model/UserModle.class.php添加須要驗證限制字段
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //驗證規則 protected $_validate = array( array('user','require','用戶不得爲空!',0,'regex',3), //(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]) array(), ); }
注意:驗證字段、驗證規則和錯誤提示這三項是必選的,大多數也是用這三項;而驗證條件、附加規則和驗證時間是可選的。
1.驗證字段:通常來講是表單的字段名,不必定必須和數據表匹配的,由於有一些好比密碼確認等輔助字段的存在。
2.驗證規則:系統內置了經常使用的規則,require(字段必填)、email(郵箱格式)、url(url格式)、currency(貨幣)、number(正整數)、integer(整數)、double(浮點數)、zip(郵政編碼)、english(英文)。這些規則默認採用的附加規則是regex,正則表達式驗證,只不過是設定好的。
3.錯誤信息:驗證失敗後的提示。
4.驗證條件:共三種:
(1)self::EXISTS_VALIDATE或0,表示存在字段就驗證(默認);
(2)self::MUST_VALIDATE或1,表示必須驗證;
(3)self::VALUE_VALIDATE或2,表示值不爲空的時候驗證。
5.附加規則包括如下規則:
regex規則:正則驗證,定義的驗證規則是一個正則表達式(默認)
function規則:函數驗證,定義的驗證規則是一個函數名
callback規則:方法驗證,定義的驗證規則是當前模型類的一個方法
confirm規則:驗證表單中的兩個字段是否相同,定義的驗證規則是一個字段名
equal規則:驗證是否等於某個值,該值由前面的驗證規則定義
notequal規則:驗證是否不等於某個值,該值由前面的驗證規則定義(3.1.2版本新增)
in規則:驗證是否在某個範圍內,定義的驗證規則能夠是一個數組或者逗號分割的字符串
notin規則:驗證是否不在某個範圍內,定義的驗證規則能夠是一個數組或者逗號分割的字符串(3.1.2版本新增)
length規則:驗證長度,定義的驗證規則能夠是一個數字(表示固定長度)或者數字範圍(例如3,12 表示長度從3到12的範圍)
between規則:驗證範圍,定義的驗證規則表示範圍,可使用字符串或者數組,例如1,31或者array(1,31)
notbetween規則:驗證不在某個範圍,定義的驗證規則表示範圍,可使用字符串或者數組(3.1.2版本新增)
expire規則:驗證是否在有效期,定義的驗證規則表示時間範圍,能夠到時間,例如可使用 2012-1-15,2013-1-15 表示當前提交有效期在2012-1-15到2013-1-15之間,也可使用時間戳定義
ip_allow規則:驗證IP是否容許,定義的驗證規則表示容許的IP地址列表,用逗號分隔,例如201.12.2.5,201.12.2.6
ip_deny規則:驗證IP是否禁止,定義的驗證規則表示禁止的ip地址列表,用逗號分隔,例如201.12.2.5,201.12.2.6
unique規則:驗證是否惟一,系統會根據字段目前的值查詢數據庫來判斷是否存在相同的值,當表單數據中包含主鍵字段時unique不可用於判斷主鍵字段自己
6.驗證時間:主要新增修改等驗證。
(1)self::MODEL_INSERT或1新增數據時驗證;
(2)self::MODEL_UPDATE或2編輯數據時驗證;
(3)self::MODEL_BOTH或3所有狀況下驗證(默認)。
ThinkPHP/Weibo/Home/Controller/UserController.class.php判斷驗證
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { $user = D('User'); $date['user'] = '蠟筆小新'; //模擬post提交 if ($user->create($date)) { echo '全部字段驗證成功'; }else { var_dump($user->getError()); //自帶getError方法 } } }
當user有值的狀況下顯示:全部字段驗證成功
當user沒有值的狀況下顯示::string '用戶不得爲空!'
二.靜態定義
在模型類裏預先定義好該模型的自動驗證規則,就是靜態定義。
ThinkPHP提供了九種自動驗證內置方案
ThinkPHP/Weibo/Home/Model/UserModle.class.php添加須要驗證限制字段
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { protected $_validate = array( //內置驗證require,不得爲空的用法 array('user', 'require', '用戶不得爲空!'), //內置驗證email,合法的郵箱格式 array('user', 'email', '郵箱格式不合法!'), //內置驗證url,驗證網址是否合法 array('user', 'url', 'URL路徑不合法!'), //內置驗證currency,驗證是否爲貨幣 array('user', 'currency', '貨幣格式不正確!'), //內置驗證zip,驗證是否爲六位整數郵政編碼 array('user', 'zip', '郵政編碼格式不正確!'), //內置驗證number,驗證是否爲正整數 array('user', number, '正整數格式不正確!'), //內置驗證integer,驗證是否爲整數,正負都可 array('user', 'integer', '整數格式不正確!'), //內置驗證double,驗證是否爲浮點數,正負都可 array('user', 'double', '整數格式不正確!'), //內置驗證english,驗證是純英文 array('user', 'english', '不是純英文!'), ); }
ThinkPHP還提供了附加規則,來提高自動驗證的擴展性:
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { protected $_validate = array( //附加規則regex,驗證3-6位純數字 array('user', '/^\d{3,6}$/', '不是3-6位純正數字', 0, 'regex'), //0表示有字段的時候驗證 //附加規則equal,驗證是否和指定值相等 array('user', '西西', '值不對等', 0, 'equal'), //若是傳遞過來的值不是西西彈出值不對等 //附加規則notequal,驗證是否與指定值不等 array('user', '西西', '值不能相等', 0, 'notequal'), //若是傳遞過來的值是西西彈出值不能相等 //附加規則confirm,驗證兩條字段是否相同 array('user', 'name', '兩個用戶名對比不一樣!',0,'confirm'), //若是'user'和'name'不相等彈出兩個用戶名對比不一樣(用於密碼和密碼確認) //附加規則in,某個範圍,能夠是數組或逗號分割的字符串 array('user', array(1,2,3), '不在指定範圍', 0, 'in'), //若是傳遞過來的值不是1,2,3彈出不在指定範圍 array('user', '張三,李四,王五', '不在指定範圍', 0, 'in'), //字符串形式也能夠 //附加規則notin,某個範圍,能夠是數組或逗號分割的字符串 array('user', array(1,2,3), '不得在指定範圍', 0, 'notin'), //若是傳遞過來的值是1,2,3彈出不得在指定範圍 array('user', '張三,李四,王五', '不得在指定範圍', 0, 'notin'), //附加規則length,驗證長度或數字範圍 array('user', '3', '不得小於3位', 0, 'length'), //若是長度小於3位彈出不得小於3位 array('user', '3,5', '不得小於3位,不得大於5位', 0, 'length'), /若是長度超過3-5位位彈出不得小於3位,不得大於5位 //附加規則between,驗證某個範圍,數字或逗號字符串 array('user', array(3,5), '必須是3-5之間的數字', 0, 'between'), //若是是3-5之間的數字彈出必須是3-5之間的數字 array('user', '3,5', '必須是3-5之間的數字', 0, 'between'), //附加規則notbetween,驗證某個範圍,數字或逗號字符串 array('user', array(3,5), '必須不是3-5之間的數字', 0, 'notbetween'), //若是是3-5之間的數字彈出必須不是3-5之間的數字 array('user', '3,5', '必須不是3-5之間的數字', 0, 'notbetween'), //附加規則expire,設置有效期範圍,必須是表單提交有效,能夠是時間戳 array('user', '2018-1-10,2019-10-10', '時間已過時', 0, 'expire'), //在這個時間內彈出時間已過時 //附加規則ip_deny,IP禁止列表 array('user', '127.0.0.1', '當前IP被禁止', 0, 'ip_deny'), //自動獲取IP判斷禁止 //附加規則ip_allow,IP容許列表 array('user', '127.0.0.1', '當前IP沒有被容許', 0, 'ip_allow'), //只容許127.0.0.1這個IP訪問 ); }
爲了測試方便,咱們能夠直接經過模擬提交POST:
ThinkPHP/Weibo/Home/Controller/UserController.class.php判斷驗證
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //控制器create()方法自動調用驗證 $user = D('User'); $data['user'] = '測試'; if ($user->create($data)) { echo '全部數據驗證成功!'; } else { //輸出錯誤信息 var_dump($user->getError()); } } }
自定義規則用戶名字必須在3-5位
回調方法
ThinkPHP/Weibo/Home/Model/UserModle.class.php添加須要驗證限制字段
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { protected $_validate = array( array('user', 'checkLength', '用戶名必須在3-5位', 0, 'callback', 3, array(3,5)), //執行回調函數checkLength,錯誤提示用戶名必須在3-5位,默認0佔位,callback回調函數,默認是3,array(3,5)是能夠給它們傳值的 ); //回調方法 protected function checkLength($str,$min,$max) { //執行這個方法checkLength的返回值來驗證接收三個參數:$str獲得user傳過來的值,$min最小值,最大值$max preg_match_all("/./u", $str, $matches); //正則表達式獲得一個數組$matches $len = count($matches[0]); //獲得相應的數組保存在$len if ($len < $min || $len > $max) { //若是$len小於$min或者大於$max return false; //返回false } else { return true; } }
ThinkPHP/Weibo/Home/Controller/UserController.class.php判斷驗證
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //控制器create()方法自動調用驗證 $user = D('User'); $data['user'] = '西西西西'; if ($user->create($data)) { echo '全部數據驗證成功!'; } else { //輸出錯誤信息 var_dump($user->getError()); } } }
函數驗證附加規則function,
ThinkPHP/Weibo/Home/Model/UserModle.class.php添加須要驗證限制字段
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { protected $_validate = array( //附加規則function,函數驗證 array('user', 'checkLength', '用戶名必須在3-5位', 0, 'function', 3, array(3,5)), //執行回調函數checkLength,錯誤提示用戶名必須在3-5位,默認0佔位,callback回調函數,默認是3,array(3,5)是能夠給它們傳值的 ); }
智能加載必須放在公共模塊下的公共核心文件夾新建一個規定的名稱ThinkPHP/Weibo/Common/Common/function.php
<?php //函數驗證 function checkLength($str,$min,$max) { //執行這個方法checkLength的返回值來驗證接收三個參數:$str獲得user傳過來的值,$min最小值,最大值$max preg_match_all("/./u", $str, $matches); //正則表達式獲得一個數組$matches $len = count($matches[0]); //獲得相應的數組保存在$len if ($len < $min || $len > $max) { //若是$len小於$min或者大於$max return false; //返回false } else { return true; } }
ThinkPHP/Weibo/Home/Controller/UserController.class.php判斷驗證
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //控制器create()方法自動調用驗證 $user = D('User'); $data['user'] = '西西西西'; if ($user->create($data)) { echo '全部數據驗證成功!'; } else { //輸出錯誤信息 var_dump($user->getError()); } } }
若是有多個字段都包含錯誤,默認只顯示一個錯誤。若是想顯示所有錯誤,能夠設置屬性:
ThinkPHP/Weibo/Home/Model/UserModle.class.php添加須要驗證限制字段(用戶名字和郵箱)
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //批量驗證 protected $patchValidate = true; protected $_validate = array( //附加規則function,函數驗證 array('user', 'checkLength', '用戶名必須在3-5位', 0, 'callback', 3, array(3,5)), //執行回調函數checkLength,錯誤提示用戶名必須在3-5位,默認0佔位,callback回調函數,默認是3,array(3,5)是能夠給它們傳值的 //內置驗證email,合法的郵箱格式 array('email', 'email', '郵箱格式不合法!'), ); //回調方法 protected function checkLength($str,$min,$max) { //執行這個方法checkLength的返回值來驗證接收三個參數:$str獲得user傳過來的值,$min最小值,最大值$max preg_match_all("/./u", $str, $matches); //正則表達式獲得一個數組$matches $len = count($matches[0]); //獲得相應的數組保存在$len if ($len < $min || $len > $max) { //若是$len小於$min或者大於$max return false; //返回false } else { return true; } } }
ThinkPHP/Weibo/Home/Controller/UserController.class.php判斷驗證返回JSON格式
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //控制器create()方法自動調用驗證 $user = D('User'); $data['user'] = '西西'; $data['email'] = 'aaa'; if ($user->create($data)) { echo '全部數據驗證成功!'; } else { //返回JSON格式 $this->ajaxReturn($user->getError()); } } }
三.動態驗證
動態驗證就是把驗證的規則放在控制器端,這樣,在操做的時候比較靈活,缺點就是比較混亂。
ThinkPHP/Weibo/Home/Controller/UserController.class.php所有寫在控制器裏
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //動態驗證 $rule = array( array('user', 'require', '用戶名不得爲空'), ); $user = M('User'); $data['user'] = ''; if ($user->validate($rule)->create($data)) { //動態validate方法定義傳$rule數組變量 echo '驗證全部字段成功!'; } else { var_dump($user->geterror()); } } }
當用戶名user有值顯示驗證全部字段成功!
當用戶名user沒有值顯示用戶名不得爲空
ThinkPHP--模型操做部分----數據庫操做--自動完成
ThinkPHP模型層提供的數據處理方法,主要用於數據的自動處理和過濾,使用create()方法建立數據是會自動完成。
一.完成規則
自動完成通常經過默認字段寫入、安全字段過濾以及業務邏輯的自動處理等。有兩種方式實現自動完成的規則:1.靜態方式:在模型類裏經過$_auto屬性定義處理規則;2動態方式:使用模型類的auto方法動態建立自動處理規則。
1.完成字段:必填,須要的字段名;
2.完成規則:必填,配合附加規則完成;
3.完成條件:可選,具體以下:
(1)self::MODEL_INSERT或1,新增數據的時候處理(默認);
(2)self::MODEL_UPDATE或2,更新數據的時候處理;
(3)self::MODEL_BOTH或3,全部狀況均處理。
4.配合完成規則使用,包括一下規則:
function規則:函數完成,定義的驗證規則是一個函數名
callback規則:方法完成,定義的驗證規則是當前模型類的一個方法
field規則:用其餘字段填充,表示填充的內容是一個其餘字段的值
string規則:字符串(默認)
ignore規則:爲空則忽略(3.1.2新增)
爲了測試方便,咱們能夠直接經過模擬提交POST:
ThinkPHP/Weibo/Home/Controller/UserController.class.php提交成功新增一條數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //控制器create()方法自動調用驗證 $user = D('User'); $data['user'] = '蠟筆小新'; //模擬數據提交 if ($user->create($data)) { //若是判斷成功了 $user->add(); //對他進行新增操做 } } }
二.靜態定義
在模型類裏預先定義好該模型的自動完成規則,就是靜態定義。
ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增數據的同時給count字段設置爲1
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //自動完成 protected $_auto = array( //自動設置count字段爲1 array('count', '1'), //string,自動設置count字段爲1 ); }
ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增數據的同時給密碼加密
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //自動完成 protected $_auto = array( //給密碼加密,加密類型爲sha1,sha1函數PHP內置 array('user', 'sha1', 3, 'function'), //function,給密碼加密,加密類型爲sha1,sha1函數PHP內置 ); }
ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增數據的同時把email字段的值填充到user字段
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //自動完成 protected $_auto = array( //把email字段的值填充到user字段中 array('user', 'email', 3, 'field'), ); }
ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增數據的同時把user字段前面加上下滑線_
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //自動完成 protected $_auto = array( //callback,給用戶名加前綴 array('user', 'addPrefix', 3, 'callback', '_'), ); //回調函數 protected function addPrefix($str, $prefix) { return $prefix.$str; } }
ThinkPHP/Weibo/Home/Controller/UserController.class.php提交成功只修改id=6的email
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //控制器create()方法自動調用驗證 $user = D('User'); $data['id'] = 6; //ID=6 $data['user'] = ''; //模擬數據提交 $data['email'] = 'xixi@xixi.com'; //模擬數據提交 if ($user->create($data)) { //若是判斷成功了 $user->save(); //對他進行修改操做 } } }
ThinkPHP/Weibo/Home/Model/UserModle.class.php模型在新增數據的同時留空的user忽略不修改
<?php namespace Home\Model; use Think\Model; //在模型類裏限制字段 class UserModel extends Model { //自動完成 protected $_auto = array( //ignore,用於修改時密碼留空時,忽略修改 array('user', '', 2, 'ignore'), //留空的時候忽略修改它 ); }
三.動態完成
動態完成就是把完成的規則放在控制器端,這樣,在操做的時候比較靈活,缺點就是比較混亂。
ThinkPHP/Weibo/Home/Controller/UserController.class.php實現動態給user加密
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function add() { //動態完成 $rules = array( array('user', 'sha1', 3, 'function'), ); $user = M('User'); $data['user'] = '蠟筆小新'; if ($user->auto($rules)->create($data)) { $user->add(); } } }
ThinkPHP--視圖(view)
ThinkPHP視圖,視圖是Web的可見內容,通常是HTML結合PHP獲取的數據提供給用戶使用的部分,屬於MVC中的V。
一.模版定義
模版在使用以前須要必定的設置,才能方便開發者使用。每一個模塊的模版文件是獨立的,爲了對模版文件更加有效的管理,ThinkPHP對模版文件機型目錄劃分,默認的模版文件定義規則是:
視圖目錄View/[模版主題/]控制器名User/操做名index+模版後綴.html
第一步:在User控制器UserController.class.php模塊執行一條語句:
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //渲染模版輸出 $this->display(); } }
注意:什麼都沒有定義的狀況下,會自動報錯,錯誤信息提示以下
模板不存在:./Weibo/Home/View/User/index.html
建立:/Weibo/Home/View/User/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 這是模版文件 </body> </html>
經過這個錯誤提示,咱們只要在View目錄下建立User目錄,並在User目錄下建立index.html文件,這時模版渲染模版輸出成功。
默認狀況下視圖目錄是View,若是你想改變成別的目錄名能夠設置:
在公共的核心庫裏配置文件Weibo/Common/Conf/config.php
修改模版的視圖目錄爲Template
<?php return array( //修改模版的視圖目錄 'DEFAULT_V_LAYER' =>'Template', );
默認狀況下的模版文件後綴是.html,若是你想改變成別的後綴能夠設置:
修改模版中的文件的後綴爲.tpl
<?php return array( //修改模版中的文件的後綴 'TMPL_TEMPLATE_SUFFIX'=>'.tpl' );
若是感受每個模塊,都要建立相應的目錄太過於麻煩,能夠設置:
用下劃線代替目錄層次爲Weibo/Home/User_index.html
<?php return array( //用下劃線代替目錄層次 'TMPL_FILE_DEPR'=>'_', );
若是不想將模版存在在當前Weibo目錄下,而設置在外部:
設置外部的模版目錄./Public/Home/User/index.html
<?php return array( //設置外部的模版目錄 'VIEW_PATH'=>'./Public/', );
若是一個系統要考慮多套界面皮膚的話,要考慮到默認皮膚以及可選皮膚
設置默認主題目錄爲:./Weibo/Home/View/default/User/index.html
<?php return array( //設置默認主題目錄 'DEFAULT_THEME'=>'default', );
切換另一個主題blue
./Weibo/Home/View/blue/User/index.html
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //切換主題 $this->theme('blue')->display(); } }
二.賦值和渲染
若是要在模版中輸出變量,必須在控制器中把變量傳遞給模版。ThinkPHP提供了assign方法對模版變量賦值,不管何種變量類型都統一使用assign賦值。
/Weibo/Home/View/User/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我是:{$user} </body> </html>
在User控制器UserController.class.php加上模版傳遞變量
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個變量 $this->assign('user', '蠟筆小新'); //渲染模版輸出 $this->display(); } }
輸出結果:我是蠟筆小新
注意:這個方法必須在display()方法以前使用,保存變量正確傳遞
渲染模版輸出使用的是display方法,有三個可選參數:
display([模版文件][,字符編碼][,輸出類型]);
若是不傳遞任何參數,它會按照默認的目錄定位模版的位置:
當前模塊/默認視圖目錄/當前控制器/當前操做.html
在User控制器UserController.class.php修改
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //修改默認模版:./Weibo/Home/View/default/User/add.tpl $this->display('add'); //修改默認模版,目錄加模版:./Weibo/Home/View/default/Bbb/add.tpl $this->display('Bbb/add'); //修改默認模版,模塊加目錄加模版:./Weibo/Admin/View/default/Bbb/add.tpl $this->display('Admin@Bbb/add'); //修改默認模版,主題加目錄加模版:./Weibo/Home/View/blue/Bbb/add.tpl $this->theme('blue')->display('Bbb/add'); //修改默認模版,自定義模版(Template和Weibo同級):./Template/Public/add.tpl $this->display('./Template/Public/add.tpl'); } }
三.模版地址
ThinkPHP封裝了一個T函數,專門用於生成模版文件。格式以下:
T([資源://][模塊@][主題/][控制器/]操做,[視圖分層]);
在User控制器UserController.class.php添加打印當前模版地址
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //輸出當前模版地址 echo T(); } }
當前模版地址:./Weibo/Home/View/User/index.html
定義方法來自定義模版:
在User控制器UserController.class.php修改
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //./Weibo/Home/View/Public/add.html echo T('Public/add'); //./Weibo/Admin/View/User/index.html echo T('Admin@index'); //./Weibo/Admin/Template/Public/add.html echo T('Admin@Public/add', 'Template'); } }
直接使用T函數輸出index裏的內容
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //直接使用T函數輸出 $this->display(T()); } }
四.獲取內容
若是須要獲取模版的內容,可使用fetch()方法,這個方法的使用和display()方法一致。
經過$content獲取模版裏的內容再用show渲染出來
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //獲取模版裏的內容 $content = $this->fetch(); //var_dump($content); //輸出模版裏的內容 //經過內容再渲染輸出 $this->show($content); } }
注意:使用fetch()方法獲取內容,主要是爲了能夠處理和過濾更加複雜的內容。而後處理後再由show()方法輸出(保證出來的信息是安全穩定性的)。
ThinkPHP--視圖--模版基礎
ThinkPHP模版,模版是將視圖裏要展示出來的數據進行解析編譯的這麼一個功能的東西,ThinkPHP內置了一個基於XML的性能卓越的模版引擎ThinkTemplate,使用了動態編譯和緩存技術,支持自定義標籤庫。
一.變量輸出
在模版中輸出變量是很是容易的,使用assign()方法,以鍵值對的方式傳遞變量和值。
1.以鍵值對方式傳遞變量和值:/Weibo/Home/View/User/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我是:{$user} <--!模版編譯後的結果是:--> <?php echo ($user); ?> //能夠在Runtime能夠查看 </body> </html>
在User控制器UserController.class.php加上模版傳遞變量
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個變量 $user = '蠟筆小新'; //控制器裏的變量提交給下面的user $this->assign('user', $user); //這個user是模版裏傳遞過去的變量 //渲染模版輸出 $this->display(); } }
2.模版標籤{和$之間不能用任何空格,不然沒法解析。若是你想更換兩個{}能夠設置:
把左右定界符改爲了<{}>
<?php return array( //修改默認標籤 'TMPL_L_DELIM'=>'<{', 'TMPL_R_DELIM'=>'}>', );
/Weibo/Home/View/User/index.html改爲<{$user}>才能接收到變量
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我是:<{$user}> </body> </html>
3.若是傳遞一個數組,咱們直接傳遞過去後,經過兩種方式調用:
在User控制器UserController.class.php加上數組
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個數組 $data['user'] = '蠟筆小新'; $data['email'] = 'xinxin@163.com'; $this->assign('data', $data); //渲染模版輸出 $this->display(); } }
/Weibo/Home/View/User/index.html倆種輸出方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 輸出方式一: User:{$data.user} Email:{$data.email} 輸出方式二: User:{$data['user']} Email:{$data['email']} </body> </html>
輸出結果:輸出方式一: User:蠟筆小新 Email:xinxin@163.com輸出方式二: User:蠟筆小新 Email:xinxin@163.com
4.若是傳遞一個對象,咱們直接傳遞過去後,經過兩種方式調用:
在User控制器UserController.class.php加上對象
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個對象 $data = new \stdClass(); //建立空對象 $data->user = '蠟筆小新'; //指向user=蠟筆小新 $data->email = 'xinxin@163.com'; $this->assign('data', $data); //渲染模版輸出 $this->display(); } }
/Weibo/Home/View/User/index.html倆種輸出方式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 輸出方式一: User:{$data->user} Email:{$data->email} 輸出方式二: User:{$data:user} Email:{$data:email} </body> </html>
輸出結果:輸出方式一: User:蠟筆小新 Email:xinxin@163.com輸出方式二: User:蠟筆小新 Email:xinxin@163.com
二.系統變量
在模版中,不但能夠輸出PHP的系統變量,還能夠輸出ThinkPHP的系統變量。
1.輸出PHP系統變量:/Weibo/Home/View/User/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$Think.server.script_name} 編譯後:$_SERVER['SCRIPT_NAME']<br> {$Think.session.admin} 編譯後:$_SESSION['admin']<br> {$Think.get.user} 編譯後:$_GET['user']<br> {$Think.post.user} 編譯後:$_POST['user']<br> {$Think.request.user} 編譯後:$_REQUEST['user']<br> {$Think.cookie.name} 編譯後:$_COOKIE['name']<br> </body> </html>
2.輸出ThinkPHP的系統變量:/Weibo/Home/View/User/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$Think.const.APP_PATH} <!--主目錄地址:./Weibo/--><br> {$Think.config.url_model} <!--URL模式:默認是1--><br> {$Think.lang.var_error} <!--語言變量:VAR_ERROR--><br> </body> </html>
三.使用函數
若是有時,咱們須要在模版中使用PHP函數的話,能夠按照下面的格式使用:
在User控制器UserController.class.php傳遞變量
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個變量 $user = '蠟筆小新'; //控制器裏的變量提交給下面的user $this->assign('user', $user); //這個user是模版裏傳遞過去的變量 //渲染模版輸出 $this->display(); } }
1./Weibo/Home/View/User/index.html接收全部變量後加上md5值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$user|md5} </body> </html>
2./Weibo/Home/View/User/index.html接收變量前三位
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$user|mb_substr=0,3,'UTF-8'} </body> </html>
打印結果:蠟筆小
3./Weibo/Home/View/User/index.html接收變量前三位後加上md5值
多個函數用"|"隔開便可
方式一:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$user|mb_substr=0,3,'UTF-8'|md5|sha1} </body> </html>
打印結果:6bcbe978003331b82ad38ac828d2cfcd5cabfcaa
若是你以爲以上寫法須要在腦海裏二次翻譯,太過於麻煩,那麼能夠用如下的格式寫法:
方式二:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {:md5(mb_substr($user,0,3,'UTF-8'))} </body> </html>
打印結果:6bcbe978003331b82ad38ac828d2cfcd5cabfcaa
4.substr前面輸出變量,在後面定義,則不須要###
若是有多個參數要傳遞,能夠參考以下設置:
User控制器UserController.class.php傳遞變量時間戳
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個變量 $this->assign('date',time()); //傳遞變量是個時間戳 //渲染模版輸出 $this->display(); } }
/Weibo/Home/View/User/index.html經過三個###把$date這個變量放到全部參數的後面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$date|date="Y-m-d H:i:s",###} </body> </html>
打印結果:2018-04-15 12:07:59
注意:表示date函數傳入兩個參數,每一個參數用逗號分割,這裏第一個參數是Y-m-d H:i:s,第二個參數是前面要輸出的date變量,由於該變量是第二個參數,所以須要用###標識變量位置,編譯後的結果是:
<?php echo (date($date,"Y-m-d H:i:s")); ?>
5.當傳遞過來的變量若是沒有值的時候,模版提供了默認值輸出功能。
/Weibo/Home/View/User/index.html當接收過來沒數據能夠提供默認輸出
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$user|default='什麼都沒有!'} </body> </html>
6.能夠在模版中使用運算符,包括對「+」、「-」、「*」、「/」、「%」、「--」和「++」的支持。
User控制器UserController.class.php傳遞變量num=10
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { $this->assign('num',10); //傳遞num=10 //渲染模版輸出 $this->display(); } }
/Weibo/Home/View/User/index.html接收變量後加10
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$num+10} </body> </html>
打印結果:20
模版還支持三元運算符:
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { public function index() { //給模版傳遞一個變量 $user = '蠟筆小新'; //控制器裏的變量提交給下面的user $this->assign('user', $user); //這個user是模版裏傳遞過去的變量 //渲染模版輸出 $this->display(); } }
/Weibo/Home/View/User/index.html接收變量後判斷有值無值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {$user ? '有值' : '無值'} </body> </html>
打印:有值
7.包含文件
在一個系統中,能夠包含通用的頭文件和腳文件:header和footer。因爲每一個頁面的頭腳都是相同的,因此須要獨立分離出來,再用包含文件引入他們。
咱們能夠在View目錄下default主題目錄下建立一個public目錄,這個目錄專門存放公共調用模版文件。
頭區域目錄:/Weibo/Home/View/default/Public/header.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id=""header>這裏是頭文件</div> </body> </html>
尾區域目錄:Weibo/Home/View/default/Public//footer.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id=""footer>這裏是腳文件</div> </body> </html>
包含文件引入頭尾文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <include file='./Weibo/Home/View/default/Public/header.html' /> 我是內容 <include file='./Weibo/Home/View/default/Public//footer.html' /> </body> </html>
最後打印結果:
這裏是頭文件
我是內容
這裏是腳文件
六.模版註釋
模版支持註釋功能,提供個模版製做人員參考。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {//單行註釋} {/* 多行註釋 */} </body> </html>
第一步:建立頭文件和尾文件
(1)建立頭文件:/Weibo/Home/View/default/Public/header.html
<div id=""header>這裏是頭文件</div>
(2)建立腳文件:/Weibo/Home/View/default/Public/footer.html
<div id=""footer>這裏是尾文件</div>
第二步:建立Public下base.tpl模版基頁
(1)base.tpl模版基頁須要引入頭文件和尾文件
(2)設置不一樣頁面的標題內容<title><block name="title">標題</block></title>
(3)設置不通頁面的主要內容<block name="main">主要內容</block>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title><block name="title">標題</block></title> </head> <body> <include file='./Weibo/Home/View/default/Public/header.html' /> <block name="main">主要內容</block> <include file='./Weibo/Home/View/default/Public/footer.html' /> </body> </html>
第三步:主頁面index.html和分頁面select.html 頁面分別引入base.tpl模版基頁
(1)主頁面index.html
<extend name="./Weibo/Home/View/default/Public/base.html" /> <block name="title">index的標題</block> <block name="main"> 這裏作頁面的佈局設計 </block>
輸出結果:
這裏是頭文件
這裏作頁面的佈局設計
這裏是腳文件
源代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index的標題</title>
</head>
<body>
<div id=""header>這裏是頭文件</div>
這裏作頁面的佈局設計
<div id=""footer>這裏是腳文件</div>
</body>
</html>
(2)分頁面select.html
<extend name="./Weibo/Home/View/default/Public/base.html" /> <block name="title">select的標題</block> <block name="main"> 這裏作頁面的佈局設計 </block>
輸出結果:
這裏是頭文件
這裏作頁面的佈局設計
這裏是腳文件
源代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>select的標題</title>
</head>
<body>
<div id=""header>這裏是頭文件</div>
這裏作頁面的佈局設計
<div id=""footer>這裏是腳文件</div>
</body>
</html>
八.模版佈局
ThinkPHP的模版引擎內置了佈局模版功能支持,能夠方便實現模版佈局以及佈局嵌套功能。有三種佈局方式:
1.全局配置方式
第一步:配置文件須要添加:Weibo/Common/Conf/config.cfg
<?php return array( //設置默認主題 'DEFAULT_THEME' => 'default', //開啓模版佈局功能,並指定基礎頁 'LAYOUT_ON'=>true, 'LAYOUT_NAME'=>'Public/layout', //layout.html文件 );
第二步:/Weibo/Home/View/default/Public/layout.html
(1)基礎頁引入頭尾文件
(2)基礎頁,{__CONTENT__}將被子頁面的內容替換
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>標題</title> </head> <body> <include file='./Weibo/Home/View/default/Public/header.html' /> {__CONTENT__} <include file='./Weibo/Home/View/default/Public//footer.html' /> </body> </html>
第三步:/Weibo/Home/View/default/User/index.html添加內容部分
最後打印結果:
這裏是頭文件
內容部分
這裏是腳文件
自模版能夠設置不載入模版頁/Weibo/Home/View/default/User/index.html
子模版不須要載入模版基頁,能夠在開頭加上{__NOLAYOUT__}
{__NOLAYOUT__}
內容部分
打印結果:
內容部分
2.模版標籤方式
標籤方式,並不須要在系統作任何配置,和模版繼承相似,直接引入便可。
/Weibo/Home/View/default/User/index.html直接繼承
<layout name="Public/layout" /> 內容部分
3.layout控制佈局
這個方法是在控制器裏操做的。
User控制器UserController.class.php設置指定基頁
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { layout('Public/layout'); //layout(false); //關閉 $this->display(); } }
Weibo/Home/View/default/User/index.html添加內容部分
最後打印結果:
這裏是頭文件
內容部分
這裏是腳文件
九.模版替換
在模版渲染以前,系統還會對讀取的模版內容進行一些特殊字符串替換操做,也就實現了模版輸出的替換和過濾。
__ROOT__: 會替換成當前網站的地址(不含域名)
__APP__: 會替換成當前應用的URL地址 (不含域名)
__MODULE__:會替換成當前模塊的URL地址 (不含域名)
__CONTROLLER__(或者__URL__ 兼容考慮): 會替換成當前控制器的URL地址(不含域名)
__ACTION__:會替換成當前操做的URL地址 (不含域名)
__SELF__: 會替換成當前的頁面URL
__PUBLIC__:會被替換成當前網站的公共目錄 一般是/Public/
Weibo/Home/View/default/User/index.html添加:
__ROOT__<br> __APP__<br> __MODULE__<br> __CONTROLLER__<br> __ACTION_<br> __SELF__L<br> __PUBLIC__<br>
打印結果:
/ThinkPHP
/ThinkPHP/index.php
/ThinkPHP/index.php/Home
/ThinkPHP/index.php/Home/User
__ACTION_
/ThinkPHP/Home/User/indexL
/ThinkPHP/Public
也能夠更改默認的/Public和上傳路徑規則
配置文件:Weibo/Common/Conf/config.cfg
<?php return array( //設置默認主題 'DEFAULT_THEME' => 'default', 'TMPL_PARSE_STRING' =>array( '__PUBLIC__' => '/Common', //更改默認的/Public替換規則 '__UPLOAD__' => '/Uploads', //增長新的上傳路徑替換規則 ) );
ThinkPHP--視圖--內置標籤
ThinkPHP模版中的內置標籤,所謂內置標籤就是模版引擎提供的一組能夠完成控制、循環和判斷功能的相似HTML語法的標籤。
一.判斷比較
ThinkPHP內置了IF標籤用於在模版中進行條件判斷
User控制器UserController.class.php設置變量
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //給模版傳遞一個變量 $user = '蠟筆小新'; $this->assign('user', $user); //渲染模版輸出 $this->display(); } }
Weibo/Home/View/default/User/index.html模版中進行條件判斷:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <if condition="$user eq '蠟筆小新'"> 小新 <elseif condition="$user eq '黑崎一護'" /> 一護 <else /> 錯誤 </if> </body> </html>
判斷結果:小新
注意:condition屬性中支持eq等判斷表達式,因爲會致使模版解析混淆,因此不支持「>」、「<」等表達式。
1.condition條件裏可使用PHP函數:Weibo/Home/View/default/User/index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <if condition="mb_substr($user,0,3,'UTF-8') eq '蠟筆小'">小新</if> </body> </html>
判斷結果:小新
2.condition條件裏使用點語法,智能判斷數組或對象:Weibo/Home/View/default/User/index.html
<body> <if condition="$data.user eq '蠟筆小新'">小新</if> </body>
3.condition條條件裏使用冒號語法,直接使用對象:Weibo/Home/View/default/User/index.html
<body> <if condition="$data:user eq '蠟筆小新'">小新</if> </body>
4.condition條件裏使用系統變量:Weibo/Home/View/default/User/index.html
<body> <if condition="$Think.get.user eq '蠟筆小新'">小新</if> </body>
經過GET獲取訪問:http://localhost/ThinkPHP/Home/User/?user=蠟筆小新
判斷結果:小新
注意:因爲if標籤的condition屬性裏面基本上使用的是php語法,儘量使用判斷標籤和Switch標籤會更加簡潔,原則上來講,可以用switch和比較標籤解決的儘可能不用if標籤完成。由於switch和比較標籤可使用變量調節器和系統變量。若是某些特殊的要求下面,IF標籤仍然沒法知足要求的話,可使用原生php代碼或者PHP標籤來直接書寫代碼。
ThinkPHP內置了Switch標籤用於多條件判斷
name的值和IF語句同樣,能夠是變量、數組、對象、函數或系統變量
<body> <switch name="$user"> <case value="蠟筆小新">小新</case> <case value="黑崎一護">一護</case> <default />錯誤 </switch> </body>
默認狀況下,case會自動添加break語句防止穿透,若是你就是想要穿透,那麼能夠去除break。固然,絕大部分不須要設置break。
//去除break
<case value="蠟筆小新" break="0">小新</case>
ThinkPHP提供了一組比較標籤用於簡單的變量比較,複雜的判斷條件能夠用IF標籤替換。
(1)eq或equal標籤:等於
<body> <eq name="user" value="蠟筆小新">小新</eq> </body>
(2)neq或notequal標籤:不等於
(3)gt標籤:大於
(4)egt標籤:大於等於
(5)lt標籤:小於
(6)elt標籤:小於等於
(7)heq標籤:恆等於
(8)nheq標籤:不恆等於
注意:name的值和IF語句同樣,能夠是變量、數組、對象、函數或系統變量,其餘比較標籤使用方法相似,這裏不在贅述。比較標籤還提供了一個統一標籤compare,比較類型經過type屬性完成。
(9)compare統一方法
<body> <compare name="user" value="蠟筆小新" type="eq">小新</compare> </body>
ThinkPHP提供了一組範圍判斷標籤:in、notin、between、notbetween四個標籤,都用於判斷變量是否在某個範圍中。
User控制器UserController.class.php設置id=1
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { $this->assign('id',1); //渲染模版輸出 $this->display(); } } 1.in標籤:
Weibo/Home/View/default/User/index.html判斷若是id是1,2,3
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <in name="id" value="1,2,3">id在範圍內</in> </body> </html>
返回:id在範圍內
in標籤,支持else寫法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <in name="id" value="1,2,3"> id在範圍內 <else/> id不在範圍內 </in> </body> </html>
返回:id在範圍內
2.notin標籤,正好相反:判斷若是id是否是1
Weibo/Home/View/default/User/index.html判斷
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <notin name="id" value="4,5,6">id不在範圍內</notin> </body> </html>
返回:id不在範圍內
3.between標籤,從哪裏到哪裏的範圍:判斷若是id是1-10之間
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <between name="id" value="1,10">id在範圍內</between> </body> </html>
返回:id在範圍內
4.notbetween標籤,從哪裏到哪裏的範圍:判斷若是id是2-20之間
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <notbetween name="id" value="2,20">id不在範圍內</notbetween> </body> </html>
返回:id不在範圍內
5.range標籤,能夠統一in、notin、between和notbetween:經過type=選擇
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <range name="id" value="1,2,3" type="in">id在範圍內</range> </body> </html>
返回:id在範圍內
6.name值能夠是系統變量
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <in name="Think.get.id" value="1,2,3">id在範圍內</in> </body> </html>
經過get.id方式訪問:http://localhost/ThinkPHP/Home/User/?id=1
返回:id在範圍內
7.value值能夠是變量或系統變量
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <in name="id" value="$Think.get.arr">id在範圍內</in> </body> </html>
能夠經過數組方式傳值訪問:http://localhost/ThinkPHP/Home/User/?arr=1,2,3
返回:id在範圍內
ThinkPHP模版提供了一組用於判斷變量的標籤。
1.判斷變量user已存在
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <present name="user">user已存在</present> </body> </html>
返回:user已存在
2.判斷變量是否已賦值,沒有建立或賦值爲null,都算沒有值
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <notpresent name="user">user尚未值</notpresent> </body> </html>
3.判斷變量是否已賦值,組合
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <present name="user"> user已存在 <else /> user未存在 </present> </body> </html>
返回:user已存在
4.判斷變量是否已賦值,系統變量
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <present name="Think.get.user">$_GET['user']已賦值</present> </body> </html>
經過系統變量賦值傳:http://localhost/ThinkPHP/Home/User/?user=蠟筆小新
返回:$_GET['user']已賦值
5.判斷變量是否爲空,空則輸出
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <empty name="user">user爲空值</empty> </body> </html>
6.判斷變量是否爲空,不空則輸出
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <notempty name="user">user不爲空值</notempty> </body> </html>
返回:user不爲空值
7.判斷變量是否爲空,組合
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <empty name="user"> user爲空值 <else /> user不爲空值 </empty> </body> </html>
返回:user不爲空值
8.判斷變量是否爲空,系統變量
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <empty name="Think.get.user">$_GET['user']爲空值</empty> </body> </html>
經過系統變量賦值傳:http://localhost/ThinkPHP/Home/User/?user=蠟筆小新
返回:$_GET['user']爲空值
9.判斷常量是否認義,定義了輸出
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <defined name="APP_PATH">APP_PATH常量已定義</defined> </body> </html>
返回:APP_PATH常量已定義
10.判斷常量是否認義,沒定義輸出
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <notdefined name="APP_PATH">APP_PATH常量未定義</notdefined> </body> </html>
11.判斷常量是否認義,組合
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <defined name="APP_PATH"> APP_PATH常量已定義 <else /> APP_PATH常量未定義 </defined> </body> </html>
返回:APP_PATH常量已定義
二.遍歷循環
ThinkPHP內置標籤提供了Volist標籤、Foreach標籤和For標籤。
User控制器UserController.class.php設置顯示全部數據
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //給模版傳一個數據庫數據 $user = M('User'); $this->assign('data', $user->select()); $this->display(); } }
1.Volist標籤:一般用於查詢數據集的結果輸出,經過select()方法返回的是一個二維數組,能夠直接使用volist標籤進行輸出
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <ul> <volist name="data" id="arr"> <!--name是獲取到控制器傳過來的數組變量data,拿到後交給變量arr--> <li>{$arr.id} -- {$arr.user} -- {$arr.mail}</li> <!--顯示id,user,mail--> </volist> </ul> </body> </html>
注意:這裏的name="data"中的data是控制器給模版定義的數據變量,要對應;這裏的id="arr"中的arr是將要遍歷循環的數組名,能夠自定義。
offset從第幾條開始,起始值0,length共多少條
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <ul> <volist name="data" id="arr" offset="5" length="10"> <!--從6條開始顯示10條--> <li>{$arr.id} -- {$arr.user} -- {$arr.mail}</li> </volist> </ul> </body> </html>
經過key輸出排序
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <volist name="data" id="arr" key="k"> <li>{$k} -- {$arr.id} -- {$arr.user} -- {$arr.mail}</li> </volist> </body> </html>
mod求當前餘數,當前index除以2餘1,輸出偶數
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <volist name="data" id="arr" key="k" mod="2"> <!--mod=2每次除以2--> <eq name="mod" value="1"> <!--餘數1的時候--> <li>{$k}.{$arr.id} -- {$arr.user} -- {$arr.mail}</li> </eq> </volist> </body> </html>
沒有指定k,也能夠用i變量輸出
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <volist name="data" id="vo" empty="沒有任何數據"> <li>{$i} -- {$vo.id} -- {$vo.user} -- {$vo.mail}</li> </volist> </body> </html>
key變量,能夠直接輸出索引值,從0開始
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <volist name="data" id="vo" empty="沒有任何數據"> <li>{$key} -- {$vo.id} -- {$vo.user} -- {$vo.mail}</li> </volist> </body> </html>
沒有數據的狀況下使用empty填充
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <volist name="data" id="vo" empty="沒有任何數據"> <li>{$vo.id} -- {$vo.user} -- {$vo.mail}</li> </volist> </body> </html>
輸出:沒有任何數據
方式二:empty="設置變量"
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { $this->assign('empty','<strong style="color:red">沒有數據</strong>'); $this->display(); } }
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <volist name="data" id="vo" empty="$empty"> <li>{$vo.id} -- {$vo.user} -- {$vo.mail}</li> </volist> </body> </html>
輸出加紅加粗:沒有任何數據
2.Foreach標籤和Volist標籤相似,只不過Foreach標籤更加簡單,沒有額外屬性。
只支持key屬性,但{$key}變量支持
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <ul> <foreach name="data" item="vo"> <ul>{$vo.id} -- {$vo.user}</ul> </foreach> </ul> </body> </html>
3.For標籤就是簡單的循環標籤。
從1到99循環
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <for start="1" end="100"> {$i}<br /> </for> </body> </html>
除了start和end必須值,還有三個可選值。comparison是大於仍是小於,默認值爲lt(<);name是循環變量名,默認值爲i;step是步進值,默認爲1。
完整形式
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <for start="1" end="100" comparison="lt" step="2" name="k"> {$i}<br /> </for> </body> </html>
三.其餘標籤
ThinkPHP模版中還有一些其餘標籤。
在模版中定義變量,value值能夠爲變量($user)或系統變量($Think.get.user)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <assign name="var" value="123" /> {$var} </body> </html>
輸出:123
在模版中定義常量,value值能夠爲變量($user)或系統變量($Think.get.user)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <define name="MY_NAME" value="xixi" /> {$Think.const.MY_NAME} </body> </html>
輸出:xixi
import導入標籤能夠智能的導入js和css文件
ThinkPHP\Public\css\index.css作一個背景爲灰色
body { background:#ccc; }
ThinkPHP\Public\css\index.js作一個彈出框
alert('js');
1.常規引入方法
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> <script type="text/javascript" src="__PUBLIC__/js/index.js"></script> <link rel="stylesheet" type="text/css" href="__PUBLIC__/css/index.css" /> </head> <body> </body> </html>
2.使用import導入,js和css是目錄
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> <import type="js" file="js.index" /> <import type="css" file="css.index" /> </head> <body> </body> </html>
3.使用import導入,basepath修改默認路徑爲./Common
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> <import type="js" file="js.index" basepath="./Common" /> </head> <body> </body> </html>
4.load加載標籤能夠智能的加載js和css文件
使用load加載
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> <load href="__PUBLIC__/js/index.js" /> <load href="__PUBLIC__/css/index.css" /> </head> <body> </body> </html>
系統還提供了專用js和css標籤,專門用於加載(推薦使用)
使用專用標籤
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> <js href="__PUBLIC__/js/index.js" /> <css href="__PUBLIC__/css/index.css" /> </head> <body> </body> </html>
PHP代碼能夠和標籤在模版文件中混合使用,能夠在模版文件裏面書寫任意的PHP語句代碼。
(1)使用php標籤作加法(推薦用)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <php> $a = 1; $b = 2; echo $a + $b; </php> </body> </html>
(2)用php語法作加法(不推薦用危險)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <?php $a = 1; $b = 2; echo $a + $b; ?> </body> </html>
若是想原樣輸出標籤極其內容,可使用literal標籤
原樣輸出:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <literal> <php>echo 123;</php> </literal> </body> </html>
注意:什麼都沒有定義的狀況下,會自動報錯,錯誤信息提示以下
模板不存在:./Weibo/Home/View/User/index.html
ThinkPHP--視圖--標籤庫
ThinkPHP模版中的標籤庫,咱們使用的不少內置標籤就是經過標籤庫聲明而來的,固然還能夠自定義擴展標籤。
一.內置標籤
模版中的這些內置標籤是從哪裏構建出來的呢?它們是在Think/Library/Think/Template/TagLib下。在完整版中提供了兩個類文件:Cx.class.php(內置標籤核心類)、Html.class.php(html擴展標籤)。
觀察Cx.class.php源碼,咱們發現其實就是內置標籤的核心類。好比:
/** * volist標籤解析 循環輸出數據集 * 格式: * <volist name="userList" id="user" empty="" > * {user.username} * {user.email} * </volist> * @access public * @param array $tag 標籤屬性 * @param string $content 標籤內容 * @return string|void */ public function _volist($tag,$content) { //核心代碼省略 }
在ThinkPHP中,Cx.class.php是自動加載的,因此並不須要各類配置或引入而能夠直接編寫標籤代碼便可運行。但若是是Html.class.php這種擴展性標籤庫,則須要經過其餘方式才能夠運行:
/** * select標籤解析 * 格式: <html:select options="name" selected="value" /> * @access public * @param array $tag 標籤屬性 * @return string|void */ public function _select($tag) { //核心代碼省略 }
若是要使用Html.class.php的擴展標籤,那麼首先要導入這個標籤
在使用標籤的時候,前面須要加上html:,表示這個是html標籤庫
<taglib name="html" /> <!--導入擴展標籤--> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <html:imageBtn value="按鈕"/> <!--在使用標籤的時候,前面須要加上html:,表示這個是html標籤庫--> </body> </html>
源代碼:<div class="" ><input type="button" id="" name="" value="按鈕" onclick="" class="button"></div>
注意:Cx.class.php由於是內置標籤,因此不須要加Cx:,但Html.class.php則須要加上html:,不然會沒法解析標籤。
方式一:能夠將Cx和Html都設置爲內置標籤寫在配置文件config.php裏
<?php return array( //將Cx和Html都設置爲內置標籤 'TAGLIB_BUILD_IN' =>'cx,html', );
設置成內置標籤後則不須要html:了也不須要導入擴展標籤
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <imageBtn value="按鈕"/> </body> </html>
注意:設置內置標籤有必定的危險性,由於可能會出現標籤的重複致使衝突。
若是沒有設置爲內置標籤的話,那麼都須要經過tablib進行導入,咱們能夠設置標籤預加載。這樣,就不須要每次都進行導入操做了。
方式二:將Html標籤預加載寫在配置文件config.php裏
<?php return array( //標籤預加載 'TAGLIB_PRE_LOAD'=>'html', );
設置標籤預加載不須要導入擴展標籤
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <html:imageBtn value="按鈕"/> </body> </html>
二.自定義擴展標籤庫
有時感受內置的標籤不能知足項目日益繁雜的項目需求,這是可能想本身擴展一些標籤來使用,那麼本身怎麼擴展標籤呢?
第一步:在Think/Library/Think/Template/TagLib下建立一個Test.class.php
<?php namespace Think\Template\TagLib; use Think\Template\TagLib; defined('THINK_PATH') or exit(); /** * Test測試標籤庫驅動 */ class Test extends TagLib{ //標籤庫定義Test protected $tags = array( //屬性定義 //mytest雙標籤調用<test:mytest></test:mytest> 'mytest'=>array('attr'=>'color,border','close'=>1) //標籤訂義: attr屬性列表定義倆個屬性color顏色,border邊框,close是否閉合(0或者1,默認1) ); public function _mytest($tag,$content){ //mytest方法傳倆個參數 //print_r($tag); //獲得的是倆個屬性和他的值:Array ( [color] => red [border] => 5 ) //print_r($content); //獲得的是雙標籤裏面的內容 $color = ''; $border = ''; if (isset($tag['color'])) { //若是$tag['color']存在 $color = 'color:'.$tag['color']; //顏色根據傳的值變化 } if (isset($tag['border'])) { //若是$tag['border']存在 $border = 'border:'.$tag['border'].'px solid #ccc'; //邊框根據傳的值變化 } $css = $color.';'.$border; //聲明一個變量$css return '<div style="'.$css.'">'.$content.'</div>'; //把獲得的倆個屬性的值返回 } }
導入test自定義擴展標籤使用自定義擴展標籤倆個屬性color和border
<taglib name="test" /> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <test:mytest color="red" border="5">測試標籤</test:mytest> <!--根據標籤訂義的倆個屬性傳值--> </body> </html>
源代碼:<div style="color:red;border:5px solid #ccc">測試標籤</div>
ThinkPHP/Weibo/Home/
ThinkPHP--視圖--路由功能
ThinkPHP的路由功能。就是配置URL,讓URL更加的簡潔和優雅。路由模式只對PATHINFO模式和兼容模式起做用。
一.路由定義
在使用路由功能以前,咱們須要啓用路由。啓用路由前提是你的URL支持PATHINFO模式或者兼容模式,而ThinkPHP默認的就是PATHINF模式。只要配置以下啓用:
建立:ThinkPHP\Weibo\Home\View\default\User\index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> 這是User控制器下的index方法:{$Think.get.id} {$Think.get.type} {$Think.get.attr} {$Think.get.list} </body> </html>
當前訪問URL:http://localhost/ThinkPHP/Home/User/index/id/5
輸出:這是User控制器下的index方法:5
經過設置默認模塊去除Home
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 );
去除默認模塊Home訪問URL:http://localhost/ThinkPHP/User/index/id/5
輸出:這是User控制器下的index方法:5
路由規則定義的格式爲:'路由表達式'=>'路由地址和參數',路由表達式包括規則路由和正則路由兩種
二.規則路由
規則路由是ThinkPHP設計的一種簡單實用的路由規則
經過規則路由的靜態地址路由能夠把u替換成User/index
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', //默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //每條鍵值對,對應一個路由規則 'u'=>'User/index', //把u替換成User/index ), );
訪問URL:http://localhost/ThinkPHP/u/id/5
輸出:這是User控制器下的index方法:5
經過靜態地址和動態地址結合路由去掉id
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //靜態地址和動態地址結合路由 'u/:id'=>'User/index', ), );
訪問URL:http://localhost/ThinkPHP/u/5
輸出:這是User控制器下的index方法:5
經過靜態地址和動態地址結合路由傳多個動態地址type/:attr/:list
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //靜態地址和動態地址結合路由 'u/:type/:attr/:list'=>'User/index', ), );
訪問URL:http://localhost/ThinkPHP/u/5/6/7
這是User控制器下的index方法: 5 6 7
經過數字約束傳過來的id只能是數字(不傳數字參數會報錯)
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //數字約束 'u/:id\d'=>'User/index', ), );
經過給傳過來的動態ID加md5
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //支持函數 'u/:id\d|md5'=>'User/index', ), );
訪問URL:http://localhost/ThinkPHP/u/1
這是User控制器下的index方法:c4ca4238a0b923820dcc509a6f75849b
經過設置可選參數不加動態ID不會報錯(這是User控制器下的index方法: )
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //可選傳參 'u/[:id\d]'=>'User/index', ), );
訪問URL:http://localhost/ThinkPHP/u/
這是User控制器下的index方法:
經過設置動態ID後不能夠加東西
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //$表示後面不容許再有東西 'u/:id$'=>'User/index', ), );
訪問URL:http://localhost/ThinkPHP/u/5/abc會報錯
訪問URL:http://localhost/ThinkPHP/u/5返回
這是User控制器下的index方法:5
三.正則路由
正則路由也就是採用正則表達式定義路由的一種方式,不少複雜的路由設置沒法經過規則路由設置,則可使用正則路由
經過正則設置動態id必須是倆位
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //正則路由 '/^u\/(\d{2})$/'=>'User/index?id=:1', //把u匹配到靜態地址index,限制ID是倆位,:1表示對應第一個正則圓括號 ), );
訪問URL:http://localhost/ThinkPHP/u/11返回
這是User控制器下的index方法:11
正則路由給獲取到的動態id加密md5
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //正則路由也支持函數 '/^u\/(\d{2})$/'=>'User/index?id=:1|md5', ), );
訪問URL:http://localhost/ThinkPHP/u/11返回
這是User控制器下的index方法:6512bd43d9caa6e02c990b0a82652dca
四.靜態路由
靜態路由其實就是規則路由的簡化版(又稱URL映射),它就是撇除了動態路由的功能。
經過配置靜態路由只支持靜態
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置靜態路由 'URL_MAP_RULES'=>array( 'u/i'=>'User/index', ), );
訪問UIR:http://localhost/ThinkPHP/u/i/返回
這是User控制器下的index方法:
注意:因爲性能問題,ThinkPHP把MAP替換爲ROUTER,專門處理靜態路由。
五.閉包支持(用於調試)
有時,咱們並不是須要執行控制器的操做方法。能夠用閉包定義一些特殊的需求的路由。
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則和正則規則 'URL_ROUTE_RULES'=>array( //規則路由 'u/:id'=>function ($id) { //對應的只是一個function echo 'id:'.$id; //打印獲得的id }, //正則路由 '/^u\/(\d{2})$/'=>function ($id) { echo 'id:'.$id; }, ), );
訪問UIR:http://localhost/ThinkPHP/u/5返回
id:5
ThinkPHP--視圖--URL操做:
ThinkPHP的URL操做。主要涉及到URL路徑大小寫、僞靜態、生成以及模版中的U()方法。
一.URL大小寫
系統默認的規範是根據URL裏面的模塊名、控制器名來定位到具體的控制器類。
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> 這是User控制器下的index方法:{$Think.get.id} {$Think.get.type} {$Think.get.attr} {$Think.get.list} </body> </html>
訪問UIR:http://localhost/ThinkPHP/Home/User/index/id/5返回
這是User控制器下的index方法:5
在windows平臺,URL中的大小寫會自動忽略,但做爲開發人員,保持大小寫區分是一個良好的習慣。而Linux平臺,若是大小寫錯誤,會致使沒法定位到指定的模塊、控制器。
經過設置URL能夠不區分大小寫
<?php return array( //'配置項'=>'配置值' //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_ROUTE_RULES'=>array( //URL能夠不區分大小寫 'URL_CASE_INSENSITIVE' =>true ), );
訪問UIR:http://localhost/ThinkPHP/home/User/index/id/5返回
這是User控制器下的index方法:5
注意:若是開啓了不區分大小寫,那麼對於UserTypeController.class.php這樣的控制器就須要以下訪問方式:
http://localhost/ThinkPHP/home/user_type/index/
若是區分大小寫,則是這樣:
http://localhost/ThinkPHP/Home/UserType/index/
二.URL僞靜態
URL僞靜態同城是爲了知足更好的SEO效果,ThinkPHP支持僞靜態設置。
http://localhost/ThinkPHP/home/User/index.html
默認後綴爲html,設置僞靜態後綴shtml
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', //默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //設置僞靜態後綴,默認爲html 'URL_HTML_SUFFIX'=>'shtml', );
訪問UIR:http://localhost/ThinkPHP/home/User/index.shtml返回
這是User控制器下的index方法:
默認後綴爲html,設置後綴爲任意:
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', //默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 //若是設置爲空,那麼就職意後綴 'URL_HTML_SUFFIX'=>'', );
訪問URL:http://localhost/ThinkPHP/home/User/index.ddd
這是User控制器下的index方法:
若是設置爲空,能夠用__EXT__常量獲取當前使用的後綴
<body> 目前的僞靜態的後綴爲:{$Think.const.__EXT__} </body>
訪問URL:http://localhost/ThinkPHP/home/User/index.ddd
目前的僞靜態的後綴爲:ddd
設置能夠僞靜態的後綴只能是html|shtml|xml
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 //設置能夠僞靜態的後綴 'URL_HTML_SUFFIX'=>'html|shtml|xml', );
訪問URL:http://localhost/ThinkPHP/home/User/index.xml訪問
這是User控制器下的index方法:
禁止訪問後綴爲html|pdf|ico|png|gif|jpg(自己能夠訪問又禁止掉了訪問就是空頁面)
<?php return array( //'配置項'=>'配置值' //設置模塊以及默認模塊 'MODULE_ALLOW_LIST' => array('Home','Admin'), 'DEFAULT_MODULE' => 'Home', // 默認模塊,能夠省去模塊名輸入 //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 //禁止訪問的後綴 'URL_DENY_SUFFIX' => 'html|pdf|ico|png|gif|jpg', );
三.URL生成
爲了配合所使用的URL模式,咱們須要可以動態的根據當前的URL設置生成對應的URL地址。爲此,ThinkPHP內置了一個U()方法,用於URL的動態生成。
定義格式:U('地址表達式',['參數'],['僞靜態後綴'],['顯示域名'])
獲得當前URL配置:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //默認獲得當前URL echo U(); } }
獲得地址:/ThinkPHP/index.php/Home/User/index.html
地址表達式的格式以下:
[模塊/控制器/操做#錨點@域名]?參數1=值1&參數2=值2...
控制器+方法生成和當前URL無關的配置
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //控制器+方法 echo U('Member/add'); } }
獲得地址:/ThinkPHP/index.php/Home/Member/add.html
控制器+方法+?參數1個值
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //控制器+方法+?參數1=值1 echo U('Member/add?id=5'); } }
獲得地址:/ThinkPHP/index.php/Home/Member/add/id/5.html
模塊+控制器+方法+?參數1=值1
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //模塊+控制器+方法+?參數1=值1 echo U('Admin/Member/add?id=5'); } }
獲得地址:/ThinkPHP/index.php/Admin/Member/add/id/5.html
U()方法第二個參數能夠分離參數和值的操做,支持字符串和數組的寫法。
使用數組參數1=值1,參數2=值2
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //使用數組參數1=值1,參數2=值2 echo U('Member/add',array('id'=>5,'type'=>'a')); } }
獲得地址:/ThinkPHP/index.php/Home/Member/add/id/5/type/a.html
使用字符串參數1=值1,參數2=值2
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //使用字符串參數1=值1,參數2=值2 echo U('Member/add','id=5&type=a'); } }
獲得地址:/ThinkPHP/index.php/Home/Member/add/id/5/type/a.html
U()方法第三個參數能夠指定僞靜態後綴
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //指定僞靜態後綴 echo U('User/add',array('id'=>5),'xml'); } }
獲得地址:/ThinkPHP/index.php/Home/User/add/id/5.xml
四種模式的應用:
(1)普通模式後URL生成將以下
<?php return array( //'配置項'=>'配置值' //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題 'DEFAULT_THEME' => 'default', //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_MODEL'=>0 );
獲得地址:/ThinkPHP/index.php?m=Home&c=User&a=add&id=5
(2)PATHINFO模式後URL生成將以下:
<?php return array( //'配置項'=>'配置值' //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題 'DEFAULT_THEME' => 'default', //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_MODEL'=>1 );
獲得地址:/ThinkPHP/index.php/Home/User/add/id/5.xml
(3)REWRITE模式後URL生成(它是PATHINFO的升級版,地址最短)將以下:
<?php return array( //'配置項'=>'配置值' //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題 'DEFAULT_THEME' => 'default', //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_MODEL'=>2 );
獲得地址:/ThinkPHP/Home/User/add/id/5.xml
(4)兼容模式後URL生成將以下:
<?php return array( //'配置項'=>'配置值' //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題 'DEFAULT_THEME' => 'default', //啓用路由功能 'URL_ROUTER_ON'=>true, //配置路由規則 'URL_MODEL'=>3 );
獲得地址:/ThinkPHP/index.php?s=/Home/User/add/id/5.xml
也能夠生成路由地址,使用路由的規則生成的地址:
配置文件設置:
<?php return array( //'配置項'=>'配置值' //設置默認主題 'DEFAULT_THEME' => 'default', //啓用路由功能 'URL_ROUTER_ON'=>true, //規則路由 'u/:id\d'=>'Member/add', );
ThinkPHP\Weibo\Home\Controller\UserController.class.php設置
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //指定僞靜態後綴 //echo U('User/add',array('id'=>5),'xml'); //生成規則路由地址 echo U('/u/5'); } }
生成URL:/ThinkPHP/index.php/u/5.html
生成正則路由地址
配置文件設置:
<?php return array( //'配置項'=>'配置值' //設置默認主題 'DEFAULT_THEME' => 'default', //啓用路由功能 'URL_ROUTER_ON'=>true, //生成正則路由地址 '/^u_(\d+)$/'=>'User/index?id=:1', );
ThinkPHP\Weibo\Home\Controller\UserController.class.php設置
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //指定僞靜態後綴 //echo U('User/add',array('id'=>5),'xml'); //生成規則路由地址 echo U('/u_5'); } }
生成URL:/ThinkPHP/index.php/u_5.html
域名支持
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //域名支持 echo U('User/add@www.xixi.com?id=5'); } }
生成URL:http://www.xixi.com/ThinkPHP/index.php/Home/User/add/id/5.html
錨點支持
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //錨點支持 echo U('User/add#comment?id=5'); } }
生成URL:/ThinkPHP/index.php/Home/User/add/id/5.html#comment
四.模版中的U
咱們以前使用U()方法,都是在控制器裏實現的。但實際用途中,大量的超連接是在模版中設置的,而在控制器把U()當變量傳遞過去,有點過於繁雜。因此,咱們能夠在模版使用使用U()方法。
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> {:U('Member/add', array('id'=>5))} </body> </html>
生成URL:/ThinkPHP/index.php/Home/Member/add/id/5.html
ThinkPHP--視圖--控制器
一.控制器操做
咱們首先複習一下基本的控制器定義和方法執行方式。
第一步:控制器默認建立在當前模塊下的Controller目錄下;
第二步:按照指定的命名規則:控制器名(首字母大寫)+Controller.class.php;
第三步:控制器裏的方法必須是public公共的;
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function index() { //index()方法在URL訪問時能夠忽略 } }
URL訪問:http://localhost/ThinkPHP/Home/User/
有時方法名可能和關鍵字衝突,那麼定義起來就比較麻煩,控制器提供了一個配置定義:
配置文件配置:
<?php return array( //'配置項'=>'配置值' //配置控制器方法後綴 'ACTION_SUFFIX'=>'Action', );
每一個方法後面加上Action,對於URL訪問不須要加Action
<?php namespace Home\Controller; use Think\Controller; class UserController extends Controller { //引入指定基頁 public function indexAction() { //配置文件定義後 每一個方法名字後面要加上Action //index()方法在URL訪問時能夠忽略 } public function classAction() { echo 'class'; } }
默認狀況下經過URL訪問的頁面是控制器模塊下的方法,即:Controller目錄下的UserController.class.php類。它是對外公開可訪問的,咱們能夠稱爲訪問控制器。那麼不少時候,因爲項目業務的高度繁雜,咱們可能想法不少業務分離到另外的層,好比事件控制器層。那麼能夠這麼操做:
第一步:建立事件控制器目錄:ThinkPHP\Weibo\Home\Event\
第二步:建立UserEvent.class.php類;
<?php namespace Home\Event; //是否繼承控制器基類或者其餘基類,取決於你的業務 class UserEvent { public function test() { echo '當觸發測試事件,執行這個方法,這方法內部調用。'; } }
訪問控制器內部調用事件控制器方法方法一:
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //訪問控制器內部調用事件控制器方法 class UserController extends Controller { public function test() { $userEvent = new UserEvent(); $userEvent->test(); echo 'test'; } }
URL訪問:http://localhost/ThinkPHP/Home/User/test/當執行test方法自動調用了UserEvent.class.php裏的test方法
當觸發測試事件,執行這個方法,這方法內部調用。test
這裏調用別的控制器還可使用快捷調用方法A()。
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //訪問控制器內部調用事件控制器方法 class UserController extends Controller { public function test() { $userEvent = A('User', 'Event'); //User表示控制器名,Event事件層次的控制器 $userEvent->test(); echo 'test'; } }
URL訪問:http://localhost/ThinkPHP/Home/User/test/當執行test方法自動調用了UserEvent.class.php裏的test方法
當觸發測試事件,執行這個方法,這方法內部調用。test
默認狀況下,控制器只支持一級控制器。當項目較爲繁雜的時候,想建立統一模塊下多個控制器時,能夠配置二級控制器。
第一步:配置文件添加容許二級控制器;
<?php return array( //'配置項'=>'配置值' //容許二級控制器 'CONTROLLER_LEVEL'=>2, );
第二步:在Controller目錄下建立Member目錄,在Member目錄下建立一個控制器;CommentController.php
<?php //二級控制器寫法 namespace Home\Controller\Member; use Think\Controller; class CommentController extends Controller { public function test() { echo '多級控制器'; } }
只能訪問二極控制器:http://localhost/ThinkPHP/Member/Comment/test返回:
多級控制器
ThinkPHP控制器還提供了兩個特殊的方法,前置操做方法_before_index()和後置操做方法_after_index()。這兩個方法,在控制器index()方法的時候,一個在以前執行,一個在以後執行。
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //訪問控制器內部調用事件控制器方法 class UserController extends Controller { public function index() { echo 'index'; } //前置執行 public function _before_index() { echo '前置操做方法'; } //後置執行 public function _after_index() { echo '後置操做方法'; } }
訪問URL:http://localhost/ThinkPHP/Home/User/index返回
前置操做方法index後置操做方法
二.Action參數綁定
參數綁定是經過直接綁定URL地址中的變量做爲操做方法的參數,能夠簡化方法的定義甚至路由的解析。
<?php return array( //'配置項'=>'配置值' //啓用Action參數綁定,默認爲true,能夠不寫 'URL_PARAMS_BIND'=>true, );
注意:當你URL沒有傳遞參數(id/5)的時候,那麼頁面會報錯:參數錯誤或者未定義:id。固然,若是取消綁定,則不會報錯'URL_PARAMS_BIND'=>false,。可是,爲了程序的嚴謹性,通常須要不要取消參數綁定
若是你個那個參數設定一個默認值,當沒有傳遞參數的時候,會直接啓用默認值:
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //訪問控制器內部調用事件控制器方法 class UserController extends Controller { //給變量$id設置默認值 public function index($id=1) { echo 'id:'.$id; } }
訪問URL:http://localhost/ThinkPHP/Home/User/index/返回:
id:1
還有一種是按順序傳遞參數,這個方法能夠省略掉鍵值對中的鍵,也就是說id不須要傳遞,只須要傳遞5這個值便可。但必須按照多個參數的順序。
位置文件配置按順序傳參
<?php return array( //'配置項'=>'配置值' //啓用Action參數綁定,默認爲true,能夠不寫 'URL_PARAMS_BIND'=>true, //定義按順序傳參綁定 'URL_PARAMS_BIND_TYPE'=>1, );
傳遞兩個參數
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index($id, $type) { echo 'id:'.$id.',type:'.$type; } }
5對應id,a對應type訪問http://localhost/ThinkPHP/Home/User/index/5/a返回:
id:5,type:a
三.跳轉和重定向
ThinkPHP在操做數據庫時,須要跳轉和重定向頁面。ThinkPHP提供了一組方法來解決了這個問題。
成功和失敗的跳轉
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { $flag = true; //模擬新增成功 if ($flag) { //會跳轉到:http://localhost/ThinkPHP/Home/User/all $this->success('新增成功!', '../User/all'); } else { //會跳轉到本頁的上一頁 $this->error('新增失敗!'); } } }
新增成功訪問:http://localhost/ThinkPHP/Home/User/index
跳轉到:http://localhost/ThinkPHP/Home/User/all
注意:success()方法和error()方法,第一個參數是提示信息、第二個跳轉的地址、第三個跳轉時間。默認狀況下success()方法是1秒,error()方法是3秒。
設置5秒後跳轉
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { $flag = true; //模擬新增成功 if ($flag) { //會跳轉到:http://localhost/ThinkPHP/Home/User/all //設置5秒 $this->success('新增成功!', '../User/all', 5); } else { //會跳轉到本頁的上一頁 $this->error('新增失敗!'); } } }
success()方法和error()方法,跳轉的時候就對應了相應的模版,默認以下:\ThinkPHP\ThinkPHP\Tpl\dispatch_jump.tpl
//默認錯誤跳轉對應的模板文件 'TMPL_ACTION_ERROR' =>THINK_PATH .'Tpl/dispatch_jump.tpl', //默認成功跳轉對應的模板文件 'TMPL_ACTION_SUCCESS'=>THINK_PATH.'Tpl/dispatch_jump.tpl',
配置文件能夠自行修改跳轉模版位置
<?php return array( //'配置項'=>'配置值' //自定義成功和錯誤提示模版頁面 'TMPL_ACTION_SUCCESS'=>'Public/success', 'TMPL_ACTION_ERROR'=>'Public/error', );
對於自定義的提示模版,ThinkPHP提供了一組變量可供使用。
$msgTitle變量:操做標題
$message變量:頁面提示信息
$status變量:操做狀態1表示成功0表示失敗
$waitSecond變量:跳轉等待時間,單位爲秒
$jumpUrl變量:跳轉頁面地址
自定義成功模版路徑:ThinkPHP\Weibo\Home\View\default\Public\success.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{$msgTitle}</title> </head> <body> {$message} {$status} {$waitSecond} {$jumpUrl} </body> </html>
自定義失敗模版路徑:ThinkPHP\Weibo\Home\View\default\Public\error.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{$msgTitle}</title> </head> <body> {$message} {$status} {$waitSecond} {$jumpUrl} </body> </html>
注意:若是對於數據庫操做,採用了Ajax方式,那麼success()和error()會自動ajaxReturn()方法返回數據提供調用。
ThinkPHP還單獨提供了重定向方法redirect(),參數和U()方法同樣。這個方法使用的是URL規則。
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //這裏跟大U方法同樣直接傳遞規則 $this->redirect('User/all', array('id'=>5), 5, '頁面跳轉中...'); //傳參數id指向5,5秒,提示信息:頁面跳轉中 } }
訪問:http://localhost/ThinkPHP/index.php/Home/User
5秒鐘後跳轉到:http://localhost/ThinkPHP/index.php/Home/User/all/id/5.html
若是隻是想純粹的URL跳轉,不去使用URL規則,那麼直接使用redirect()函數。
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //這裏跟大U方法同樣直接傳遞規則 redirect('http://www.baidu.com', 5, '頁面跳轉中...'); //5秒鐘後跳轉到baidu } }
訪問:http://localhost/ThinkPHP/index.php/Home/User
5秒鐘後跳轉到baidu
四.輸入變量
咱們在獲取系統變量或者用戶提交的數據時,這些變量數據錯綜複雜,一不當心就容易引擎安全隱患,因此,ThinkPHP提供了輕鬆和安全獲取變量的解決方案。
常規獲取變量方式
$id = $_GET['id']; //獲取get變量
$name = $_POST['name']; //獲取post變量
$value = $_SESSION['var']; //獲取session變量
$name = $_COOKIE['name']; //獲取cookie變量
$file = $_SERVER['PHP_SELF']; //獲取server變量
在ThinkPHP中,咱們再也不建議直接使用傳統方式獲取,由於沒有統一的安全處理機制,後期調整也會比較麻煩。因此,ThinkPHP提供I()方法進行變量的獲取和過濾
I()方法的格式:I('變量類型.變量名',['默認值'],['過濾方法'])
1.獲取$_GET['id']
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //獲取$_GET['id']; echo I('get.id'); } }
訪問:http://localhost/ThinkPHP//Home/User/index?id=<b style="font-size:550px:">5</b>會自動把id裏的過濾
返回:<b style="font-size:550px:">5</b>
當ID沒有值能夠設定默認
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //$_GET['id']沒有值,則默認1 echo I('get.id', 1); } }
http://localhost/ThinkPHP//Home/User/index當沒有值默認是1
返回:1
2.過濾$_GET['id']
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //過濾$_GET['id'] echo I('get.id', '', 'md5'); } }
http://localhost/ThinkPHP//Home/User/index?id=5返回5的md5值
e4da3b7fbbce2345d7772b0674a318d5
3.獲取$_GET;
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //獲取$_GET; print_r(I('get.')); } }
http://localhost/ThinkPHP//Home/User/index?id=5&type=a返回全部值
Array ( [id] => 5 [type] => a )
ThinkPHP還提供了一個自動識別各類系統變量類型的接受方法:param。
param變量自動判斷變量類型
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //param變量自動判斷變量類型 echo I('param.id'); } }
http://localhost/ThinkPHP//Home/User/index/id/5/type/a返回Id值
5
若是是PATHINFO模式的URL,param也能夠接收。
param獲取URL全部參數
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //param獲取URL全部參數 print_r(I('param.0')); //已鍵值對獲取 } }
http://localhost/ThinkPHP//Home/User/index/id/5/type/a返回全部參數
Array ( [id] => 5 [type] => a )
注意:取消和開啓URL的'URL_PARAMS_BIND_TYPE'=>1配置定義,在訪問這個URL的時候結果有所不一樣:http://localhost/ThinkPHP//Home/User/index/id/5/type/a
關閉URL傳參順序:Array ( [id] => 5 [type] => a )
開啓URL傳參順序:Array ( [0] => id [1] => 5 [2] => type [3] => a )
param獲取指定參數值
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //param獲取指定參數值 echo I('param.id'); echo I('param.type'); } }
訪問:http://localhost/ThinkPHP//Home/User/index/id/5/type/a返回指定參數的值
5a
默認狀況下,I()的默認過濾是:htmlspecialchars,過濾掉HTML
<?php return array( //過濾HTML,若是去掉了,則傳遞包含HTML的字符串,將不過濾 'DEFAULT_FILTER'=>'htmlspecialchars', );
若是系統設置了默認的過濾,自己某個函數又不想過濾,那麼能夠這麼處理:
設置屏蔽系統默認過濾
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //設置屏蔽系統默認過濾 echo I('get.id','', false); //第三參數爲空字符串都可 } }
五.請求類型
ThinkPHP提供了一組常量來判斷當前請求是不是GET、POST等。經過判斷請求處理不一樣的業務邏輯。
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //傳遞兩個參數 class UserController extends Controller { public function index() { //判斷是否GET請求 if (IS_GET) { echo '是GET請求'; } else { echo '不是GET請求'; } } }
(1)IS_GET常量:判斷是否GET提交請求(驗證是不是表單提交的)
<meta charset="UTF-8"> <form method="get" action="http://localhost/ThinkPHP//Home/User/index"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
提交後返回:是GET請求
(2)IS_POST常量:判斷是否POST提交請求(驗證是不是表單提交的)
<meta charset="UTF-8"> <form method="post" action="http://localhost/ThinkPHP//Home/User/index"> <p>用戶:<input type="text" name="user"></p> <p>郵箱:<input type="text" name="email"></p> <input type="submit" value="提交"> </form>
提交後返回(post):不是GET請求
(3)IS_PUT常量:判斷是否PUT提交請求
(4)IS_DELTE常量:判斷是否DELETE提交請求
(5)IS_AJAX常量:判斷是否AJAX提交請求
六.空操做
空操做是指系統在找不到請求的操做方法時,會定位到空操做(_empty)方法來執行,利用這個機制,咱們能夠實現錯誤頁面和一些URL的優化。
空控制器:
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //若是沒有相關控制器則執行 class EmptyController extends Controller { public function _empty() { echo '找不到控制器:'.ACTION_NAME; } }
輸入錯的:http://localhost/ThinkPHP/Home/User/aaa返回
找不到控制器:aaa
空控方法的應用:
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; //若是沒有相關控制器則執行 class EmptyController extends Controller { public function _empty() { echo '你的名字是:'.ACTION_NAME; } }
輸入:http://localhost/ThinkPHP/Home/User/xixi返回
你的名字是:xixi
七.空控制器
所謂空控制器,就是請求不到指定控制器時,調用一個專門的空控制器。利用這個機制,咱們能夠實現錯誤頁面和一些URL的優化。
<?php namespace Home\Controller; use Think\Controller; //若是沒有相關控制器則執行 class EmptyController extends Controller { public function index() { echo '找不到控制器:'.CONTROLLER_NAME; } }
訪問:http://localhost/ThinkPHP/Home/aaa返回
找不到控制器:aaa
八.操做綁定到類
ThinkPHP提供了把每一個操做方法定位到一個類的功能,即每一個把層次分的更加細膩。
第一步:配置文件設置:
<?php return array( //設置操做綁定到類 'ACTION_BIND_CLASS'=>True, );
第二步:在Controller目錄下創建User目錄,在User目錄創建index.class.php,再創建test.class.php。
設置User模塊下的index類
<?php namespace Home\Controller\User; use Think\Controller; class index extends Controller { public function run() { echo 'User模塊下的index類'; } }
設置User模塊下的test類
<?php namespace Home\Controller\User; use Think\Controller; class test extends Controller { public function run() { echo 'User模塊下的test類'; } }
第三步瀏覽器分別訪問:
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ echo 'index'; } public function test(){ echo 'test'; } }
瀏覽器分別訪問:
訪問:http://localhost/ThinkPHP/Home/User/index返回:
User模塊下的index類
訪問:http://localhost/ThinkPHP/Home/User/test返回:
User模塊下的test類
前置方法:
<?php namespace Home\Controller\User; use Think\Controller; class index extends Controller { public function run() { echo 'User模塊下的index類'; } //前置方法 public function _before_run() { echo 'before_'.ACTION_NAME; } }
訪問:http://localhost/ThinkPHP/Home/User/index返回:
before_indexUser模塊下的index類
後置方法:
<?php namespace Home\Controller\User; use Think\Controller; class test extends Controller { public function run() { echo 'User模塊下的test類'; } //後置方法: public function _after_run() { echo 'after_'.ACTION_NAME; } }
訪問:http://localhost/ThinkPHP/Home/User/test返回:
User模塊下的test類after_test
空方法,在目錄裏創建一個_empty.class.php
<?php namespace Home\Controller\User; use Think\Controller; //空方法 class _empty extends Controller { public function run() { echo '找不到'.ACTION_NAME.'方法'; } }
訪問:http://localhost/ThinkPHP/Home/User/aaa
找不到aaa方法
空控制器,能夠建立一個目錄_empty,而後創建index.class.php
<?php //空控制器 namespace Home\Controller\_empty; use Think\Controller; class index extends Controller { public function run() { echo '找不到'.CONTROLLER_NAME.'控制器的'.ACTION_NAME.'方法'; } }
訪問:http://localhost/ThinkPHP/Home/aaa
找不到aaa控制器
ThinkPHP--視圖--Session與Cookie
ThinkPHP的Session與Cookie的處理,提供了對這兩個核心變量的完善支持。
一.Session
系統提供了Session管理和操做的完善支持,只須要經過session()函數完成,該函數能夠完成Session的設置、獲取、刪除和管理操做。
通常來講,在ThinkPHP中不須要手動初始化session,系統會自動初始化
(1)id說明:session_id值
(2)name說明:session_name值
(3)path說明:session_save_path值
(4)prefix說明:session 本地化空間前綴
(5)expire說明:session.gc_maxlifetime設置值
(6)domain說明:session.cookie_domain設置值
(7)use_cookies說明:session.use_cookies設置值
(8)use_trans_sid說明:session.use_trans_sid設置值
(9)type說明:session處理類型,支持驅動擴展
默認狀況下,初始化以後系統會自動啓動session,若是不但願系統自動啓動session的話,能夠以下設置:
<?php return array( //設置系統不啓用session 'SESSION_AUTO_START' =>false, );
1.建立並獲取session的值
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //建立session session('user', 'xixi'); //$_SESSION['user'] = 'xixi'; } public function test(){ //獲取session值 echo session('user'); //echo $_SESSION['user']; } }
建立session(保存在服務器端):http://localhost/ThinkPHP/Home/User/index
獲取session:http://localhost/ThinkPHP/Home/User/test/返回:
xixi
2.刪除session
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //session刪除 session('user', null); //unset($_SESSION['user']); } public function test(){ //刪除全部session session(null); //$_SESSION=array(); } }
session刪除:http://localhost/ThinkPHP/Home/User/index
刪除全部session:http://localhost/ThinkPHP/Home/User/test/
3.判斷session是否存在
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function test(){ //判斷session是否存在 echo session('?user'); //isset($_SESSION['user']); } }
訪問:http://localhost/ThinkPHP/Home/User/test/返回:
1
4.寫入關閉
//暫停session,寫入關閉
session('[pause]'); //session_write_close();
5.可開啓寫入
//啓動session,可開啓寫入
session('[start]'); //session_start()
6.銷燬session
//銷燬session(服務器存的文件刪除掉)
session('[destroy]'); //session_destroy();
7.從新生成session id
//從新生成session id(建立新的session的id不同了)
session('[regenerate]'); //session_regenerate_id();
注意:若是在初始化session設置的時候傳入prefix參數或者單獨設置了SESSION_PREFIX參數的話,就能夠啓用本地化session管理支持。
配置文件設置SESSION前綴:
<?php return array( //SESSION前綴 'SESSION_PREFIX'=>'think_', //文件裏的東西多了think_ );
這時處理的$_SESSION['user']將變成$_SESSION['think_']['user'],而咱們在處理上沒有任何區別。
二.Cookie
ThinkPHP內置了一個cookie函數用於支持和簡化Cookie的相關操做,該函數能夠完成Cookie的設置、獲取、刪除操做。
1.賦值cookie並取值
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function test(){ //cookie賦值 cookie('user', 'xixi'); //setcookie('user','xixi'); //cookie取值 echo cookie('user'); //echo $_COOKIE['user']; } }
訪問:http://localhost/ThinkPHP/Home/User/test/
xixi
2.cookie賦值,設置過時時間
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function test(){ //cookie賦值,設置過時時間 cookie('user', 'xixi', 3600); } }
3.cookie賦值,第三參數數組設置過時時間和前綴
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function test(){ //cookie賦值,第三參數數組設置過時時間和前綴 cookie('user', 'xixi', array('expire'=>3600,'prefix'=>'think_')); //cookie取值 echo cookie('think_user'); //echo $_COOKIE['user']; } }
http://localhost/ThinkPHP/Home/User/test/返回
xixi
除了過時和前綴,還有path(保存路徑)和domain(域)。固然也支持配置文件的寫法:COOKIE_PREFIX、COOKIE_EXPIRE、COOKIE_PATH、COOKIE_DOMAIN。
4.cookie賦值,數組
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function test(){ //cookie賦值,數組 cookie('user', array('Mr.', 'xixi')); print_r(cookie(user)); } }
訪問:http://localhost/ThinkPHP/Home/User/test/返回
Array ( [0] => Mr. [1] => xixi )
5.刪除
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function test(){ //cookie刪除user cookie('user', null); //cookie刪除在配置文件裏指定前綴的全部 cookie(null); //cookie刪除指定think_前綴的 cookie(null, 'think_'); } }
ThinkPHP--視圖--圖像處理
ThinkPHP的圖像處理功能,即Image.class.php。支持GD庫和Imagick庫,包括對GIF圖像處理的支持。
一.實例化類庫
GD庫:
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //自動添加Think下的Image這個類 //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); } }
Imageick擴展庫:
方式一:
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //採用Imageick擴展庫 $image = new Image('Imagick'); //默認沒安裝,加載會報錯 } }
方式二:
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //採用Imageick擴展庫,默認沒安裝 $image = new Image(Image::IMAGE_IMAGICK); //默認沒安裝,加載不會報錯 } }
二.獲取圖像信息
將一張圖片保存在Public公共目錄下,命名爲:1.jpg。首先,經過Image打開圖像。
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //獲取圖片信息 $arr['width'] = $image->width(); //圖片長度 $arr['height'] = $image->height(); //圖片高度 $arr['type'] = $image->type(); //圖片類型 $arr['mime'] = $image->mime(); //圖片擴展類型 $arr['size'] = $image->size(); //圖片長度和寬度 var_dump($arr); } }
訪問:http://localhost/ThinkPHP/Home/User/返回:
array (size=5)
'width' => int 764
'height' => int 432
'type' => string 'jpeg' (length=4)
'mime' => string 'image/jpeg' (length=10)
'size' =>
array (size=2)
0 => int 764
1 => int 432
三.圖像處理
1.使用crop()和save()方法能夠實現圖像的裁剪功能。
在原有圖片的基礎上裁剪圖片爲高400寬400生成一張2.jpg(默認0,0座標開始截起)
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //裁剪圖片,高400,寬400經過save生成 $image->crop(400,400)->save('./Public/2.jpg'); } }
在原有圖片的基礎上裁剪圖片爲高400寬400生成一張2.jpg(座標100,100開始裁剪)
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //裁剪圖片,座標100,100開始裁剪 $image->crop(400,400,100,100)->save('./Public/2.jpg'); } }
在原有圖片的基礎上裁剪圖片爲高400寬400生成一張2.jpg(座標100,100開始裁剪),最後在縮放成200*200
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //裁剪圖片,生成後的圖片壓縮成高寬200 $image->crop(400,400,100,100,200,200)->save('./Public/2.jpg'); } }
2.使用thumb方法生成縮略圖。
生成縮略圖300*300
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //生成縮略圖 $image->thumb(300,300)->save('./Public/2.jpg'); } }
注意:雖然咱們設置了寬高300,但實際上它是300 x 168,由於生成縮略圖採用默認等比例縮放的。若是想用其它縮略圖模式,可使用如下方式。
(1)IMAGE_THUMB_SCALE = 1 ; //等比例縮放類型
(2)IMAGE_THUMB_FILLED = 2 ; //縮放後填充類型
(3)IMAGE_THUMB_CENTER = 3 ; //居中裁剪類型
(4)IMAGE_THUMB_NORTHWEST = 4 ; //左上角裁剪類型
(5)IMAGE_THUMB_SOUTHEAST = 5 ; //右下角裁剪類型
(6)IMAGE_THUMB_FIXED = 6 ; //固定尺寸縮放類型
生成縮略圖,以中心點截取,直接傳3也能夠
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //生成縮略圖,以中心點截取,直接傳3也能夠 $image->thumb(300,300,Image::IMAGE_THUMB_CENTER)->save('./Public/2.jpg'); } }
3.使用water()方法能夠生成一張包含水印的圖片。
在圖片右下角添加水印並生成(把圖片1.jpg右下角添加水印後拷貝成2.jpg)
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //在圖片右下角添加水印並生成 $image->water('./Public/logo.png')->save('./Public/2.jpg'); } }
因爲默認是右下角水印位置,若是想更改水印位置,能夠在第二參數使用以下:
(1)IMAGE_WATER_NORTHWEST = 1 ; //左上角水印
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //更改水印到左上角 $image->water('./Public/logo.png', Image::IMAGE_WATER_NORTHWEST)->save('./Public/2.jpg'); } }
(2)IMAGE_WATER_NORTH = 2 ; //上居中水印
(3)IMAGE_WATER_NORTHEAST = 3 ; //右上角水印
(4)IMAGE_WATER_WEST = 4 ; //左居中水印
(5)IMAGE_WATER_CENTER = 5 ; //居中水印
(6)IMAGE_WATER_EAST = 6 ; //右居中水印
(7)IMAGE_WATER_SOUTHWEST = 7 ; //左下角水印
(8)IMAGE_WATER_SOUTH = 8 ; //下居中水印
(9)IMAGE_WATER_SOUTHEAST = 9 ; //右下角水印
設置水印的透明度,默認爲80,1-100之間
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //設置水印的透明度,默認爲80,1-100之間 $image->water('./Public/logo.png', Image::IMAGE_WATER_NORTHWEST, 30)->save('./Public/2.jpg'); } }
設置文本水印(文字:xixi,字體:./Public/consola.ttf,大小:20,顏色:#ffffff)
<?php namespace Home\Controller; use Think\Controller; use Think\Image; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化圖像處理類,默認爲GD庫 $image = new Image(); //加載一張預處理的圖片 $image->open('./Public/1.jpg'); //設置文本水印 $image->text('xixi', './Public/consola.ttf', 20, '#ffffff', Image::IMAGE_WATER_SOUTHEAST)->save('./Public/2.jpg'); } }
ThinkPHP--視圖--驗證碼
ThinkPHP的驗證碼功能,即Verify.class.php。此驗證碼能夠支持驗證碼的生成和驗證功能。
一.生成驗證碼
1.默認數字與字母大小寫不區分的5位驗證碼
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //生成一個驗證碼圖形 $verify->entry(); } }
注意:生成的驗證碼會將信息保存在session中,可使用print_r($_SESSION)來查看。若是想生成多個驗證碼,能夠傳遞數字參數便可
生成多個驗證碼
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //生成第一個驗證碼 $verify->entry(1); //生成第二個驗證碼 $verify->entry(2); } }
二.驗證碼參數
能夠對生成的驗證碼設置相關的參數,以達到不一樣的顯示效果。
(1)expire描述:驗證碼的有效期(秒)
(2)useImgBg描述:是否使用背景圖片 默認爲false
(3)fontSize描述:驗證碼字體大小(像素) 默認爲25
(4)useCurve描述:是否使用混淆曲線 默認爲true
(5)useNoise描述:是否添加雜點 默認爲true
(6)imageW描述:驗證碼寬度 設置爲0爲自動計算
(7)imageH描述:驗證碼高度 設置爲0爲自動計算
(8length描述:驗證碼位數
(9)fontttf描述:指定驗證碼字體 默認爲隨機獲取
(10)useZh描述:是否使用中文驗證碼
(11)bg描述:驗證碼背景顏色 rgb數組設置,例如 array(243, 251, 254)
(12)seKey描述:驗證碼的加密密鑰
(13)codeSet描述:驗證碼字符集合
(14)zhSet描述:驗證碼字符集合(中文)
設置驗證碼參數(字體大小,位數,關閉驗證碼雜點)
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //設置驗證碼參數 $config = array( 'fontSize'=>30, //驗證碼字體大小 'length'=>3, //驗證碼位數3位 'useNoise'=>false, //關閉驗證碼雜點 ); //實例化驗證碼類,並傳入參數 $verify= new \Think\Verify($config); //生成驗證碼 $verify->entry(); } }
採用的配置變量方式來修改驗證碼參數,也可使用動態設置方法:
(1)設置驗證碼字體爲5.ttf文件
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置驗證碼字體 $verify->fontttf = '5.ttf'; //生成驗證碼 $verify->entry(); } }
(2)設置背景圖片功能,隨機使用
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置背景圖片功能,隨機使用 $verify->useImgBg = true; //生成驗證碼 $verify->entry(); } }
(3)取消曲線混淆
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //取消曲線混淆 $verify->useCurve = false; //生成驗證碼 $verify->entry(); } }
(4)設置驗證碼的高寬和驗證碼的長度
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置驗證碼的高 $verify->imageH = 100; //設置驗證碼的寬 $verify->imageW = 100; //設置驗證碼的長度 $verify->length = 1; //生成驗證碼 $verify->entry(); } }
(5)設置驗證碼背景顏色
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置驗證碼背景顏色 $verify->bg = array(200,200,200); //生成驗證碼 $verify->entry(); } }
1.若是想讓驗證碼顯示中文字符,那麼須要幾個步驟:
(1)在Think/zhttfs文件夾下引入中文字體文件,好比加粗雅黑msyhbd.ttf;
(2)設置字體文件;
(3)把中文字體雅黑msyhbd.ttf放到ThinkPHP/Libray/Think/Verify/zhttfs/msyhbd.ttf
(4)設置中文驗證碼
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置驗證碼字體 $verify->fontttf = 'msyhbd.ttf'; //設置中文驗證碼 $verify->useZh = true; //生成驗證碼 $verify->entry(); } }
注意:因爲中文字符較爲龐大,你也能夠限定指定的中文字符。
2.限定中文字符
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置驗證碼字體 $verify->fontttf = 'msyhbd.ttf'; //設置中文驗證碼 $verify->useZh = true; //限定中文字符 $verify->zhSet = '西西是個好人'; //生成驗證碼 $verify->entry(); } }
3.設置純數字
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置純數字 $verify->codeSet='0123456789'; //生成驗證碼 $verify->entry(); } }
三.驗證碼檢測
咱們可使用Verify.class.php類中的check方法檢測驗證碼是否輸入正確。
第一步:在function.php裏構建一個函數:\ThinkPHP\Weibo\Common\Common\function.php
<?php //函數$code是驗證碼字符,$id是第幾個驗證碼,若是隻有一個,能夠忽略 function check_verify($code, $id = ''){ $verify = new \Think\Verify(); return $verify->check($code, $id); }
第二步:經過輸入驗證,來驗證,是否返回true
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index(){ //實例化驗證碼類 $verify= new \Think\Verify(); //設置純數字 $verify->codeSet='0123456789'; //生成驗證碼 $verify->entry(); } //經過輸入驗證,來驗證,是否返回true public function test() { $code = I('get.code'); var_dump(check_verify($code)); //($code, 1) } }
訪問:http://localhost/ThinkPHP/Home/User/index生成驗證碼29535
經過訪問:http://localhost/ThinkPHP/Home/User/test?code=29535驗證
正確返回:boolean true
ThinkPHP--視圖--文件上傳
ThinkPHP的文件上傳功能,即Upload.class.php。上傳類能夠提供單個文件上傳、多個文件上傳等上傳方式。
一.上傳單個表單
1.建立上牀表單路徑:ThinkPHP\Weibo\Home\View\default\User\index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <form action="__CONTROLLER__/upload" enctype="multipart/form-data" method="post"> <!-- __CONTROLLER控制器,upload這個方法,enctype支持上傳的屬性值,method方法去發送--> <input type="text" name="name" /> <input type="file" name="photo" /> <input type="submit" value="提交" /> </form> </body> </html>
2.配置文件設置主體目錄:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //設置默認主題目錄 'DEFAULT_THEME'=>'default', );
3.在控制器裏建立一個upload方法,實現上傳功能:ThinkPHP\Weibo\Home\Controller\UserController.class.php
方式一:實例化上傳Upload類
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { $this->success('上傳成功!'); //成功了 } } }
訪問:http://localhost/ThinkPHP/Home/User/上傳
方式二:實例化配置參數
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { //實例化配置參數 $config = array( 'maxSize'=>3145728, 'exts'=>array('jpg','gif','png','jpeg'), 'savePath'=>'./', ); $upload = new Upload($config); $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { $this->success('上傳成功!'); //成功了 } } }
二.文件上傳
Upload類支持的屬性:
(1)maxSize參數:文件上傳的最大文件大小(以字節爲單位),0爲不限大小
(2)rootPath參數:文件上傳保存的根路徑
(3)savePath參數:文件上傳的保存路徑(相對於根路徑)
(4)saveName參數:上傳文件的保存規則,支持數組和字符串方式定義
(5)saveExt參數:上傳文件的保存後綴,不設置的話使用原文件後綴
(6)replace參數:存在同名文件是不是覆蓋,默認爲false
(7)exts參數:容許上傳的文件後綴(留空爲不限制),使用數組或者逗號分隔的字符串設置,默認爲空
(8)mimes參數:容許上傳的文件類型(留空爲不限制),使用數組或者逗號分隔的字符串設置,默認爲空
(9)autoSub參數:自動使用子目錄保存上傳文件 默認爲true
(10)subName參數:子目錄建立方式,採用數組或者字符串方式定義
(11)hash參數:是否生成文件的hash編碼 默認爲true
(12)callback參數:檢測文件是否存在回調,若是存在返回文件信息數組
1.設置文件名字容許覆蓋同名,限制上傳文件類型
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 //設置文件名 $upload->saveName = '123'; //設置同名覆蓋 $upload->replace = true; //限制上傳文件類型 $upload->mimes = array('image/jpeg'); $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { $this->success('上傳成功!'); //成功了 } } }
2.設置子目錄格式爲20180421這種格式
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 //設置子目錄格式 $upload->subName = array('date','Ymd'); $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { $this->success('上傳成功!'); //成功了 } } }
3.子目錄採用函數返回
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 //子目錄採用函數返回 $upload->subName = 'get_user_id'; $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { $this->success('上傳成功!'); //成功了 } } }
在function.php中建立一個函數
<?php function get_user_id() { return rand(); //隨機生成5位數字 }
4.上傳成功獲取上傳文件信息
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { //獲取上傳文件信息 foreach ($info as $file) { echo $file['savepath'].$file['savename']; } } } }
5.$file數組可使用的屬性:
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { //獲取上傳文件信息 foreach ($info as $file) { echo $file['key'].'<br />'; //附件上傳的表單名稱 echo $file['savepath'].'<br />'; //上傳文件的保存路徑 echo $file['name'].'<br />'; //上傳文件的原始名稱 echo $file['savename'].'<br />'; //上傳文件的保存名稱 echo $file['size'].'<br />'; //上傳文件的大小 echo $file['type'].'<br />'; //上傳文件的MIME類型 echo $file['ext'].'<br />'; //上傳文件的後綴類型 echo $file['md5'].'<br />'; //上傳文件的md5哈希驗證字符串 僅當hash設置開啓後有效 echo $file['sha1'].'<br />'; //上傳文件的sha1哈希驗證字符串 僅當hash設置開啓後有效 } } } }
三.多文件上傳設置,或者改成photo1,photo2,photo3便可
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <form action="__CONTROLLER__/upload" enctype="multipart/form-data" method="post"> <!-- __CONTROLLER控制器,upload這個方法,enctype支持上傳的屬性值,method方法去發送--> <input type="text" name="name" /> <input type="file" name="photo[]" /> <input type="file" name="photo[]" /> <input type="file" name="photo[]" /> <input type="submit" value="提交" /> </form> </body> </html>
獲取上傳文件信息:
<?php namespace Home\Controller; use Think\Controller; use Home\Event\UserEvent; use Think\Image; use Think\Verify; use Think\Upload; //傳遞兩個參數 class UserController extends Controller { //上傳功能 public function upload() { $upload = new Upload(); //實例化上傳Upload類 $upload->maxSize = 3145728; //設置上傳大小,字節 $upload->exts = array('jpg','gif','png','jpeg'); //限定後綴 $upload->savePath = './'; //在根目錄Uploads下 $info = $upload->upload(); //執行上傳方法 if (!$info) { $this->error($upload->getError()); //錯誤了 } else { //獲取上傳文件信息 foreach ($info as $file) { echo $file['savepath'].$file['savename'].'<br />'; } } } }
返回:
./2018-04-21/5adad5e96af27.jpg
./2018-04-21/5adad5e96ce67.jpg
./2018-04-21/5adad5e96e5d7.jpg
ThinkPHP--視圖--多語言
ThinkPHP的多語言設置,多語言就是國際化問題,能夠改變網站各類信息語言的設置。
一.系統信息
ThinkPHP內置多語言支持,若是涉及到國際化的支持,那麼能夠定義相關的語言包文件。任何字符串形式的輸出,均可以定義語言常量。
1.要啓用多語言功能,須要配置開啓多語言行爲,在應用配置目錄中:\ThinkPHP\Weibo\Common\Conf\tags.php
<?php //在應用模塊Weibo下Common/Conf創建tags.php return array( 'app_begin'=>array('Behavior\CheckLangBehavior'), );
PS:這個行爲主要是檢測多語言功能。
2.配置文件設置:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題目錄 'DEFAULT_THEME'=>'default', //設置可訪問模塊 'MODULE_ALLOW_LIST'=>array('Home','Admin'), 'DEFAULT_MODULE'=>'Home', //啓用路由功能 'URL_ROUTER_ON'=> true, //開啓語言包功能 'LANG_SWITCH_ON' => true, //自動偵測語言 開啓多語言功能後有效 'LANG_AUTO_DETECT' => true, //容許切換的語言列表 用逗號分隔 'LANG_LIST' => 'zh-cn,en-us', //默認語言切換變量 'VAR_LANGUAGE' => 'lang', );
3.配置:ThinkPHP\Weibo\Home\View\default\User\index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> </body> </html>
ThinkPHP系統提供了三個默認語言包,分別是簡體中文、英文、繁體中文。而這三種語言包保存在:Think\Lang下。
咱們想顯示系統提示信息,能夠經過L()方法來傳入多語言變量。
默認輸出沒法加載控制器經過cookie切換語言定義爲英文
4.配置:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index() { //設置語言定義的鍵值對 echo L('_CONTROLLER_NOT_EXIST_'); //沒法加載控制器 $this->display(); } //經過cookie切換語言定義 public function lang() { setcookie('think_language','en-us'); } }
訪問:http://localhost/ThinkPHP/User/返回
Controler can't be loaded
二.應用信息
除了系統開發信息的語言包,咱們用的更多的是項目應用中的語言定義切換。好比,一個表單支持中英文雙語結構。
除了以上的配置外,實現應用信息中英文切換須要在應用目錄進行配置。
第一步:要啓用多語言功能,須要配置開啓多語言行爲,在應用配置目錄中:\ThinkPHP\Weibo\Common\Conf\tags.php
<?php //在應用模塊Weibo下Common/Conf創建tags.php return array( 'app_begin'=>array('Behavior\CheckLangBehavior'), );
PS:這個行爲主要是檢測多語言功能。
第二步:配置文件設置:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題目錄 'DEFAULT_THEME'=>'default', //設置可訪問模塊 'MODULE_ALLOW_LIST'=>array('Home','Admin'), 'DEFAULT_MODULE'=>'Home', //啓用路由功能 'URL_ROUTER_ON'=> true, //開啓語言包功能 'LANG_SWITCH_ON' => true, //自動偵測語言 開啓多語言功能後有效 'LANG_AUTO_DETECT' => true, //容許切換的語言列表 用逗號分隔 'LANG_LIST' => 'zh-cn,en-us', //默認語言切換變量 'VAR_LANGUAGE' => 'lang', );
第三步:在Home目錄下創建Lang目錄;
第四步:分別創建zh-cn.php和en-us.php兩個文件;
第五步:分別在兩個語言包編寫語言常量;
中文常量:ThinkPHP\Weibo\Home\Lang\zh-cn.php
<?php //中文語言包 return array( //表單部分 'form_user'=>'用戶', 'form_pass'=>'密碼', 'form_email'=>'郵箱', 'form_submit'=>'提交', );
英文常量:ThinkPHP\Weibo\Home\Lang\en.us.php
<?php //英文語言包 return array( //表單部分 'form_user'=>'user', 'form_pass'=>'pass', 'form_email'=>'email', 'form_submit'=>'submit', );
第六步:模版獲取語言定義{$Think.lang.form_...}:ThinkPHP\Weibo\Home\View\default\User\index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <p>{$Think.lang.form_user}:<input type="text" name="user" /></p> <p>{$Think.lang.form_pass}:<input type="password" name="pass" /></p> <p>{$Think.lang.form_email}:<input type="text" name="email" /></p> <p><input type="submit" value="{$Think.lang.form_submit}" /></p> </body> </html>
第七步配置:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; //傳遞兩個參數 class UserController extends Controller { public function index() { $this->display(); } }
切換中文:http://localhost/ThinkPHP/User/?lang=zh-cn
切換英文:http://localhost/ThinkPHP/User/?lang=en-us
ThinkPHP--視圖--auth權限控制
ThinkPHP的auth權限控制,瞭解一下Auth權限類的簡單使用過程。
一.權限介紹
所謂權限控制,大部分是在管理後臺上使用。好比超級管理員登陸,會獲得全部操做的控制權;認證專員,只能給會員作認證操做;審覈專員,只能操做內容的審覈、刪除、加精等操做,以此類推。那麼ThinkPHP提供了一個內置的Auth.class.php類來實現權限控制,這個類提供了三個表:think_auth_rule(認證規則表)、think_auth_group(用戶組表)、think_auth_group_access(用戶和組對應關係表)。固然還要結合本身建立的用戶表進行對應便可。
二.簡單登陸
第一步:在Admin模塊下建立一個IndexController.class.php(默認就有了),建立index方法,輸出一句話便可。
配置:ThinkPHP\Weibo\Admin\Controller\IndexController.class.php
<?php namespace Admin\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ echo '後臺首頁'; } }
經過URL訪問:http://localhost/ThinkPHP/Admin/Index/index便可訪問
第二步:在Weibo根目錄下的Common公共模塊下建立Controller文件夾,並在裏面建立一個AuthController.class.php類,這個類用於權限控制。
配置文件:\ThinkPHP\Weibo\Common\Controller\AuthController.class.php
<?php namespace Common\Controller; use Think\Controller; use Think\Auth; class AuthController extends Controller { protected function _initialize() { //只能內部使用固定方法 $auth = new Auth(); if(!$auth->check()) { //若是判斷沒有這個權限的狀況下 $this->error('沒有權限'); //返回 } } }
經過URL訪問:http://localhost/ThinkPHP/Admin/Index/index便可訪問
這裏使用的方法固定爲:_initialize()。因爲AuthController.class.php繼承了Controller類,因此,第一步的Index類改成繼承它。
<?php // 本類由系統自動生成,僅供測試用途 namespace Admin\Controller; use Common\Controller\AuthController; class IndexController extends AuthController { public function index(){ echo '後臺首頁'; } }
此時,咱們再訪問後臺首頁的時候,已經沒有權限了。主要是$auth->check()驗證沒法經過的緣由。
三.Auth權限類的簡單使用過程
設置三個用戶:admin爲超級管理員能夠全部權限uid=1;test測試用戶uid=2:沒有權限,guest遊客uid=3,只有登陸權限
第一步:數據庫thinkphp建立三張表手工添加規則
表1:think_auth_rule(type=1表示url訪問容許訪問Admin/Index/index這個頁面這個頁面的id是1) id name title type status condition 1 Admin/Index/index 後臺首頁 1 1 表2:think_auth_group(默認管理組status=1表示能夠用,權限rules寫的是容許訪問Admin/Index/index權限的id=1,2,3,4,5) id title status rules 1 默認管理組 1 1,2,3,4,5 表3:think_auth_group_access(把組權限分配給3,3表明guest用戶) uid group_id 3 1
第二步:數據配置文件引入:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //'配置項'=>'配置值' //全局配置定義 'DB_TYPE'=>'mysql', //數據庫類型 'DB_HOST'=>'127.0.0.1', //服務器地址 'DB_NAME'=>'thinkphp', //數據庫名 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PORT'=>3306, //端口 'DB_PREFIX'=>'think_', //數據庫表前綴 );
第三步:建立登陸退出頁面:ThinkPHP\Weibo\Admin\View\Login\index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸後臺</title> </head> <body> <p>三個用戶:admin爲超級管理員能夠全部權限;test測試用戶:沒有權限,guest遊客,只有登陸權限</p> <form method="post" action="{:U('Login/index')}"> <p>用戶名:<input type="text" name="user" /></p> <p><input type="submit" value="登陸" /></p> </form> </body> </html>
第四步:建立首頁登陸和退出方法,路徑:ThinkPHP\Weibo\Admin\Controller\IndexController.class.php
<?php namespace Admin\Controller; use Common\Controller\AuthController; class IndexController extends AuthController { public function index(){ echo '後臺首頁'; echo '<a href="'.U('Login/logout').'">退出</a>'; } }
第五步:建立一個LoginController.class.php路徑爲ThinkPHP\Weibo\Admin\Controller\LoginController.class.php
<?php namespace Admin\Controller; use Think\Controller; class LoginController extends Controller { public function index(){ //登陸方法 if (IS_POST) { $login = array(); switch (I('user', null, false)) { case 'admin' : //判斷是不是admin $login['uid'] = 1; $login['user'] = 'admin'; //獲取用 break; case 'test' : //判斷是不是test $login['uid'] = 2; $login['user'] = 'test'; break; case 'guest' : //判斷是不是guest $login['uid'] = 3; $login['user'] = 'guest'; break; default: $this->error('登陸的用戶不存在!'); //若是不是上面三個用戶登陸返回 } if (count($login)) { //若是是admin和guest用戶登陸 session('auth', $login); $this->success('登陸成功!', U('Index/index')); //登陸成功跳轉到:http://localhost/ThinkPHP/index.php/Admin/Index/index.html } } else { $this->display(); } } public function logout(){ //退出登陸方法 session('[destroy]'); $this->success('退出成功',U('Login/index')); //退出成功跳轉到:http://localhost/ThinkPHP/index.php/Admin/Login/index.html } }
訪問:http://localhost/ThinkPHP/index.php/Admin/Login/index.html
最後實現admin爲超級管理員能夠全部權限;test測試用戶:沒有權限,guest遊客,只有登陸權限
ThinkPHP--視圖--關聯模型
ThinkPHP的關聯模型,關聯模型能夠很是容易的操做多種關聯表的增、刪、改、查。
一.模型簡介
關聯模型,一共有三種模式:
一對一:ONE_TO_ONE,包括HAS_ONE和BELONGS_TO;
一對多:ONE_TO_MANY,包括HAS_MANY和BELONGS_TO;
多對多:MANY_TO_MANY。
用表關係來理解這三種模式:
一對一:用戶表和身份證表,一個用戶只能對應一個身份證,而一個身份證只能對應一個用戶。這就是一對一。
一對多:用戶表和留言表:一個用戶能夠發表N條留言,而每條留言只能由某一個用戶發表。這就是一對多。就算有多個用戶發表了相同的留言內容,但ID卻不同,因此,不能理解爲多對多。
多對多:用戶表和角色表:一個用戶能夠是認證專員,同時也是審覈專員。那麼角色表中的審覈專員也能夠是蠟筆小新的角色,也能夠是路飛的角色。這就是多對多。
二.關聯操做
建立用戶數據表:think_user
建立身份證表:think_card
建立留言表:think_content
建立角色表:think_role
建立中間表實現多對多:think_group(西西用戶id=1權限是管理員,認證專業,審覈專員。西西用戶id=2權限是認證專員,審覈專員,西西用戶3id=3權限審覈專員)
1.擁有關係:用戶表和身份證表關聯,HAS_ONE(一對一),表示一個用戶只有一個身份證。
User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function index() { $user = D('User'); $arr = $user->relation(true)->select(); //指向relation,true自動獲取UserModel裏的Card var_dump($arr); } }
HAS_ONE支持如下屬性:
class_name屬性:關聯的模型類名,若是不寫,會自動定位相關數據表。
mapping_name屬性:關聯映射名稱,用於獲取數據的數組名。
mapping_type屬性:設置關聯模式,好比一對一self::HAS_ONE。
foreign_key屬性:關聯外鍵的名稱,會自動對應當前數據表的id。
mapping_fields屬性:關聯要查詢的字段,默認是查詢全部。
as_fields屬性:關聯的字段映射成同級的字段。
condition屬性:關聯條件,額外查詢使用。
User模型部分:ThinkPHP\Weibo\Home\Model\UserModel.class.php
<?php namespace Home\Model; use Think\Model; use Think\Model\RelationModel; class UserModel extends RelationModel { //RelationModel方法才能被關聯 protected $_link = array( //受保護的字段$_link鏈接 'Card'=>array( //關聯模型的屬性Card指向一個數組 'mapping_type'=>self::HAS_ONE, //是一對一中的HAS_ONE模式 'foreign_key'=>'uid', //經過think_user表裏的id和think_card表裏的uid相關聯 'mapping_fields'=>'code', //只顯示code 'as_fields'=>'code', //把code做爲用戶表think_user裏的一個字段跟它們平級顯示 //'condition'=>'id=1', //只顯示id=1的code ), ); }
訪問http://localhost/ThinkPHP/Home/User/index/結果:
array (size=4)
0 =>
array (size=6)
'id' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
'email' => string 'xixi1@xixi.com' (length=14)
'count' => string '1' (length=1)
'date' => string '2018-04-14 12:35:33' (length=19)
'code' => string '110102' (length=6)
1 =>
array (size=6)
'id' => string '2' (length=1)
'user' => string '用戶西西2' (length=13)
'email' => string 'xixi2@xixi.com' (length=14)
'count' => string '2' (length=1)
'date' => string '2018-04-11 00:00:00' (length=19)
'code' => string '110103' (length=6)
2 =>
array (size=6)
'id' => string '3' (length=1)
'user' => string '用戶西西3' (length=13)
'email' => string 'xixi3@xixi.com' (length=14)
'count' => string '3' (length=1)
'date' => string '2018-04-25 00:00:00' (length=19)
'code' => null
3 =>
array (size=6)
'id' => string '4' (length=1)
'user' => string '用戶西西4' (length=13)
'email' => string 'xixi4@xixi.com' (length=14)
'count' => string '4' (length=1)
'date' => string '2018-04-03 00:00:00' (length=19)
'code' => string '110104' (length=6)
2.從屬關係:用戶表和身份證表關聯,BELONGS_TO(一對一),表示一個身份證從屬於一個用戶。
由於身份證(think_card)表的uid和用戶(think_user)表關聯的,用戶表沒有跟身份證表關聯,用戶表沒有身份證的信息,身份證表包含了用戶表的uid,因此身份證表是從屬於用戶表
Card控制器部分:ThinkPHP\Weibo\Home\Controller\CardController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\CardModel; class CardController extends Controller { public function index() { $card = D('Card'); $arr = $card->relation(true)->select(); var_dump($arr); } }
Card模型部分:ThinkPHP\Weibo\Home\Model\CardModel.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\CardModel; class CardController extends Controller { public function index() { $card = D('Card'); $arr = $card->relation(true)->select(); var_dump($arr); } }
訪問:http://localhost/ThinkPHP/Home/Card/index返回
array (size=3)
0 =>
array (size=4)
'id' => string '1' (length=1)
'code' => string '110102' (length=6)
'uid' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
1 =>
array (size=4)
'id' => string '1' (length=1)
'code' => string '110103' (length=6)
'uid' => string '2' (length=1)
'user' => string '用戶西西2' (length=13)
2 =>
array (size=4)
'id' => string '3' (length=1)
'code' => string '110104' (length=6)
'uid' => string '4' (length=1)
'user' => string '用戶西西4' (length=13)
3.用戶表和留言表:HAS_MANY(一對多)表示一個用戶發表N條留言
User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function index() { $user = D('User'); $arr = $user->relation(true)->select(); print_r($arr); //經過print_r打印出來 } }
User模型部分:ThinkPHP\Weibo\Home\Model\UserModel.class.php
<?php namespace Home\Model; use Think\Model; use Think\Model\RelationModel; //在模型類裏限制字段 class UserModel extends RelationModel { //RelationModel方法才能被關聯 protected $_link = array( //受保護的字段$_link鏈接 'Content'=>array( //關聯模型的屬性Content指向一個數組 'mapping_type'=>self::HAS_MANY, //是一對多中的HAS_MANY模式 'foreign_key'=>'uid', 'mapping_fields'=>'content', //只想顯示content 'mapping_limit'=>'0,2', //只想顯示一對多的多的前倆條 'mapping_order'=>'id DESC', //倒序 ), ); }
訪問:http://localhost/ThinkPHP/Home/User/查看源代碼
Array
(
[0] => Array
(
[id] => 1
[user] => 用戶西西1
[email] => xixi1@xixi.com
[count] => 1
[date] => 2018-04-14 12:35:33
[Content] => Array
(
[0] => Array
(
[content] => 個人第三條留言
)
[1] => Array
(
[content] => 個人第二條留言
)
)
)
[1] => Array
(
[id] => 2
[user] => 用戶西西2
[email] => xixi2@xixi.com
[count] => 2
[date] => 2018-04-11 00:00:00
[Content] =>
)
[2] => Array
(
[id] => 3
[user] => 用戶西西3
[email] => xixi3@xixi.com
[count] => 3
[date] => 2018-04-25 00:00:00
[Content] =>
)
[3] => Array
(
[id] => 4
[user] => 用戶西西4
[email] => xixi4@xixi.com
[count] => 4
[date] => 2018-04-03 00:00:00
[Content] =>
)
)
4.用戶表和留言表:BELONGS_TO(多對一)表示N條留言從屬於某個用戶。
User控制器部分:ThinkPHP\Weibo\Home\Controller\ContentController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\ContentModel; class ContentController extends Controller { public function index() { $content = D('Content'); $arr = $content->relation(true)->select(); var_dump($arr); } }
User模型部分:ThinkPHP\Weibo\Home\Model\ContentModel.class.php
<?php namespace Home\Model; use Think\Model\RelationModel; class ContentModel extends RelationModel { protected $_link = array( 'User'=>array( 'mapping_type'=>self::BELONGS_TO, 'class_name'=>'User', 'foreign_key'=>'uid', 'mapping_name'=>'user', 'mapping_fields'=>'user', 'as_fields'=>'user', ), ); }
訪問:http://localhost/ThinkPHP/Home/Content返回
array (size=3)
0 =>
array (size=4)
'id' => string '1' (length=1)
'content' => string '個人第一條留言' (length=21)
'uid' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
1 =>
array (size=4)
'id' => string '2' (length=1)
'content' => string '個人第二條留言' (length=21)
'uid' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
2 =>
array (size=4)
'id' => string '3' (length=1)
'content' => string '個人第三條留言' (length=21)
'uid' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
PS:多對一的使用和一對一是同樣的。
5.用戶表、角色表和中間關聯表,MANY_TO_MANY實現多對多關聯。
User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function index() { $user = D('User'); $arr = $user->relation(true)->select(); print_r($arr); //經過print_r打印出來 } }
User模型部分:ThinkPHP\Weibo\Home\Model\UserModel.class.php
<?php namespace Home\Model; use Think\Model; use Think\Model\RelationModel; class UserModel extends RelationModel { //RelationModel方法才能被關聯 protected $_link = array( //受保護的字段$_link鏈接 'Role'=>array( 'mapping_type'=>self::MANY_TO_MANY, //多對多 'relation_table'=>'think_group', //中間表think_group 'foreign_key'=>'uid', //用中間表關聯user表的uid 'relation_foreign_key'=>'gid', //關聯角色表的gid ), ); }
訪問:http://localhost/ThinkPHP/Home/User/查看源代碼
Array
(
[0] => Array
(
[id] => 1
[user] => 用戶西西1
[email] => xixi1@xixi.com
[count] => 1
[date] => 2018-04-14 12:35:33
[Role] => Array
(
[0] => Array
(
[id] => 1
[title] => 管理員
)
[1] => Array
(
[id] => 2
[title] => 認證專員
)
[2] => Array
(
[id] => 3
[title] => 審覈專員
)
)
)
[1] => Array
(
[id] => 2
[user] => 用戶西西2
[email] => xixi2@xixi.com
[count] => 2
[date] => 2018-04-11 00:00:00
[Role] => Array
(
[0] => Array
(
[id] => 2
[title] => 認證專員
)
[1] => Array
(
[id] => 3
[title] => 審覈專員
)
)
)
[2] => Array
(
[id] => 3
[user] => 用戶西西3
[email] => xixi3@xixi.com
[count] => 3
[date] => 2018-04-25 00:00:00
[Role] => Array
(
[0] => Array
(
[id] => 3
[title] => 審覈專員
)
)
)
[3] => Array
(
[id] => 4
[user] => 用戶西西4
[email] => xixi4@xixi.com
[count] => 4
[date] => 2018-04-03 00:00:00
[Role] => Array
(
)
)
)
注意:這裏的用戶表和角色表並無關聯字段,而是採用中間表來關聯他們,再經過ThinkPHP的關聯模式,進行多對多匹配。
三.表與表之間進行管理後,還能夠進行寫入、更新和刪除。
1.新增:新增一個用戶,同時增長一個身份證
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function add() { $user = D('User'); $data['user'] = '測試用戶'; $data['mail'] = 'xixi@18.com'; $data['Card'] = array( //給Card 表也要新增 'code' => '123456', ); $user->relation(true)->add($data); } }
2.刪除:刪除一個用戶,同時刪除關聯的身份證
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function delete() { //刪除一個用戶,同時刪除關聯的身份證 $user = D('User'); $user->relation(true)->delete(4); } }
3.修改:更新一個用戶,同時更新對應的身份證
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function save() { $user = D('User'); $data['user'] = '修改'; $data['mail'] = '修改@18.com'; $data['Card'] = array( 'code'=>'3209zz', ); $user->relation(true)->where(array('id'=>3))->save($data); } }
ThinkPHP--視圖模型和分頁
一.視圖模型
關聯模型能夠解決一對1、一對多和多對多等關聯操做。它們經過生成多條SQL語句而後進行數組拼裝獲得最終想要的結果。對於一對一這種HAS_ONE和BELONGS_TO的多表關聯查詢,可使用視圖模型。它採用的是聯合查詢(JOIN),很是適合此類查詢需求。
User控制器部分:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function index() { $user = D('UserView'); var_dump($user->select()); } }
User模型部分:ThinkPHP\Weibo\Home\Model\UserViewModel.class.php
<?php namespace Home\Model; use Think\Model; use Think\Model\ViewModel; class UserViewModel extends ViewModel { public $viewFields = array( 'User'=>array('id','user','email'), //user表顯示id,user,email 'Card'=>array('code','_on'=>'User.id=Card.uid'), //card表關聯,_on條件指向User.id=Card.uid'(沒有身份證的用戶被隱藏了) 'Content'=>array('content', '_on'=>'User.id=Content.uid'), ); }
訪問:http://localhost/ThinkPHP/Home/User/返回
array (size=3)
0 =>
array (size=5)
'id' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
'email' => string 'xixi1@xixi.com' (length=14)
'code' => string '110102' (length=6)
'content' => string '個人第一條留言' (length=21)
1 =>
array (size=5)
'id' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
'email' => string 'xixi1@xixi.com' (length=14)
'code' => string '110102' (length=6)
'content' => string '個人第二條留言' (length=21)
2 =>
array (size=5)
'id' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
'email' => string 'xixi1@xixi.com' (length=14)
'code' => string '110102' (length=6)
'content' => string '個人第三條留言' (length=21)
使用關聯查詢,顯示User表且包含Card表關聯的數據,未關聯的則忽略。若是想把未關聯的查詢出來,可使用LEFT左查詢。
<?php namespace Home\Model; use Think\Model; use Think\Model\ViewModel; class UserViewModel extends ViewModel { public $viewFields = array( 'User'=>array('id','user','email','_type'=>'LEFT'), //LEFT JOIN 'Card'=>array('code','_on'=>'User.id=Card.uid'), //card表關聯,_on條件指向User.id=Card.uid'(沒有身份證的用戶被隱藏了) ); }
訪問:http://localhost/ThinkPHP/Home/User/返回(帶身份證的顯示不帶身份證的也顯示)
array (size=4)
0 =>
array (size=4)
'id' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
'email' => string 'xixi1@xixi.com' (length=14)
'code' => string '110102' (length=6)
1 =>
array (size=4)
'id' => string '2' (length=1)
'user' => string '用戶西西2' (length=13)
'email' => string 'xixi2@xixi.com' (length=14)
'code' => string '110103' (length=6)
2 =>
array (size=4)
'id' => string '4' (length=1)
'user' => string '用戶西西4' (length=13)
'email' => string 'xixi4@xixi.com' (length=14)
'code' => string '110104' (length=6)
3 =>
array (size=4)
'id' => string '3' (length=1)
'user' => string '用戶西西3' (length=13)
'email' => string 'xixi3@xixi.com' (length=14)
'code' => null
使用group分組去除重複數據顯示每一個用戶最新一條留言:
ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; class UserController extends Controller { public function index() { $user = D('UserView'); //使用group分組去除重複數據 var_dump($user->group('id')->select()); } }
ThinkPHP\Weibo\Home\Model\UserViewModel.class.php
<?php namespace Home\Model; use Think\Model; use Think\Model\ViewModel; class UserViewModel extends ViewModel { public $viewFields = array( //LEFT JOIN 'User'=>array('id','user','email','_type'=>'LEFT'), 'Content'=>array('content', '_on'=>'User.id=Content.uid'), ); }
訪問:http://localhost/ThinkPHP/Home/User/
array (size=4)
0 =>
array (size=4)
'id' => string '1' (length=1)
'user' => string '用戶西西1' (length=13)
'email' => string 'xixi1@xixi.com' (length=14)
'content' => string '個人第一條留言' (length=21)
1 =>
array (size=4)
'id' => string '2' (length=1)
'user' => string '用戶西西2' (length=13)
'email' => string 'xixi2@xixi.com' (length=14)
'content' => null
2 =>
array (size=4)
'id' => string '3' (length=1)
'user' => string '用戶西西3' (length=13)
'email' => string 'xixi3@xixi.com' (length=14)
'content' => null
3 =>
array (size=4)
'id' => string '4' (length=1)
'user' => string '用戶西西4' (length=13)
'email' => string 'xixi4@xixi.com' (length=14)
'content' => null
二.數據分頁
ThinkPHP封裝了數據分頁功能,只要進行一些設置便可完成分頁。
配置文件設置分頁變量名:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //'配置項'=>'配置值' //全局配置定義 'DB_TYPE'=>'mysql', //數據庫類型 'DB_HOST'=>'127.0.0.1', //服務器地址 'DB_NAME'=>'thinkphp', //數據庫名 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PORT'=>3306, //端口 'DB_PREFIX'=>'think_', //數據庫表前綴 //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題目錄 'DEFAULT_THEME'=>'default', //設置分頁變量名 'VAR_PAGE'=>'page', );
模版部分html5設置:ThinkPHP\Weibo\Home\View\default\User\index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <table border="1"> <tr><th>id</th><th>user</th><th>email</th></tr> <foreach name="list" item="obj"> <tr><td>{$obj.id}</td><td>{$obj.user}</td><td>{$obj.email}</td> </tr> </foreach> </table> <p>{$page}</p> </html>
User控制器部分設置:ThinkPHP\Weibo\Home\Controller\UserController.class.php
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { $user = D('User'); $count = $user->count(); //獲得有多少條數據 $page = new Page($count, 1); //每頁顯示2條 //設置分頁參數 $page->setConfig('first','首頁'); $page->setConfig('prev','上一頁'); $page->setConfig('next','下一頁'); $page->setConfig('last','末頁'); $page->setConfig('theme', ' 共 %TOTAL_ROW% %HEADER% 共%TOTAL_PAGE%頁 %FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%'); //主題 $show = $page->show(); //一段html表分頁按鈕 $list = $user->order('date')->limit($page->firstRow.','.$page->listRows)->select(); //user指向limit方法從第幾條$page->firstRow開始每頁顯示的總條數listRows,在顯示出來select() $this->assign('list', $list); $this->assign('page', $show); $this->display(); } }
ThinkPHP--視圖--緩存處理
ThinkPHP的緩存處理,提供了數據緩存、快速緩存、查詢緩存、和靜態緩存。
一.數據緩存
在ThinkPHP中,有一個專門處理緩存的類:Cache.class.php。而咱們使用的時候,並不須要直接聲明它,直接使用一個大S()方法便可。
系統目前已經支持的緩存類型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache。若是不初始化,會默認使用File文件緩存。
數據緩存設置方法:默認生成緩存在untime/Temp
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; //User控制器部分 class UserController extends Controller { public function index() { //讀取緩存是否存在,不存在則設置 if (!$list = S('list')) { //當把S緩存方法賦給$list,而且裏面沒有東西 $user = D('User'); //執行sql語句獲取數據 $list = $user->select(); S('list', $list, 30); //把數據放到緩存裏(設置緩存30秒,生成加密的文件名,以JSON數據序列化保存起來的 } $this->assign('list',$list); //若是判斷有緩存直接跳轉到這裏(執行緩存裏的數據反序列化獲得數據) $this->display(); } }
刪除數據緩存方法:
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; //User控制器部分 class UserController extends Controller { public function index() { //讀取緩存是否存在,不存在則設置 if (!$list = S('list')) { //當把S緩存方法賦給$list,而且裏面沒有東西 $user = D('User'); //執行sql語句獲取數據 $list = $user->select(); S('list', $list, 30); //把數據放到緩存裏(設置緩存30秒,生成加密的文件名,以JSON數據序列化保存起來的 } //刪除緩存 S('list', null); $this->assign('list',$list); //若是判斷有緩存直接跳轉到這裏(執行緩存裏的數據反序列化獲得數據) $this->display(); } }
二.快速緩存
若是不想設置有效期存儲,可使用大F()方法的快速緩存。
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; //User控制器部分 class UserController extends Controller { //使用F()方法快速緩存 public function index() { if (!$list = F('list')) { $user = D('User'); $list = $user->select(); F('list', $list, TEMP_PATH); //自己放在Runtime/Data下的,手動設置到untime/Temp下 } //刪除緩存 //F('list', null); $this->assign('list', $list); $this->display(); } }
三.查詢緩存
對於及時性要求不高的數據查詢,咱們可使用查詢緩存功能來提升性能。
User控制器部分
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { $user = D('User'); //查詢SQL後緩存 //$list = $user->cache(true)->select(); //指定緩存的Key會更加高效 //$list = $user->cache('cache_user')->select(); //獲取緩存 //var_dump(S('cache_user')); //刪除緩存 //S('cache_user', null); $this->assign('list', $list); $this->display(); } }
除了查詢緩存以外,對於SQL查詢語句自己也有解析緩存,就是把SQL語句給緩存下來,下次執行就不須要再解析了。固然,若是使用了查詢緩存自己,因爲已經將內容緩存,因此解析緩存基本上用的較少。
四.靜態緩存
所謂靜態緩存,就是第一次訪問PHP時生成一個純靜態文件。當第二次訪問時,就直接訪問這個靜態文件。特別適合相似於CMS系統這種頁面狀態變化較少的程序。
配置文件設置靜態緩存:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //'配置項'=>'配置值' //全局配置定義 'DB_TYPE'=>'mysql', //數據庫類型 'DB_HOST'=>'127.0.0.1', //服務器地址 'DB_NAME'=>'thinkphp', //數據庫名 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PORT'=>3306, //端口 'DB_PREFIX'=>'think_', //數據庫表前綴 //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題目錄 'DEFAULT_THEME'=>'default', //開啓靜態緩存 'HTML_CACHE_ON'=>true, //全局緩存過時時間60秒 'HTML_CACHE_TIME'=>60, //緩存的後綴 'HTML_FILE_SUFFIX'=>'.html', //緩存規則 'HTML_CACHE_RULES'=>array( //User控制器:index方法 //模塊_控制器_方法_ID,局部60秒 'User:index'=>array('{:module}_{:controller}_{:action}_{id}',60), ), );
控制器部分訪問:
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { $user = D('User'); $list = $user->select(); $this->assign('list', $list); $this->display(); } }
生成的頁面緩存放在:ThinkPHP\Weibo\Html\Home_User_index_.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Insert title her</title> </head> <body> <table border="1"> <tr><th>id</th><th>user</th><th>email</th></tr> <tr><td>1</td><td>用戶西西1</td><td>xixi1@xixi.com</td> </tr><tr><td>2</td><td>用戶西西2</td><td>xixi2@xixi.com</td> </tr><tr><td>3</td><td>用戶西西3</td><td>xixi3@xixi.com</td> </tr><tr><td>4</td><td>用戶西西4</td><td>xixi4@xixi.com</td> </tr></table> <p></p> </html>
除了上面的緩存規則,還有其餘的緩存規格選擇:
//方法名
'index'=>array('{id}', 60),
//控制器: //User目錄下的 方法_ID
'User:'=>array('User/{:action}_{id}', 60),
//控制器名:方法名
'User:index'=>array('{id}', 60),
//將當前地址加密做爲文件名
'*'=>array('{$_SERVER.REQUEST_URI|md5}'),
ThinkPHP--視圖--調試方法
ThinkPHP的調試方法,包括各類調試配置和方法。
一.調試模式
ThinkPHP專門爲開發過程而設置了調試模式,調試模式開啓後,特別方便咱們進行排錯和調整。但因爲它執行效率會稍低,因此在正式部署項目的時候,關閉調試模式。
// 入口文件處,開啓調試模式 建議開發階段開啓 部署階段註釋或者設爲false
define('APP_DEBUG',true);
調試模式在開發中的優點在於:
1.開啓日誌記錄,任何錯誤和調試信息都會詳細記錄;
2.關閉模版緩存,模版修改能夠及時生效;
3.記錄SQL日誌,方便分析SQL;
4.關閉字段緩存,數據表字段修改不受緩存影響;
5.嚴格檢查文件大小寫,幫助提早發現Linux部署問題;
6.經過頁面Trace功能更好的調試和發現問題。
二.異常處理
和PHP默認的異常處理不一樣,ThinkPHP拋出的不單純的錯誤信息,而是一我的性化的錯誤頁面。固然,咱們也能夠自行調用這種錯誤信息。
User控制器部分設置手動拋出異常
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { //手動拋出異常 E('失敗!'); } }
失敗!
錯誤位置
三.模型調試
在模型操做中,爲了更好的查明錯誤,常常須要查看下最近使用的SQL語句。
User控制器部分設置獲取最近一次執行的SQL語句
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { $user = D('User'); $list = $user->select(); //獲取最近的SQL語句 echo $user->getLastSql(); } }
User控制器部分設置查看SQL的錯誤信息
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { $user = D('User'); $list = $user->select(); //查看SQL的錯誤信息 $list = $user->query("SELECT * FROM bbb"); echo $user->getDbError(); } }
訪問:http://localhost/ThinkPHP/index.php/Home/User/index/
1146:Table 'thinkphp.bbb' doesn't exist [ SQL語句 ] : SELECT * FROM bbb
四.性能調試
咱們可使用大G()方法,來測試某段代碼的內存開銷和運行時間。
User控制器部分設置計算運行時間和計算消耗內存
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; //User控制器部分 class UserController extends Controller { public function index() { //包裹要測試的代碼 G('begin'); $user = D('User'); $list = $user->select(); $this->assign('list', $list); $this->display(); G('end'); //計算運行時間,單位秒 echo G('begin','end').'s'; echo '<br />'; //計算消耗內存,單位kb echo G('begin','end','m').'kb'; } }
執行http://localhost/ThinkPHP/index.php/Home/User/index/返回:
0.0270s
856kb
注意:若是你的環境不支持內存消耗測試,它會自動按時間運算。
五.變量調試
在開發中,咱們常常須要對變量進行調試。通常會採用PHP自帶的var_dump()和print_r方法,ThinkPHP內置了一個對瀏覽器友好的dump()方法,用於輸出變量信息。
User控制器部分設置dump()方法,輸出變量信息
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Page; class UserController extends Controller { public function index() { $user = D('User'); $list = $user->select(); //參數1必選,其餘可選 dump($list, true, null, false); //參數1爲變量,參數2爲是否打印,參數3標識,參數4是否採用print_r $this->assign('list', $list); $this->display(); } }
六.日誌記錄
日誌處理是系統自動進行的,在開啓日誌記錄的狀況下,會記錄下運行的日誌級別的全部日誌信息。
通常狀況下,SQL日誌級別必須在調試模式下開啓有效,不然不會記錄。默認狀況下,通常在調試模式下記錄日誌,若是要在部署模式下開啓日誌記錄,則須要進行配置。
ThinkPHP對系統的日誌按照級別來分類,包括:
1.EMERG嚴重錯誤,致使系統崩潰沒法使用
2.ALERT警惕性錯誤, 必須被當即修改的錯誤
3.CRIT臨界值錯誤, 超過臨界值的錯誤
4.ERR通常性錯誤
5.WARN警告性錯誤, 須要發出警告的錯誤
6.NOTICE通知,程序能夠運行可是還不夠完美的錯誤
7.INFO信息,程序輸出信息
8.DEBUG調試,用於調試信息
9.SQL SQL語句,該級別只在調試模式開啓時有效
配置文件部分設置運行的日誌記錄級別:ThinkPHP\Weibo\Common\Conf\config.php
<?php return array( //'配置項'=>'配置值' //全局配置定義 'DB_TYPE'=>'mysql', //數據庫類型 'DB_HOST'=>'127.0.0.1', //服務器地址 'DB_NAME'=>'thinkphp', //數據庫名 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PORT'=>3306, //端口 'DB_PREFIX'=>'think_', //數據庫表前綴 //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置默認主題目錄 'DEFAULT_THEME'=>'default', //運行的日誌記錄級別 'LOG_LEVEL' =>'EMERG,ALERT,CRIT,ERR', );
User控制器部分添加手動寫入日誌方法
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Log; class UserController extends Controller { public function index() { $user = D('User'); $list = $user->select(); //手動寫入,第二參數爲級別,第三爲強制 Log::record('手動日誌','WARN',true); //不受配置文件影響(強制寫入) //Log::write('日誌','WARN'); $this->assign('list', $list); $this->display(); } }
生成日誌:ThinkPHP\Weibo\Runtime\Logs\18_04_22.log
[ 2018-04-22T16:27:09+08:00 ] 127.0.0.1 /ThinkPHP/index.php/Home/User/index/
WARN: 手動日誌
七.Track
ThinkPHP提供了一個很是方便的調試工具:頁面Track。這個工具必須在調試模式下有效
配置文件設置Track調試模式
<?php return array( //'配置項'=>'配置值' //全局配置定義 'DB_TYPE'=>'mysql', //數據庫類型 'DB_HOST'=>'127.0.0.1', //服務器地址 'DB_NAME'=>'thinkphp', //數據庫名 'DB_USER'=>'xixi', //用戶名 'DB_PWD'=>'123456', //密碼 'DB_PORT'=>3306, //端口 'DB_PREFIX'=>'think_', //數據庫表前綴 //頁面Trace 'SHOW_PAGE_TRACE' =>true, //設置要顯示的調試模塊 'TRACE_PAGE_TABS'=>array( 'base'=>'基本', 'file'=>'文件', 'think'=>'流程', 'error'=>'錯誤', 'sql'=>'SQL', 'debug'=>'調試', 'user'=>'用戶', ), //設置默認主題目錄 'DEFAULT_THEME'=>'default', );
User控制器部分設置調試方法顯示在用戶裏
<?php namespace Home\Controller; use Think\Controller; use Home\Model\UserModel; use Think\Log; class UserController extends Controller { public function index() { $user = D('User'); $list = $user->select(); //調試方法 trace('調試方法', '提示', 'user'); $this->assign('list', $list); $this->display(); } }