ThinkPHP 5.1.26 釋出,修正版本,包含安全更新
PHP/">ThinkPHP5.1.26版本釋出 —— 修正版本,包含安全更新
該版本主要修正了上一個版本的一些問題,並改進了全域性查詢範圍的支援,同時包含了一個安全更新,支援上一個版本的無縫升級。
主要更新
-
修正單一模組下註解路由無效的問題
-
改進資料庫的聚合查詢的欄位處理
-
模型類增加
globalScope
屬性定義 用於指定全域性的查詢範圍 -
模型的
useGlobalScope
方法支援傳入陣列 用於指定當前查詢需要使用的全域性查詢範圍 -
改進資料集的
order
方法對數字型別的支援 -
修正上一個版本
order
方法解析的一處BUG -
排序欄位不合法或者錯誤的時候丟擲異常
-
改進
Request
類的file
方法對上傳檔案的錯誤判斷
安全更新
本次釋出的版本,包含了一個數據庫聚合查詢的安全更新。
如果你在使用聚合查詢的時候,聚合查詢的欄位名由使用者輸入決定,可能會引發SQL%E6%B3%A8%E5%85%A5/">SQL注入,你應該儘快更新到新版本以解決安全隱患(感謝補天平臺反饋,漏洞編號QTVA-2018-875147
)。
新特性介紹
排序欄位不合法丟擲異常
之前如果有非法的排序欄位會直接忽略,新版會丟擲一個異常。
User::order('rand()')->select();
會丟擲異常
排序表示式錯誤:rand()
正確的寫法應該是
User::orderRaw('rand()')->select();
資料集的order
方法改進
資料集的order
方法現在可以更好的支援數字型別的資料排序,order
方法的第三個引數可以指定是否為數字型別(預設為數字型別進行排序)。
// 查詢使用者列表 $users = User::where('status', 1)->select(); // 對使用者列表按照score欄位降序排列 $list= $users->order('score', 'desc');
如果是需要對字串型別的欄位排序,可以使用
// 查詢使用者列表 $users = User::where('status', 1)->select(); // 對使用者列表按照name欄位升序排列 $list= $users->order('name', 'asc', false);
全域性查詢範圍改進
全域性查詢範圍之前必須通過base
方法來定義,現在可以使用在globalScope
屬性中定義查詢範圍的名稱,
<?php namespace app\index\model; use think\Model; class User extends Model { // 定義全域性的查詢範圍 protected $globalScope = ['status']; protected function scopeStatus($query) { $query->where('status',1); } }
或者使用useGlobalScope
方法傳入陣列的方式動態指定當前查詢的全域性查詢範圍。
User::useGlobalScope(['status'])->select();
useGlobalScope
方法的資料會覆蓋globalScope
屬性定義,但如果傳入空的陣列,則仍然會獲取globalScope
屬性定義的全域性查詢範圍。
Request
類的file
方法改進
如果你要獲取的上傳檔案有任何的上傳錯誤情況,系統會丟擲一個異常,而不是返回一個Null
。
try { $image = $request->file('image'); } catch (\Exception $e){ // 上傳發生錯誤 echo $e->getMessage(); }
如果你獲取全部的上傳檔案資訊的話,即使包含上傳錯誤的資料,也不會丟擲異常,錯誤的上傳資料會被忽略。
// 如果image上傳存在錯誤,則不會包含在files資訊裡面 // 如果不希望如此結果,可以首先進行上傳驗證或者單獨獲取某個上傳檔案 $files = $request->file();