在PHP中,經常會將數組作為參數進行傳遞;現在的一個需求是,首先Web程式從Request中擷取到了一些參數,比如
usernumber
,
username
,
password
等等,將這些拼裝成了一個數組,並將其作為參數,傳給
model
層並寫入資料庫。比如:
在控制器中拼裝了如下參數:
$params = [ 'number' => 1001, 'username' => 'kirineko', 'password' => '123456', 'school' => 'cmu',];Model\User::insert($params);
在模型層中寫了一個insert
方法:
public static insert($params) { $ins = new self(); foreach($params as $key => $value) { $ins->{$key} = $value; } $ins->save();}
但是目前的問題在於,如果我在傳遞參數時,傳遞的數組索引,在資料庫中並沒有,比如上述傳遞的school
,在資料庫中就並沒有這個欄位;並比如資料庫中需要傳入age
的值,上述資料中卻並沒有傳遞。上述這些情況都會造成資料庫寫入失敗。
現在我的解決方案是,在insert方法中,對傳入的資料參數進行過濾,方法如下:
public static insert($params) { $ins = new self(); $filters = ['number','username','password','age']; $real_params = []; foreach ($filters as $filter) { if(isset($params[$filter])) { $invite_params[$filter] = $params[$filter]; } } foreach($invite_params as $key => $value) { $ins->{$key} = $value; } $ins->save();}
通過過濾,把數組中合法的輸入賦給了另外一個數組。但是這種方法是在是太麻煩了。請問有沒有更好的方法實現這個功能呢?
回複內容:
在PHP中,經常會將數組作為參數進行傳遞;現在的一個需求是,首先Web程式從Request中擷取到了一些參數,比如usernumber
,username
,password
等等,將這些拼裝成了一個數組,並將其作為參數,傳給model
層並寫入資料庫。比如:
在控制器中拼裝了如下參數:
$params = [ 'number' => 1001, 'username' => 'kirineko', 'password' => '123456', 'school' => 'cmu',];Model\User::insert($params);
在模型層中寫了一個insert
方法:
public static insert($params) { $ins = new self(); foreach($params as $key => $value) { $ins->{$key} = $value; } $ins->save();}
但是目前的問題在於,如果我在傳遞參數時,傳遞的數組索引,在資料庫中並沒有,比如上述傳遞的school
,在資料庫中就並沒有這個欄位;並比如資料庫中需要傳入age
的值,上述資料中卻並沒有傳遞。上述這些情況都會造成資料庫寫入失敗。
現在我的解決方案是,在insert方法中,對傳入的資料參數進行過濾,方法如下:
public static insert($params) { $ins = new self(); $filters = ['number','username','password','age']; $real_params = []; foreach ($filters as $filter) { if(isset($params[$filter])) { $invite_params[$filter] = $params[$filter]; } } foreach($invite_params as $key => $value) { $ins->{$key} = $value; } $ins->save();}
通過過濾,把數組中合法的輸入賦給了另外一個數組。但是這種方法是在是太麻煩了。請問有沒有更好的方法實現這個功能呢?
使用 ORM
吧,騷年!
ORM:不管你傳入多少欄位,我只 插入 | 更新
咱倆的 交集欄位
。
不需要的school為什麼要傳進去……
寫個私人屬性, 比如$_allow, 再來個私人屬性$_requiere,allow 就是允許的欄位, require 是必須的欄位,每次curd 的時候,把要操作的欄位和 allow比較一下,用 array_diff,如果有不同的欄位 ,throw 一個 exception,貌似以前大家都是這麼乾的吧 , 先進點的去看 tp, 或者是 yii2,因為你的問題,如果用架構的話是不用考慮的,架構已經都幫你弄好了,你用架構提供的方法就可以了
通常這個東西是這樣處理的,如果一個對象是一個資料表的映射的話,那麼它在初始化的時候會去讀取資料表的結構,但是如果每次都載入表結構影響效能,所以會把表結構資訊緩衝起來,即總是從緩衝載入資料表結構,同時提供一個專門的功能用來清除該緩衝。
這些表結構資訊可以:
1- 通過欄位名實現資料過濾
2- 實現簡單的有效性檢查,如非空檢查、數字檢查、長度檢查等
3- 表單輔助產生等
可以把資料表欄位列表查出來
mysql> select COLUMN_NAME from information_schema.`COLUMNS` where TABLE_NAME='XXX';
你這種處理方法, 低效且不安全, 建議使用 ORM 的方案.
寫個輔助函數處理 PHP進階過濾器