本问题已经有最佳答案,请猛点这里访问。
我正在忙于学习PHP,并且一直在按照教程创建一个基本站点,您可以在该站点中注册并拥有用户帐户/更改密码/更新信息等。
我正在为您更改密码(此视频中,我的时间大约是6:10),我被卡住了。就我而言,我已经完成了他在教程中所做的一切,但是当我提交表单时,在下面出现了以下错误。请放心,因为我确定我遗漏了"或"或拼写错误,但对我而言,我找不到它。 (注意:提交表单时,我确实输入了当前密码,但收到验证错误,提示我没有输入。)
(更新:将此文章标记为重复并将我指向另一篇文章不是很有帮助。正如我在上面强调的那样,我只是在学习PHP,因此无法从该文章中挑出解决方案,并且以某种方式将其与我的问题相关联。 )
Notice: Undefined index: password_current in C:\wamp\www\Movrate\classes\Validate.php on line 15
Notice: Undefined index: password_current in C:\wamp\www\Movrate\classes\Validate.php on line 15
Notice: Undefined index: password_new in C:\wamp\www\Movrate\classes\Validate.php on line 15
Notice: Undefined index: password_new in C:\wamp\www\Movrate\classes\Validate.php on line 15
Notice: Undefined index: password_new_again in C:\wamp\www\Movrate\classes\Validate.php on line 15
Notice: Undefined index: password_new_again in C:\wamp\www\Movrate\classes\Validate.php on line 15
Notice: Undefined index: password_new_again in C:\wamp\www\Movrate\classes\Validate.php on line 15
需要password_current
需要password_new
再次要求password_new_again
这是我的更新密码页面的代码:
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, '';
}
}
}
}
?>
Current password
New password
New password again
这是我的validate类的代码:
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_current,password_new,password_new_again
我相信您在上面发布了错误的"更新密码"页面代码。您已经为仅具有一个字段"名称"的表单发布了代码。但是输出响应,验证类,视频以及您说的"我确实输入了当前密码"的事实表明您已在某处创建了更新密码表单,但您必须在上面发布了错误的页面代码。您可能需要仔细检查并发布最新/正确的页面代码。您需要确保所有输入字段都存在于表单中。
在看不到该页面/代码的情况下,收到的通知可能是因为您的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字符串中包含密码。您知道为什么验证会认为该字段为空吗?
如果您正在学习,可以
关闭通知http://php.net/manual/ru/function.error-reporting.php
error_reporting(E_ALL ^ E_NOTICE);
在使用数据之前先检查数据
$value = trim($source[$item]);
据我所知,您的表单中缺少输入字段
添加缺少的输入。
提交表单后检查发布的数据,并查看缺少的内容。
var_dump($_POST);
将输入密码说成" .."的密码更改为password_
将filedname与验证规则名称匹配。你应该没事的
嗨,女士,对不起,我在上面发布了错误的代码。我现在在更新密码页面中输入了正确的代码。
看到我更新的答案,输出应该包含您所有的表单字段。
我把var_dump放进去了:array(size = 4)passsword_current =>字符串密码(length = 8)passsword_new =>字符串(length = 0)passsword_new_again => string(length = 0)令牌=>字符串3d2c0e59a882afe842eb0d21e975abd4(length = 32)要求password_current密码是必需的password_new_again是必需的因此,即使我在其中输入了密码,该字段也是必需的。这是否意味着验证有问题?
检查您的输入名称passsword_current,pass ....您那里的验证规则只有2ss的地方有3ss :)。
哇,就是这样。谢谢mdamia。很抱歉浪费大家这么愚蠢的时间;)
不要提及它,它发生在我们当中。