簡體   English   中英

如何在數據庫中存儲PHP條件文件以供以后使用?

[英]How can I store a PHP conditional staement in the database for later use?

在我們當前的應用程序中,我有一個包含以下內容的報告:

if($foo == 3 || $bar > 3) {
    $e = someFunction();
};

但對於同一表達式可能是不同的客戶端:

if($foo == 3 || $bar == 5 && $foobar != 9) {
    $e = someFunction();
};

有沒有一種直接的方式來存儲兩個不同的表達式,只有

$foo == 3 || $bar > 3 OR $foo == 3 || $bar == 5

數據庫中的位(MySQL)所以我不必通過客戶端硬編碼所有這些規則或維護同一報告的客戶端版本。 我試圖找出是否可以設置變量o替換條件。 就像是:

$conditions = $row_rsConditions['condition_row']    //Get $foo == 3 || $bar > 3 from the DB and store it as $conditions
if($conditions) {
    $e = someFunction();
};

可能有> 100個不同的客戶端,每個客戶端可能/將有一組不同的表達式。 我只是不確定這樣做的正確/最佳方式。

更新

我想我使用PHP的eval()函數理解這些問題。 但由於可能的組合數量,我傾向於使用DB來存儲條件(不確定是否還在使用eval())

如果沒有面向用戶的接口寫入條件字段/表,是否會產生任何差異(更安全)? 這可能是我們單獨管理的事情。

我會非常小心地將邏輯存儲在數據庫中。

  1. 你的代碼不再是一個地方。
  2. 數據庫中的邏輯不太可能受源代碼控制
  3. 如果更改代碼並中斷所有特定於客戶端的邏輯,則必須返回數據庫並為每個客戶端編輯它。
  4. 其他人可以訪問數據庫,並可能將代碼更改為惡意代碼。

這可能不是最好的解決方案,但我建議創建一個抽象基類,然后從中繼承一個特定於每個客戶端的類。

任何自定義的函數都可以作為方法添加到基類,並覆蓋客戶端特定的實現。

使用switch語句根據您已存儲在數據庫中的客戶端ID或名稱(不會更改的內容)實例化該類。

switch ($client_name) {

case "abc ltd":
   $customlogic = new CustomLogicAbc();
   break;

case "zyx ltd":
   $customlogic = new CustomLogicXyz();
   break;

default: 
   $customlogic = new CustomLogicDefault();
   break;

}

if ($customlogic->doSomething($parm1, $parm2)) {
  // custom logic has been applied
}

詳細說明我的評論:

你的最后一個代碼幾乎就是我的意思:

$conditions = $row_rsConditions['condition_row'];    //Get "$foo == 3 || $bar > 3"
if(eval("return (" . $conditions . ");")) {
    $e = someFunction();
}

但是我會再次警告你要記住這樣做的風險。 當您使用數據庫中的代碼時,可能存在錯誤。 至少應對數據進行一些安全檢查以避免濫用。

另一個選項有點復雜但不容易被誤用,就是對條件進行編碼。 因為您似乎只將兩個變量與一個值進行比較,每個變量可以為每個變量保存,例如:

0 !=
1 ==
2 >=
3 <=
4 >
5 <

保存關系並另外保存應與之比較的值。 這樣就不會直接執行保存在數據庫中的代碼。

沒有人可以告訴你如何解決它,因為沒有人知道你的應用程序的功能要求和具體邏輯...但是如果實施時間對你很重要,你可以嘗試使用數據庫中的表達式評估,但要小心並使用sanitazing of來自數據庫的所有數據...有一個例子如何制作php表達式並從數據庫執行? - 你只需添加更多邏輯,因為你可以有多個條件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM