官方文件
https://www.kancloud.cn/manual/thinkphp/16...
大寫字母的用法
- A函式用於例項化控制器
- 格式:[資源://][模組/]控制器 A($name,$layer='',$level='')
@param string $name 資源地址 @param string $layer 控制層名稱 @param integer $level 控制器層次 @return Controller|false
B執行某個行為 B($name,$tag='',&$params=NULL)
@param string $name 行為名稱 @param string $tag 標籤名稱(行為類無需傳入) @param Mixed $params傳入的引數 @return void
這是隨著行為應運而生的新生函式,可以執行某個行為,例如B('app_begin');
就是在專案開始之前,執行這個行為定義的所有函 數,支援2個引數,第二個引數支援需要接受一個陣列
例如
B('app_begin',array("name"=>"tdweb","time"=>time()));
C 讀取及設定配置引數C($name=null,$value=null,$default=null)
@paramstring|array $name 配置變數 @param mixed $value 配置值 @param mixed $default 預設值 @return mixed
獲取值:
- 獲取所有設定:C(); 不傳遞任何引數,返回一個包含所有設定的陣列。
- 獲取指定配置:C('URL_MODEL') 這樣就能得到URL_MODEL的配置資訊
- 獲取指定二維陣列配置:C("array.name"),這樣就返回陣列array下的key為name所對應的值
設定值:
- 為二維陣列賦值C("array.name","value"),原理同上(獲取array.name的值),後邊的value是值
- 批量賦值:
$test=array("URL_MODEL"=>1,"THIN_MODEL"=>true"); C($test); 這樣直接將陣列裡的值賦值了
判斷是否賦值:
C("?URL_MODEL")這樣前邊加個"?",如果已經賦值,則返回true
需要說明的是,這裡雖然更改了配置的值,但是僅僅是這個頁面做了更改,到下個頁面就不起作用了,
如果想改就永久更改,那麼需要配合F函式,將配置檔案寫入config.PHP才行。
D函式用於例項化模型類格式 [資 源://][模組/]模型 D($name='',$layer='')
@param string $name 資源地址 @param string $layer 模型層名稱 @return Model
D函式有2個優點:
- 一是如果之前例項化過這個Model,那麼就不再例項化了,省資源;
- 二是方便除錯,如果不存在 這個Model,會丟擲TP異常,非常人性化。
如果訪問本專案的Model直接D("Model名稱");就可以了,如果打算跨專案訪問,就使用 D("Model名稱","專案名稱");
E丟擲異常處理 E($msg, $code=0)
@param string $msg異常訊息 @param integer $code 異常程式碼預設為0 @return void
F快速檔案資料讀取和儲存針對簡單型別資料字串、陣列 F($name, $value='',$path=DATA_PATH)
@param string $name 快取名稱 @param mixed $value 快取值 @param string $path 快取路徑 @return mixed
- 快速儲存資料:F("mydata","這裡是要儲存的資料"),這樣就在專案Data目錄下儲存了一個名叫mydata.php的檔案,裡邊的內容是該函式的第二個引數。
- 指定儲存時間 :F("mydata","這裡是要儲存的資料","60"),這樣,如果下次再訪問,間隔大於60秒則刪除次快取檔案。
- 指定儲存目錄:F("mydata","這裡是要儲存的資料","60",DATA_PATH) ,這樣就指定儲存在data目錄下
- 立即刪除快取:F("mydata",null),第二個引數傳遞一個null值,這樣就刪除了mydate這個快取
- 讀取快取資料:F("mydata"),這樣就讀取這個快取了
G記錄和統計時間(微秒)和記憶體使用情況
G($start,$end='',$dec=4)
使用方法:
G('begin'); // 記錄開始標記位 // ... 區間執行程式碼 G('end'); // 記錄結束標籤位 echo G('begin','end',6); //統計區間執行時間精確到小數後6位 echo G('begin','end','m'); // 統計區間記憶體使用情況 如果end標記位沒有定義,則會自動以當前作為標記位
其中統計記憶體使用需要 MEMORY_LIMIT_ON 常量為true才有效
@param string $start 開始標籤 @param string $end 結束標籤 @paraminteger|string $dec小數位或者m @return mixed
I獲取輸入引數支援過濾和預設值
I($name,$default='',$filter=null)
使用方法:
I('id',0); //獲取id引數自動判斷get或者post I('post.name','','htmlspecialchar s'); //獲取$_POST['name'] I('get.'); //獲取$_GET
L()獲取和設定語言定義(不區分大小 寫)
L($name=null,$value=null)
@paramstring|array $name 語言變數 @param mixed $value 語言值或者變數 @return mixed
語言定義函式,L("intro")獲取定義成intro的語言,l("intro","介紹")為intro賦值
M函式用於例項化一個沒有模型檔案的Model
M($name='',$tablePrefix='',$connection='')
@param string $name Model名稱支援指定基礎模型例如MongoModel:User @param string $tablePrefix表字首 @param mixed $connection 資料庫連線資訊 @return Model
N設定和獲取統計資料
N($key,$step=0,$save=false)
使用方法:
N('db',1); // 記錄資料庫操作次數 N('read',1); // 記錄讀取次數 echo N('db'); // 獲取當前頁面資料庫的所有操作次數 echo N('read'); // 獲取當前頁面讀取次數
@param string $key 標識位置 @param integer $step 步進值 @return mixed
R遠端呼叫控制器的操作方法 URL 引數格式 [資源://][模組/]控制器/操作
R($url,$vars=array(),$layer='')
@param string $url呼叫地址 @paramstring|array $vars呼叫引數支援字串和陣列 @param string $layer 要呼叫的控制層名稱 @return mixed
T獲取模版檔案格式資源://模組@ 主題/控制器/操作
T($template='',$layer='')
@param string $name 模版資源地址 @param string $layer 檢視層(目錄)名稱 @return string
U()URL組裝支援不同URL模式
U($url='',$vars='',$suffix=true,$domain=false)
@param string $url URL表示式,格式:'[模組/控制器/操作#錨點@域名]?引數1=值1&引數2=值2...' @paramstring|array $vars傳入的引數,支援陣列和字串 @param string $suffix 偽靜態字尾,預設為true表示獲取配置值 @paramboolean $domain 是否顯示域名 @return string
使用方法:
- 取得當前模組的Action地址 :U("/nowMethod");
- 取得當前模組的Action地址,並傳遞引數:U("/nowMethod?params=test");
- (如果不習慣上邊那種方式,可以使用U("/nowMethod",array("params"=>"test");這樣的陣列方式傳遞引數,效果是一樣的)
- 訪問其他模組的方法:U("Other/otherMethod"),這樣就是訪問Other模組下的otherMethod方法
跨專案訪問:
U("appname://Other/otherMethod");
使用路由訪問:
U("appName://routeName@moduleName/actionName?params");
另外,如果想直接跳轉,那麼就在第二個引數寫1
U("/nowMethod",1)
這樣就直接調轉到指定URL了
W渲染輸出Widget
W($name,$data=array())
@param string $name Widget名稱 @param array $data 傳入的引數 @return void
S快取管理
S($name,$value='',$options=null)
@param mixed $name 快取名稱,如果為陣列表示進行快取設定 @param mixed $value 快取值 @param mixed $options 快取引數 @return mixed
- 全域性快取讀寫函式,和C類似,不過是直接寫成檔案,寫在Temp目錄下,不過在快取有一點需要注意,
- 如果快取名稱是aaa,那麼快取生成的檔名稱就是md5("aaa")的值。
技術
防止xss攻擊
簡單的防止
當網站不涉及複雜的使用者互動時,可以對使用者所有提交的文字進行htmlspecialchars函式處理。
- 版本為:3.2
- 步驟:
- 一:在專案配置檔案中新增配置: 'DEFAULT_FILTER' => 'htmlspecialchars', //預設過濾函式
- 二: 使用框架帶的I方法獲取來自使用者提交的資料;
-
例子
M('Member')->save(array('content'=>I('post.content')));
對COOKIE進行IP繫結
- cookie的資訊一但被別人通過XSS攻擊獲取後也一樣等同於把自己的帳號密碼給了別人。
- 對cookie進行IP繫結,(當然也可以獲取使用者客戶端更多的其它資訊進行同時繫結)可以根據使用者的IP來判斷這個cookie是不是來原始授權使用者。
示例
- 使用者設定了自動登入時儲存自動登入資訊:
$auto=I('post.auto');//使用者設定了自動登入 if(!empty($auto)){ cookie('auto',encrypt(serialize($data)));//將登入資訊儲存到cookie,其中$data裡含有加密後的帳號,密碼,和使用者的IP,這裡的cookie已在全域性中設定過期日期為一週 }
- 使用者關閉瀏覽器再次訪問網站時,進行自動登入
if (!is_login()) {//是否未登入狀態? $auth=cookie('auto'); if(!empty($auth)){//是否未有自動登入cookie? $data=unserialize(decrypt($auth)); if(!empty($data) && !empty($data['username']) && !empty($data['password']) && !empty($data['last_login_ip'])){ $user=M('Member')->where(array('username'=>$data['username'],'password'=>$data['password']))->find(); if(!empty($user['id'])&&($user['last_login_ip']==get_client_ip())){//cookie帳號密碼是否有效?//IP來源是否相同? login_session($user['id'], $user['username'], $data['last_login_ip']);//使用者自動登入成功 } } } }
- 優點:大多數場景下可使被XSS攻擊盜取的cookie失效。
- 缺點:由於IP存在多臺電腦共用的可能,對繫結做不到十分精細
為COOKIE新增httponly配置
可以保證cookie只在http請求中被傳輸,而不被頁面中的指令碼獲取,現市面上絕大多數瀏覽器已經支援。
HTML5的新特性:
<iframe src="http://alibaba.com" sandbox>
為iframe的增加的sandbox屬性,可以防止不信任的Web頁面執行某些操作.相信這個方法以後會被廣泛使用。
富文字過濾
官方文件
技術
簡單的使用
model
<?php
namespace app\admin\model;
use think\Model;
class Auth extends Model
{
protected $table = 'auth'; //設定表名
}
server
logic
api
<?php
namespace app\admin\server\logic\api;
interface index
{
public function index(); //定義方法
}
<?php
namespace app\admin\server\logic;
use app\admin\server\logic\api\index;
use app\admin\model\Auth;
//使用類來實現介面
class Show implements index
{
public function index()
{
$auth = Auth::where('id', '>', 0)->select()->toArray(); //呼叫model返回資料並轉化為陣列格式
return $auth;
}
}
Facade
<?php
namespace app\admin\server\Facade;
use think\Facade;
class Admin extends Facade
{
protected static function getFacadeAccessor()
{
return app\admin\server\logic\Show::class; //返回類例項
}
}
app下的common應用公共檔案
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------
// 應用公共檔案
use think\Loader;
use think\Facade;
// 門面繫結,定義的門面類,自動化要實現的類
Facade::bind(
[
app\admin\server\Facade\Admin::class => app\admin\server\logic\Show::class,
]
);
//給一個定義的門面類起別名
Loader::addClassAlias([
'Admins' => app\admin\server\Facade\Admin::class,
]);
traits
api 定義介面返回的資料
<?php
namespace app\admin\server\traits\api;
trait AdTrait
{
public function adfrom($data = '')
{
return array_map(function ($data) {
return $data;
}, $data);
// return array_map(function ($data) {
// return $data = [
// "Id" => $data['Id'],
// "type_name" => $data["type_name"],
// "pid" => $data["pid"],
// ];
// }, $data);
}
}
mes 定義返回的json格式
<?php
namespace app\admin\server\traits\mes;
trait Apimessages
{
public function backSuccessMsg($goods, $SuccessStatus, $falseStatus)
{
if ($goods) {
return json_encode([
'status' => 'success',
'status_code' => $SuccessStatus,
'msg' => '呼叫成功',
'data' => ["goods" => $goods]
]);
} else {
return json_encode([
'status' => 'false',
'status_code' => $falseStatus,
'msg' => '呼叫失敗',
]);
}
}
}
controller
<?php
namespace app\admin\controller;
use think\Controller;
use Admins;
use \app\admin\server\traits\api\AdTrait;
use \app\admin\server\traits\mes\Apimessages;
class Indexs extends Controller
{
//呼叫自定義的Adtrait 和 Apimessages
use AdTrait;
use Apimessages;
public function index()
{
//Admins::index()獲取資料 $this->adfrom轉化定義的adfrom 資料格式
$admin = $this->adfrom(Admins::index());
//定義成功和失敗的錯誤碼
$SuccessStatus = 1000;
$FalseStatus = 1001;
//返回定義的Apimessages json格式
return $this->backSuccessMsg($admin, $SuccessStatus, $FalseStatus);
}
}
thinkphp exp的用法
在vendor表中查詢出vendor_id = vendor_f_id的資料
select * from vendor where vendor_id = vendor_f_id
但是,在thinkphp中為了程式碼的簡潔以及通用性,不考慮使用原生的方式進行sql的查詢,而是採用查詢map的方式進行查詢
$condition[ 'vendor_f_id' ] = 'vendor_id';
thinkphp在處理上述條件的時候,將其轉化為了以下程式碼:
select * from vendor where vendor_f_id = 'vendor_id'
vendor_id被當成了一個字串進行處理了
$condition``[ ``'vendor_f_id'` `] = [ ``'exp'` `, ``' = vendor_id '` `]
本作品採用《CC 協議》,轉載必須註明作者和本文連結