使用eval()检查变量 - 函数

时间:2017-08-19 18:38:00

标签: php eval

我有一个变量列表(var1,var2,...)。现在,我想使用几个条件检查这些变量,如果条件为真,则打印出错误消息。

由于应该进行许多“检查”,我在MySQL-DB(varchar)中保存了“条件”:

condition               errormsg
--------------------------------------------------------
$var1!=1 && $var1!=2    var1 should be 1 or 2
$var1==''               var1 is missing
$var3<0 & $var3>10      var3 should be between 0 and 10

现在我想使用eval-Function检查这些变量:

$res=mysqli_query($con, "SELECT * FROM conditions");

while($row=mysqli_fetch_object($res)){
 if(eval($row->condition))
  echo $row->errormsg;
}

这可以工作还是没有eval()有更好的解决方案?谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

很多人建议替代这个。但如果你真的需要这个,你可以这样做。我没有你的数据,所以我用自己的方式做了这个

 <?php
    $condition = "1!=1";
    //$condition = "1==1";
   $error = "test";
   eval("\$con = $condition ;");
   if($con){
   echo $error;
   }else {
  echo "not found";
  }
?>

取消注释第二行以获得另一项更改。请记住,语句应该在eval函数中完成。

现场演示:https://eval.in/847626

  

请特别注意不要在未事先验证的情况下将任何用户提供的数据传递给它。

答案 1 :(得分:0)

您的问题的常见解决方案是为变量编写验证函数。这样的函数接收变量作为参数,检查其值并返回成功或错误代码。然后调用代码使用错误代码在当前语言的本地化字符串列表中查找错误消息。

可能如下所示:

验证功能

function var1_is_valid($var1)
{
    if ($var1 == 1 || $var1 == 2) {
        return 'SUCCESS';
    } else {
        return 'ERR_VAR1_INVALID';
    }
}

function var1_is_present($var1)
{
    if ($var1 != '') {
        return 'SUCCESS';
    } else {
        return 'ERR_VAR1_MISSING';
    }
}

function var3_is_valid($var3)
{
    if (0 <= $var3 && $var3 <= 10) {
        return 'SUCCESS';
    } else {
        return 'ERR_VAR3_INVALID';
    }
}

语言文件

// Use the strings returned by the validation functions as keys in the array
$lang = array(
    'ERR_VAR1_INVALID' => 'var1 should be 1 or 2',
    'ERR_VAR1_MISSING' => 'var1 is missing',
    'ERR_VAR3_INVALID' => 'var3 should be between 0 and 10',
);

更好的是,您可以将函数var1_is_valid()var1_is_present()合并到$var1的单个验证函数中,该验证函数返回'SUCCESS'或相应的错误字符串。

语言的所有错误消息都保留在每个请求中加载的单个语言文件中。它比查询数据库中的错误消息更快。

另一种语言是指具有由相同键标识的字符串的另一个文件。您不会同时使用两种语言。最多,您在加载用户请求的语言之前加载完全实现的语言,以便为每个字符串赋值(错误语言的消息仍然比什么都好)。

答案 2 :(得分:-1)

您可以使用伪开关,无需db和eval()。简约的例子:

$var = 1;
switch(true){
    case ($var == 1):
        echo "1\n";
    case ($var != 2):
        echo "2\n";
}