我有一个错误,发生这个错误的原因是我更改了$item
名称,因为我希望它是大写的。我已经为我的大部分代码做了这件事,但由于某种原因,我在这里做这件事遇到了一些麻烦。
这是代码:
public function check($source, $items = array()) {
foreach($items as $item => $rules) {
foreach($rules as $rule => $rule_value) {
$value = $source[$item];
$item = escape($item);
if ($rule === 'required' && empty($value)) {
$error = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($error) . " is required");
} else if(!empty($value)){
switch($rule) {
case 'min':
if(strlen($value) < $rule_value) {
$this->addError(ucfirst($item) . " must be a minimum of {$rule_value} characters.");
}
break;
case 'max':
if(strlen($value) > $rule_value) {
$this->addError(ucfirst($item) . " must be a maximum of {$rule_value} characters.");
}
break;
case 'matches':
if($value != $source[$rule_value]) {
$item = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($item) . ' does not match ' . $rule_value);
}
break;
case 'unique':
$check = $this->_db->get('*', $rule_value, array($item, '=', $value));
if ($check->count()){
$this->addError(ucfirst($item) . ' is already in use!');
}
break;
}
}
}
}
if(empty($this->_errors)) {
$this->_passed = true;
}
return $this;
}
有问题的代码是:
if ($rule === 'required' && empty($value)) {
$item = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($item) . " is required");
}
我试图使它输出Password again is required
而不是password_again is required
。switch($rule)
语句中的所有内容都正常工作,但正如我所说,我不知道为什么它在特定行不起作用。有人有主意吗?
精确错误:Notice: Undefined index: password confirm in C:'xampp'htdocs'classes'Validate.php on line 13
。
我的想法:
- 通知的压制。这很好,但如果能解决的话,我真的很喜欢
代码请求[Source&Item]:
$validation = $validate->check($_POST, array(
'email' => array(
'required' => true,
'min' => 7,
'max' => 64,
'unique' => 'users'
),
'password' => array(
'required' => true,
'min' => 7,
'max' => 32
),
'password_confirm' => array(
'required' => true,
'matches' => 'password'
)
));
无功转储结果:
string(5) "email"
Notice: Undefined property: Validate::$addError in C:'xampp'htdocs'classes'Validate.php on line 18
NULL string(8) "password"
Notice: Undefined property: Validate::$addError in C:'xampp'htdocs'classes'Validate.php on line 18
NULL string(16) "password confirm"
Notice: Undefined property: Validate::$addError in C:'xampp'htdocs'classes'Validate.php on line 18
NULL
Notice: Undefined index: password confirm in C:'xampp'htdocs'classes'Validate.php on line 13
新工作代码:
if ($rule === 'required' && empty($value)) {
$error = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($error) . " is required");
}
您缺少一个空复选框,这就是为什么当电子邮件、密码或password_confirm丢失时会显示通知的原因:
if( !empty( $source[$item] ) )
{
$value = $source[$item];
$item = escape($item);
if ($rule === 'required' && empty($value)) {
$item = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($item) . " is required");
} else if(!empty($value)){
switch($rule) {
case 'min':
if(strlen($value) < $rule_value) {
$this->addError(ucfirst($item) . " must be a minimum of {$rule_value} characters.");
}
break;
case 'max':
if(strlen($value) > $rule_value) {
$this->addError(ucfirst($item) . " must be a maximum of {$rule_value} characters.");
}
break;
case 'matches':
if($value != $source[$rule_value]) {
$item = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($item) . ' does not match ' . $rule_value);
}
break;
case 'unique':
// $check = $this->_db->get('*', $rule_value, array($item, '=', $value));
if ( 1 == 1 ){
$this->addError(ucfirst($item) . ' is already in use!');
}
break;
}
}
}
else
{
$this->addError( $item . ' cannot be empty!' );
break;
}
我推荐一个更简单的解决方案。
根据请求进行完全复制:
function escape( $sValue )
{
return trim( $sValue );
}
class test
{
public $aErrors = array();
public function addError( $sError )
{
$this->aErrors[] = $sError;
}
public function check($source, $items = array()) {
foreach($items as $item => $rules) {
foreach($rules as $rule => $rule_value) {
if( !empty( $source[$item] ) )
{
$value = $source[$item];
$item = escape($item);
if ($rule === 'required' && empty($value)) {
$item = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($item) . " is required");
} else if(!empty($value)){
switch($rule) {
case 'min':
if(strlen($value) < $rule_value) {
$this->addError(ucfirst($item) . " must be a minimum of {$rule_value} characters.");
}
break;
case 'max':
if(strlen($value) > $rule_value) {
$this->addError(ucfirst($item) . " must be a maximum of {$rule_value} characters.");
}
break;
case 'matches':
if($value != $source[$rule_value]) {
$item = str_replace(array('_'), ' ', $item);
$this->addError(ucfirst($item) . ' does not match ' . $rule_value);
}
break;
case 'unique':
// $check = $this->_db->get('*', $rule_value, array($item, '=', $value));
if ( 1 == 1 ){
$this->addError(ucfirst($item) . ' is already in use!');
}
break;
}
}
}
else
{
$this->addError( $item . ' cannot be empty!' );
break;
}
}
}
}
}
$_POST[ 'email' ] = '';
$_POST[ 'password' ] = '';
$_POST[ 'password_confirm' ] = '';
$aValidation = $cTest->check( $_POST,
array( 'email' => array( 'required' => true, 'min' => 7, 'max' => 64, 'unique' => 'users' ),
'password' => array( 'required' => true, 'min' => 7, 'max' => 32 ),
'password_confirm' => array( 'required' => true, 'matches' => 'password' ) ));
var_dump( $cTest->aErrors );
var_dump( $aValidation );