在没有未声明变量错误的情况下设置变量数据的样式


Styling a variable data without undeclared variable error

我有一个错误,发生这个错误的原因是我更改了$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 requiredswitch($rule)语句中的所有内容都正常工作,但正如我所说,我不知道为什么它在特定行不起作用。有人有主意吗?

精确错误:Notice: Undefined index: password confirm in C:'xampp'htdocs'classes'Validate.php on line 13

我的想法:

  1. 通知的压制。这很好,但如果能解决的话,我真的很喜欢

代码请求[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 );
相关文章: