自動驗證與自動填充是在使用thinkphp時經常用到的功能,但偶爾會碰到到自動驗證與自動填充不起作用的情況,本文就thinkphp 自動驗證與自動填充無效可能的原因做一些分析並提出相應的解決辦法。
(1)create() 方法有問題
ThinkPHP 自動驗證與自動填充是在創建數據對象 create() 時實現的,因此自動驗證與自動填充無效很大程度上與 create() 有關。
create 方法語法如下:
create(mixed data, string type)
data 表示接受的數據,type 表示本次的具體操作(寫入還是更新數據)。兩個參數都可省略,data 參數省略的情況下默認為接受 $_POST 數據,而 type 默認情況下由系統自動識別。
但系統自動識別 type 是有缺陷的,當傳入的字段有主鍵字段時,系統就識別為更新操作,否則就是寫入操作。所以當主鍵字段非自動增長而是需要 SQL 寫入時,那麼自動驗證和自動填充都可能無效。
例如添加數據記錄時,如果表單中有主鍵字段或者系統中產生了主鍵字段(如錄入設備編號),那麼 ThinkPHP 就認為本次操作為更新操作,對於例如下面設定的自動驗證和填充都會略過:
protected $_validate = array(
// 新增時驗證標題唯一
array('title','','標題已經存在!',0,'unique',1),
};
// 自動填充
protected $_auto = array(
// 新增時填充時間戳
array('pubtime','time',1,'function'),
);
盡管在操作中,執行了 add() 操作將數據寫入了數據表,但這時會發現自動驗證與自動填充無效。
出現這種情況時,只需將操作類型顯式的傳入 create() 方法即可,即 create($_POST,1),告訴系統本次操作為寫入數據。另外如果傳入的數據不是 $_POST ,也要將數據當作參數傳入,如 create($_GET)。
(2)數據字段未對應
由於粗心,未對應好表單字段與數據表字段。
(3)數據表字段做了更改
在開發過程中,更改了表字段名稱,而緩存未及時更新,導致系統判斷為無效字段而被 unset 掉。所以在更改了表字段名稱之後,及時將 Runtime/Data 下的數據表緩存清除。
(4)Model 命名錯誤
Model 命名錯誤,未嚴格按照規范命名,如頭字母未大寫或粗心導致字母順序不對,多或少字母等。這等錯誤往往會直接導致模型失效,大小寫這邊特別需要注意。
(5)數據表無自增的id
就是數據表中沒有自增的id時,驗證時就會找不到需要驗證的數據,所以會失敗。
以上就是ThinkPHP自動驗證與自動填充無效可能出現的幾種原因,當出現問題時要一條一條的進行排除,相信自己一定可以找到錯誤的,當然還有一些未知的錯誤,如果您發現了另外的一種原因,請在下方留言指正。