带有 PHP eval() 的错误消息评估系统
error message evaluation system with PHP eval()
我正在尝试一个错误消息评估系统,但我无法让它正常工作以评估系统。
你能看出它有什么问题吗?
$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;
}
这个错误数组是空的,即使我输入了我知道的数据应该触发它变成一个错误??!
来自 PHP 文档:
eval() returns NULL unless return is called in the evaluated code, in which case the value passed to return is returned. As of PHP 7, if there is a parse error in the evaluated code, eval() throws a ParseError exception. Before PHP 7, in this case eval() returned FALSE and execution of the following code continued normally. It is not possible to catch a parse error in eval() using set_error_handler().
http://php.net/manual/en/function.eval.php
将 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.'
);
我正在尝试一个错误消息评估系统,但我无法让它正常工作以评估系统。
你能看出它有什么问题吗?
$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;
}
这个错误数组是空的,即使我输入了我知道的数据应该触发它变成一个错误??!
来自 PHP 文档:
eval() returns NULL unless return is called in the evaluated code, in which case the value passed to return is returned. As of PHP 7, if there is a parse error in the evaluated code, eval() throws a ParseError exception. Before PHP 7, in this case eval() returned FALSE and execution of the following code continued normally. It is not possible to catch a parse error in eval() using set_error_handler().
http://php.net/manual/en/function.eval.php
将 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.'
);