提交表单时出现未定义索引错误
Undefined index error when submitting form
我很忙学习PHP并且一直在按照教程创建一个您可以注册的基本站点并让用户 account/change 您的 password/update 信息等
我在你更改密码的部分(我在这个 Video 中大约 6:10),我被卡住了。就我而言,我已经完成了他在教程中所做的一切,但是当我提交表单时,出现以下错误。请对我放轻松,因为我确定我遗漏了一个“,”或拼写错误但对于我的生活我找不到它。 (注意:当我提交表单时,我确实输入了我当前的密码,但我收到验证错误,说我没有。)
(更新:将此 post 标记为重复并指向另一个 post 并不是很有帮助。正如我在上面强调的那样,我只是在学习 PHP 因此无法从 post 中挑出一个解决方案并以某种方式将其与我的问题联系起来。)
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 是必需的
这是我更新密码页面的代码:
<?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>
这是我的验证代码 class:
<?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;
}
}
据我所知,您的表单中缺少输入字段
添加缺少的输入。
提交表单后检查发布的数据,看看缺少什么。
var_dump($_POST);
将你的输入名称 passsword_.. 更改为 password_
将文件名与验证规则名称相匹配。你应该没问题。
我相信您 post 上面的 "Update password" 页面代码有误。您已经 post 编辑了只有一个字段的表单的代码 "name"。但是输出响应、验证 class、视频以及你说“我确实输入了我当前的密码”这一事实表明你已经在某处创建了更新密码表单,但你必须只有 post 在上面输入了错误的页面代码。您可能需要仔细检查 post latest/correct 页面代码。您需要确保输入字段都存在于表单中。
无法看到 page/code,您收到的通知可能是因为您的 error_reporting 等级与视频演示者的等级不同。您可以通过替换第 15 行:
正确检查验证 class 中的数组值来防止出现此通知
$value = trim($source[$item]);
有了这个:
$value = isset($source[$item]) ? trim($source[$item]) : '';
值得一试。
如果你正在学习,你可以
关闭通知http://php.net/manual/ru/function.error-reporting.php
error_reporting(E_ALL ^ E_NOTICE);
在
中使用前检查数据是否已设置
$value = trim($source[$item]);
我很忙学习PHP并且一直在按照教程创建一个您可以注册的基本站点并让用户 account/change 您的 password/update 信息等
我在你更改密码的部分(我在这个 Video 中大约 6:10),我被卡住了。就我而言,我已经完成了他在教程中所做的一切,但是当我提交表单时,出现以下错误。请对我放轻松,因为我确定我遗漏了一个“,”或拼写错误但对于我的生活我找不到它。 (注意:当我提交表单时,我确实输入了我当前的密码,但我收到验证错误,说我没有。)
(更新:将此 post 标记为重复并指向另一个 post 并不是很有帮助。正如我在上面强调的那样,我只是在学习 PHP 因此无法从 post 中挑出一个解决方案并以某种方式将其与我的问题联系起来。)
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 是必需的
这是我更新密码页面的代码:
<?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>
这是我的验证代码 class:
<?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;
}
}
据我所知,您的表单中缺少输入字段 添加缺少的输入。
提交表单后检查发布的数据,看看缺少什么。
var_dump($_POST);
将你的输入名称 passsword_.. 更改为 password_ 将文件名与验证规则名称相匹配。你应该没问题。
我相信您 post 上面的 "Update password" 页面代码有误。您已经 post 编辑了只有一个字段的表单的代码 "name"。但是输出响应、验证 class、视频以及你说“我确实输入了我当前的密码”这一事实表明你已经在某处创建了更新密码表单,但你必须只有 post 在上面输入了错误的页面代码。您可能需要仔细检查 post latest/correct 页面代码。您需要确保输入字段都存在于表单中。
无法看到 page/code,您收到的通知可能是因为您的 error_reporting 等级与视频演示者的等级不同。您可以通过替换第 15 行:
正确检查验证 class 中的数组值来防止出现此通知$value = trim($source[$item]);
有了这个:
$value = isset($source[$item]) ? trim($source[$item]) : '';
值得一试。
如果你正在学习,你可以
关闭通知http://php.net/manual/ru/function.error-reporting.php
error_reporting(E_ALL ^ E_NOTICE);
在
中使用前检查数据是否已设置$value = trim($source[$item]);