繁体   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