使用PHP eval()的错误消息评估系统

使用PHP eval()的错误消息评估系统,php,eval,Php,Eval,我正在尝试一个错误消息评估系统,但我无法让它正常工作,从而能够对系统进行评估 你能看出它有什么毛病吗 $errors = array(); $name = '9'; $familyname = 'family'; $user = '9user`'; $postdata = array('name' => $name,'familyname' => $familyname,'user' => $user)

我正在尝试一个错误消息评估系统,但我无法让它正常工作,从而能够对系统进行评估

你能看出它有什么毛病吗

    $errors     = array();
    $name       = '9';
    $familyname = 'family';
    $user       = '9user`';
    $postdata   = array('name' => $name,'familyname' => $familyname,'user' => $user);

    foreach($postdata as $key => $value)
    {
        switch($key)
        {
            case 'name':
                $rules = array
                (
                    'strlen($value)>1;'               => 'Your name is too short.',
                    'is_numeric(substr($value,0,1));' => 'Your name has to begin with a character.',
                    'has_specchar($value);'           => 'Your name contains illegal characters.'
                );

                foreach($rules as $rule => $error)
                {
                    if(eval($rule)) $errors[] = $error;
                }
                break;

            case 'familyname':
                break;

            case 'user':
                $rules = array
                (
                    'strlen($value)<5;'               => 'The username is too short.',
                    'is_numeric(substr($value,0,1));' => 'The username has to begin with a character.',
                    'has_specchar($value);'           => 'The username contains illegal characters.'
                );

                foreach($rules as $rule => $error)
                {
                    if(eval($rule))
                    // if(eval($rule)==1)
                    // if(eval($rule)===1)
                    // if(eval($rule)==true)
                    // if(eval($rule)===true)
                    // None of these have had an effect??!
                    {
                        $errors[] = $error;
                    }
                }
                break;

            default:
        }
    }
    print_r($errors);

    function has_specchar($x,$excludes=array())
    {

        if(is_array($excludes)&&!empty($excludes))
        {
            foreach($excludes as $exclude)
            {
                $x=str_replace($exclude,'',$x);        
            }    
        } 

        if(preg_match('/[^a-z0-9 ]+/i',$x))
        {
            return true;        
        }

        return false;

    }
$errors=array();
$name='9';
$familyname='family';
$user='9user`;
$postdata=array('name'=>$name,'familyname'=>$familyname,'user'=>$user);
foreach($postdataas$key=>$value)
{
交换机($key)
{
案例“名称”:
$rules=数组
(
“strlen($value)>1;”=>“您的名字太短了。”,
“是数字(substr($value,0,1));”=>“您的名字必须以字符开头。”,
“has_specchar($value);”=>“您的名字包含非法字符。”
);
foreach($rules as$rule=>$error)
{
如果(eval($rule))$errors[]=$error;
}
打破
案例“familyname”:
打破
案例“用户”:
$rules=数组
(

PHP文档中的“strlen($value):

eval()返回NULL,除非在求值代码中调用return,在这种情况下,返回传递给return的值。从PHP 7开始,如果求值代码中存在解析错误,eval()将抛出ParseError异常。在PHP 7之前,本例中为eval()返回FALSE,以下代码继续正常执行。无法使用set_error_handler()捕获eval()中的分析错误

return
添加到规则键似乎可以解决问题

    $rules = array
    (
        'return strlen($value)>1;'               => 'Your name is too short.',
        'return is_numeric(substr($value,0,1));' => 'Your name has to begin with a character.',
        'return has_specchar($value);'           => 'Your name contains illegal characters.'
    );

这种方法是一种非常奇特的方法,已经被遵循了数百万次,并且总是被证明是一个坏主意。一种方法不在字符串中存储代码。它效率低,不安全,并且没有必要这样做。代码和文本是两种不同的东西。不要混合使用。阿卡夏,你知道我想要实现什么了。你对如何下注有什么建议吗如何处理这种情况?正如我所说。我很高兴得到反馈。不要试图以某种方式“抽象”这些规则集。用保守的条件对它们进行编码,这样会更加健壮。如果你真的坚持使用这种奇特的东西,那么就使用动态函数或lambda,但不要使用eval()
。通过在规则键
的return strlen($value)中添加
return
解决