【问题标题】:Undefined index error when submitting form [duplicate]提交表单时出现未定义的索引错误[重复]
【发布时间】:2015-11-12 07:06:44
【问题描述】:

我正忙于学习 PHP,并且一直在按照教程创建一个基本站点,您可以在其中注册并拥有用户帐户/更改密码/更新信息等等

我参与了您更改密码的工作(我在这个 Video 中大约是 6:10),我已经陷入困境。就我而言,我已经完成了他在教程中所做的一切,但是当我提交表单时,出现以下错误。请对我放轻松,因为我确定我遗漏了一个“,”或拼写错误,但对于我的生活,我找不到它。 (注意:当我提交表单时,我确实输入了我当前的密码,但我收到验证错误,说我没有。)

(更新:将这篇文章标记为重复并将我指向另一篇文章并不是很有帮助。正如我试图在上面强调的那样,我只是在学习 PHP,因此无法从帖子中找出解决方案,并且不知何故把它和我的问题联系起来。)

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_current

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_current

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_new

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_new

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_new_again

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_new_again

注意:未定义索引:第 15 行 C:\wamp\www\Movrate\classes\Validate.php 中的 password_new_again

password_current 是必需的

password_new 是必需的

password_new_again 是必需的

这是我更新密码页面的代码:

    <?php
require_once 'core/init.php';

$user = new User();

if(!$user->isLoggedIn()) {
    Redirect::to('index.php');
}

if(Input::exists()) {
    if(Token::check(Input::get('token'))) {

        $validate = new Validate();
        $validation = $validate->check($_POST, array(
            'password_current' => array(
                'required' => true,
                'min' => 6
            ),
            'password_new' => array(
                'required' => true,
                'min' => 6
            ),
            'password_new_again' => array(
                'required' => true,
                'min' => 6,
                'matches' => 'password_new'
            )
        ));

        if($validation->passed()) {
            // change of password
        } else {
            foreach($validation->errors() as $error) {
                echo $error, '<br>';
            }
        }

    }
}
?>

<form action="" method="post">
    <div class="field">
        <lable for="password_current">Current password</label>
        <input type="password" name="passsword_current" id="password_current">
    </div>

    <div class="field">
        <lable for="password_new">New password</label>
        <input type="password" name="passsword_new" id="password_new">
    </div>

    <div class="field">
        <lable for="password_new_again">New password again</label>
        <input type="password" name="passsword_new_again" id="password_new_again">
    </div>

    <input type="submit" value="Change">
    <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
</form>

这是我的验证类的代码:

<?php
class Validate {
    private $_passed= false,
            $_errors = array(),
            $_db = null;

    public function __construct() {
        $this->_db = DB::getInstance();
    }

    public function check($source, $items = array()) {
        foreach ($items as $item => $rules) {
            foreach ($rules as $rule => $rule_value) {

                $value = trim($source[$item]);
                $item = escape($item);

                if($rule === 'required' && empty($value)) {
                    $this->addError("{$item} is required");
                } else if(!empty($value)) {
                    switch($rule) {
                        case 'min':
                            if(strlen($value) < $rule_value) {
                                $this->addError("{$item} must be a minimum of {$rule_value} characters.");
                            }
                        break;
                        case 'max':
                            if(strlen($value) > $rule_value) {
                                $this->addError("{$item} must be a maximum of {$rule_value} characters.");
                            }
                        break;
                        case 'matches':
                            if($value != $source[$rule_value]) {
                                $this->addError("{$rule_value} must match {$item}");
                            }
                        break;
                        case 'unique':
                            $check = $this->_db->get($rule_value, array($item, '=', $value)); 
                            if($check->count()) {
                                $this->addError("{$item} already exists.");
                            }
                        break;
                    }
                }

            }
        }

        if(empty($this->_errors)){
            $this->_passed = true;
        }

        return $this;
    }

    private function addError($error) {
        $this->_errors[] = $error;
    }

    public function errors() {
        return $this->_errors;
        }

    public function passed() {
        return $this->_passed;
    }

}

【问题讨论】:

  • 检查$_POST中是否存在键password_currentpassword_newpassword_new_again

标签: php forms validation undefined-index


【解决方案1】:

据我所知,您的表单中缺少输入字段 添加缺少的输入。

在表单提交后检查发布的数据,看看缺少什么。

var_dump($_POST);

将您的输入名称更改为密码_.. 将文件名与验证规则名称相匹配。你应该没事。

【讨论】:

  • 嗨,mdamia,对不起,我在上面发布了错误的代码。我已经为更新密码页面输入了正确的代码。
  • 查看我更新的答案,输出应该包含您的所有表单字段。
  • 我把 var_dump 放进去得到了这个:array (size=4) 'passsword_current' => string 'password' (length=8) 'passsword_new' => string '' (length=0) 'passsword_new_again' => string '' (length=0) 'token' => string '3d2c0e59a882afe842eb0d21e975abd4' (length=32) password_current 是必需的 password_new 是必需的 password_new_again 是必需的 所以即使我把密码放进去说该字段是必需的.这是否意味着验证有问题?
  • 检查你的输入名称 passsword_current, pass .... 你有 3s 在那里你的验证规则只有 2s :)。
  • 哇,就是这样。谢谢mdamia。抱歉把大家的时间浪费在这么愚蠢的问题上;)
【解决方案2】:

如果你正在学习,你可以

【讨论】:

    【解决方案3】:

    我相信您在上面发布了错误的“更新密码”页面代码。您已经发布了只有一个字段“名称”的表单的代码。但是输出响应、验证类、视频以及您说“我确实输入了我的当前密码”这一事实表明您已经在某处创建了更新密码表单,但您一定只是在上面发布了错误的页面代码。您可能需要仔细检查并发布最新/正确的页面代码。您需要确保输入字段都存在于表单中。

    如果无法看到该页面/代码,您收到的通知可能是因为您的 error_reporting 级别与视频演示者的级别不同。您可以通过替换第 15 行来正确检查验证类中的数组值来防止出现此通知:

    $value = trim($source[$item]);
    

    用这个:

    $value = isset($source[$item]) ? trim($source[$item]) : '';
    

    值得一试。

    【讨论】:

    • 嗨 Manachi,感谢您指出这一点,我现在已经输入了正确的代码,见上文!我也会试试你的建议。
    • 嗨@skr - 不用担心。你也尝试过这个建议吗?我怀疑它应该可以解决问题。
    • 嗨 Manachi,是的,这确实消除了错误通知。但是验证仍然无法正常工作。即使我在提交表单时输入了当前密码,但验证显示“current_password”是必需的。如果您在下面看到我对 mdami 的评论,我在 $_POST 上做了一个 var_dump,它看到 password_current 字符串中包含“密码”。您知道为什么验证会认为该字段为空吗?
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2015-01-20
    • 2016-08-25
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多