首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ThinkPHP 非法資料對象錯誤:模型自動驗證與資料類型不匹配排查

     編輯:程式設計綜合問答

ThinkPHP 模型 add() 拋出「非法資料對象」,通常是傳入資料陣列包含模型未定義的欄位、或欄位值類型與資料庫定義不符 (如整數欄位傳入字串、長度超限)。

排查步驟

  1. 檢視模型定義:protected $fields = [...]; 或資料庫欄位列表,確認允許寫入的欄位。
  2. 過濾多餘欄位:
    $data = array_intersect_key($data, array_flip($model->getDbFields()));
    或控制器僅組裝白名單欄位。
  3. 類型轉換:
    整數欄位 intval($val),浮點 floatval(),日期 date('Y-m-d H:i:s', strtotime($val))。
  4. 關閉自動驗證 (臨時):
    $model->validate(false)->add($data); 若成功,說明是驗證規則問題,逐條檢查 _validate 陣列。

本案具體原因

原帖後續補充:$data['position'] = intval($footPosition) + 1; 中 $footPosition 為 null 或非數字字串,導致 intval 結果為 0,若資料庫欄位 position 設為 UNSIGNED NOT NULL 且無預設值,或模型驗證規則要求 >0,即觸發非法資料對象。註釋該行即正常,證實為此欄位值問題。

最佳實務

  • 模型定義 protected $type = ['position' => 'integer', 'create_at' => 'timestamp']; (TP5/6) 自動轉型。
  • 控制器統一用 validate 驗證器類別,而非依賴模型隱性驗證。
  • 異常時拋出具體欄位錯誤:throw new ValidateException($validate->getError())。

「非法資料對象」本質是資料未通過模型驗證/過濾,逐欄對照定義即可定位。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved