PHP實現數組的白名單過濾

來源:互聯網
上載者:User
關鍵字 php
在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進階過濾器

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.