1. 程式人生 > >總結回顧---2

總結回顧---2

定時 domain 增刪改查 次數 方法 這樣的 RR 攻擊 div

(1)AR

簡介:AR模式即Active Record模式,是一個對象關系映射(ORM) 技術。每個AR 類代表一張數據表(或視圖), 數據表(或視圖)的字段在AR 類中體現為類的屬性,一個AR實例

則表示表中的。

AR模式核心:三個映射 / 對應

AR類 == 表;(模型類關聯了數據表)

AR類屬性 == 表的字段;

AR類實例 == 表的記錄;

AR模式在ThinkPHP中的典型應用:CURD操作

3個映射關系→類映射到表;屬性映射到字段;實例映射到記錄

 $result
= $model ->add();//返回新增記錄的主鍵id $result = $model ->save();//返回值為影響行數 在ThinkPHP裏,AR模式沒有查詢操作。所以這裏的查詢操作還是使用之前的select和find方法 $result = $model -> delete();

(2)Tp常見的輔助方法

原生SQL語句裏除了目前所使用的基本操作增刪改查,還有類似於group、where、order、limit等這樣的字句。

ThinkPHP封裝了相應的子句方法:封裝的方法都在父類模型Model.class.php

where 表示限制查詢的條件

limit 限制輸出的條數

filed 限制輸出的字段,也就是select id,name,age等類似語句

註意:下面兩個方法在父類模型中不存在,方法不存在會走魔術方法__call(),利用__call()方法實現一些特殊的Model方法,而group和order在鏈操作方法列表,經過__cal()方法調用。實現相應方法。除此外還有alias(別名),having(限制查詢條件),distinct(去重),filter(過濾)。

order 字段排序

group 按照指定字段進行分組查詢,案例:查詢部門表,查詢出部門名稱和出現的次數

public
function test(){ //實例化模型 $model = M(‘dept‘); //指定字段和分組 $model -> group(‘name‘); $model -> field(‘name,count(*) as count‘); // dump($model);die; //查詢 $data = $model -> select(); dump($data); }

(3)連貫操作

將輔助方法全部寫在一行上的寫法為連貫操作

語法:$model -> where() -> limit() ->order() -> field() -> select{}

中間標紅的即為輔助方法

輔助方法順序:在連貫操作裏,沒有順序要求。只要模型在頭部,CURD方法在尾部即可

(4)Tp中的統計查詢

ThinkPHP中系統封裝了以下幾個查詢方法的使用,方便後期統計的使用。以下幾個查詢方法在父類模型中不存在,都是由魔術方法__call()生成的

包含count(),max(),min(),avg(),sum()

①count() 查詢表中總的記錄數(有where時表示查詢指定條件的記錄數)

②max() 查詢某個字段的最大值

③min() 查詢某個字段的最小值

④avg() 查詢某個字段的平均值

⑤sum() 查詢某個字段的總和

(5)thinkphp模型(M)拓展

1.創建數據對象

數據對象就是父類模型中的$this->data,AR模式的底層數據操作用到了數據對象。模型實例化之前數據對象只是空數組,後來使用了魔術方法__set設置了數據對象的值。

上述流程可以得出,使用數據對象前必須先創建數據對象。__set是設置數據對象的一種方法,但是應用時不便,設置一個屬性就得設置一行代碼。

因此ThinkPHP中系統封裝了批量設置數據對象的方法:create方法

語法:$model->create();

2.自動驗證:自定義規則,

①驗證失敗:

此時提交空表單,輸出返回值dump($data);die;瀏覽器輸出false。為什麽是false?這裏我們可以看父類模型,因為這裏返回false

// 數據自動驗證
 if(!$this->autoValidation($data,$type)) return false;

②驗證成功:如果驗證成功,則返回正常數組

輸出用戶提示信息:$model->getError();

3.批量驗證

一次性驗證全部字段,需要配置成員屬性

系統支持數據的批量驗證功能,只需要在模型類裏面設置patchValidate屬性為true( 默認為false)

(6)字段映射

①映射表示對應關系

②應用場景:目前表單中的name值和數據表中的字段名一致,有一些人可能通過當前的功能和表單的name值猜測出表名字和表結構。後期可能會找到系統的漏洞,對系統進行

攻擊。系統的安全性存在威脅。因此可以使用類似障眼法,將name值隨機指定,這時name值和表字段不一致,那樣也就猜測不出表結構了。

語法:沒有語法、、、、只有規則定義$_map,與自動驗證一樣,在父類模型裏有過定義

// 查詢表達式參數
    protected $_validate        =   array();  // 自動驗證定義
    protected $_map             =   array();  // 字段映射定義

將其復制到自定義子模型定義,

(7)特殊表的實例化操作

表沒有前綴,或者表前綴不是配置文件裏定義的前綴,這些都是特殊表

實例化時會將前綴和表名自動連接起來,所以會報錯提示sp_szphp表不存在。

解決辦法:看下父類模型文件關於數據表名的定義

 // 數據表名(不包含表前綴)
  protected $tableName        =   ‘‘;
  // 實際數據表名(包含表前綴)
  protected $trueTableName    =   ‘‘;//告知系統當前模型所關聯的表的真實表名,且是已經包含前綴的表名

這裏我們選第二個,告訴ThinkPHP,這張表名已經包含前綴了,不要再加前綴。

通過父類模型屬性中的成員屬性trueTableName屬性,進行表名的指定。告知模型表名真實名字,讓其不要再關聯上前綴。

(8)會話控制

會話支持一般指cookie和session,在ThinkPHP裏為了方便開發,封裝了cookie和session方法。

1. session方法

在函數庫封裝了session方法

session(‘name‘,‘value‘) 創建一個名為name的session,值為value

$value = session(‘name‘) 讀取session中的name元素值,並賦值給變量$value

session(‘name‘,null) 刪除session中名為name元素的值

session(null) 刪除全部session值

session() 讀取全部的session信息

session(‘?name‘) 判斷名為name的session元素是否存在,存在返回true,否則返回false

cookie方法

2. 在函數庫封裝了cookie方法

cookie(‘name‘,‘value‘) 創建一個名為name的cookie,值為value

cookie(‘name‘,‘value‘,3600) 創建一個名為name的cookie,值為value,有效期為3600s

$value=cookie(‘name‘) 讀取名為name的cookie,賦值給value

cookie(‘name‘,null) 刪除名為name的cookie

cookie(null) 刪除所有,但是測試後發現無效。查看手冊,發現該方法有BUG。若想實現,則需更改底層實現代碼。需要修改底層代碼

cookie() 獲取全部的cookie

註意:若不指定時間,則session會話結束時到期。

// 清除指定前綴的所有cookie
    if (is_null($name)) {
        if (empty($_COOKIE))
            return null;
        // 要刪除的cookie前綴,不指定則刪除config設置的指定前綴
        $prefix = empty($value) ? $config[‘prefix‘] : $value;
        if (!empty($prefix) || $name == null) {// 如果前綴為空字符串將不作處理直接返回
            foreach ($_COOKIE as $key => $val) {
                if (0 === stripos($key, $prefix)||$name == null) {//函數庫1379行
                    setcookie($key, ‘‘, time() - 3600, $config[‘path‘], $config[‘domain‘],$config[‘secure‘],$config[‘httponly‘]);
                    unset($_COOKIE[$key]);
                }
            }
        }
        return null;
    }elseif(‘‘ === $name){
        // 獲取全部的cookie
        return $_COOKIE;
    }

.

總結回顧---2