提问人:krz 提问时间:8/19/2015 最后编辑:krz 更新时间:8/21/2015 访问量:2250
提交表单时出现未定义的索引错误 [重复]
Undefined index error when submitting form [duplicate]
问:
我正忙于学习 PHP,并一直在按照教程创建一个基本站点,您可以在其中注册并拥有用户帐户/更改密码/更新信息等。
我正在你更改密码的部分(我在这个视频中大约是 6:10),我被卡住了。就我而言,我已经完成了他在教程中所做的一切,但是当我提交表格时,我在下面收到以下错误。请放轻松,因为我确信我遗漏了一个“,”或拼写错误,但对我来说,我一辈子都找不到它。(注意:当我提交表格时,我确实输入了当前密码,但我收到验证错误,说我没有。
(更新:将此帖子标记为重复并将我指向另一个帖子不是很有帮助。正如我在上面试图强调的那样,我只是在学习 PHP,因此无法从帖子中梳理出解决方案并以某种方式将其与我的问题联系起来。
通知:未定义的索引:password_current在第 15 行的 C:\wamp\www\Movrate\classes\Validate 中.php
通知:未定义的索引:password_current在第 15 行的 C:\wamp\www\Movrate\classes\Validate 中.php
通知:未定义的索引:password_new C:\wamp\www\Movrate\classes\Validate.php第 15 行
通知:未定义的索引:password_new C:\wamp\www\Movrate\classes\Validate.php第 15 行
通知:未定义的索引:password_new_again C:\wamp\www\Movrate\classes\Validate.php第 15 行
通知:未定义的索引:password_new_again C:\wamp\www\Movrate\classes\Validate.php第 15 行
通知:未定义的索引:password_new_again C:\wamp\www\Movrate\classes\Validate.php第 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>
下面是我的 validate 类的代码:
<?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_ 将 FiledName 与验证规则名称匹配。你应该没事。
评论
我相信您在上面发布了错误的“更新密码”页面代码。您已经发布了只有一个字段“name”的表单的代码。但是输出响应、验证类、视频以及您说“我确实输入了当前密码”这一事实表明您已经在某处创建了更新密码表单,但您一定刚刚在上面发布了错误的页面代码。您可能需要仔细检查并发布最新/正确的页面代码。您需要确保输入字段都存在于表单中。
如果无法看到该页面/代码,您收到的通知可能是因为您的error_reporting级别与视频演示者不同。您可以通过替换第 15 行来正确检查验证类中的数组值,从而防止出现此通知:
$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]);
评论
$_POST
password_current
password_new
password_new_again