如何在数据库中存储PHP条件语句供以后使用?

时间:2011-08-29 11:57:53

标签: php conditional-statements

在我们当前的应用程序中,我有一个包含以下内容的报告:

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())

如果没有面向用户的接口写入条件字段/表,它会有什么不同(更安全)吗?这可能是我们单独管理的事情。

3 个答案:

答案 0 :(得分:3)

我会非常小心地将逻辑存储在数据库中。

  1. 您的代码不再在一个地方。
  2. 数据库中的逻辑不太可能受源代码控制
  3. 如果您更改代码并破坏所有客户端特定逻辑,则必须返回数据库并为每个客户端编辑它。
  4. 其他人可以访问数据库,并可能将代码更改为恶意代码。
  5. 这可能不是最好的解决方案 但我建议创建一个抽象基类,然后从中继承一个特定于每个客户端的类。

    任何自定义的函数都可以作为方法添加到基类中,并覆盖客户端特定的实现。

    使用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
    }
    

答案 1 :(得分:2)

详细说明我的评论:

你最后的代码几乎就是我的意思:

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

但是我会再次警告你要记住这样做的风险。 当您使用数据库中的代码时,可能存在错误。 至少应对数据进行一些安全检查,以避免误用。

另一个更复杂但不容易被滥用的选择是对条件进行编码。因为您似乎只将两个变量与一个值进行比较,每个变量可以为每个变量保存,如:

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

保存关系并另外保存应与之比较的值。这样就不会直接执行保存在数据库中的代码。

答案 2 :(得分:0)

没有人能告诉你如何解决它,因为没有人知道你的应用程序的功能要求和具体逻辑......但是如果实施时间对你很重要,你可以尝试使用数据库中的表达式评估,但要小心,使用来自数据库的所有数据的清理......有一个例子how to make php expressions and execute from database? - 你只需添加更多逻辑,因为你可以有多个条件