我的表单上有一个奇怪的错误,用户可以编辑他/她的信息。每次用户按下 提交按钮,它将返回实际错误,但只返回它的最后一个字母。我可以使用我的开发人员工具查看错误。
这是我的editprofile.php:
<?php $this->load->helper('form'); ?>
<?php $attributes = array(
'id' => 'update_user_form'
);
?>
<?php echo form_open('users/edit_profile', $attributes); ?>
<div class="loading_spinner" id="loading_spinner_edit_user" style="display:none;"></div>
<div class="login_error" id="edit_user_error" style="display:none">
<span class="close_error">×</span>
</div>
<div class="front_success" id="edit_user_success" style="display:none"></div>
<div class="rowi">
<div class="rowi1">
<label for="email">Sähköpostiosoite</label>
<input type="email" name="email" value="<?=$userinfo['email']?>" readonly="readonly" />
<div id="email_validate"></div>
</div>
<div class="rowi2">
<label for="phone_number">Puhelinnumero</label>
<input type="text" name="phone_number" value="<?=$userinfo['phone_number']?>" readonly="readonly"/>
</div>
</div>
<div class="rowi">
<div class="rowi1">
<label for="password">Uusi salasana</label>
<input type="password" name="new_password" />
</div>
<div class="rowi2">
<label for="new_password_again">Uusi salasana uudelleen</label>
<input type="password" name="new_password_again" />
</div>
</div>
<div class="rowi">
<div class="rowi1">
<input type="password" name="password_to_confirm" placeholder="Salasana" />
</div>
<div class="rowi2">
<input type="submit" name="edit_submit" value="Muokkaa tietojani"
class="login_submit">
</div>
</div>
<?php echo form_close(); ?>
<script type="text/javascript">
$(document).ready(function() {
$("input").on("click", function()
{
$(this).removeAttr("readonly");
});
$("form#update_user_form").on('submit', function(e)
{
e.preventDefault();
var from = $("form#update_user_form");
$.ajax({
url: from.attr('action'),
type: from.attr('method'),
data: $(from).serialize(),
}).done(function(data) {
if(data.result == 0) {
$("#edit_user_success").hide();
for (var key in data.error) {
var value = data.error[key];
var output = '<p>' + value + '</p>';
}
$("#edit_user_error").fadeIn(1000).show().html(output);
}
if(data.result == 1) {
$("#edit_user_error").hide();
$("#edit_user_success").fadeIn(1000).show().html("<p>" + data.success + "</p>");
}
}, 'json');
return false;
});
});
</script>
这是我的控制器:
public function edit_profile()
{
if(!$_POST)
{
return false;
}
$password_to_confirm = $this->input->post('password_to_confirm');
$db_password = $this->user_model->password_db_check($this->session->userdata('user_id'));
if(!$this->phpass->check($password_to_confirm, $db_password['password']))
{
$this->output->set_content_type('application_json');
$this->output->set_output(json_encode(array('result'=>0, 'error' => 'Password didn't match your password')));
return false;
}
$this->form_validation->set_rules('email', 'Sähköpostiosoite', 'valid_email|required');
$this->form_validation->set_rules('phone_number', 'Puhelinnumero', 'min_length[7]|max_length[10]');
$this->form_validation->set_rules('new_password', 'Salasana', 'matches[new_password_again]|min_length[8]');
$this->form_validation->set_rules('new_password_again', 'Salasana', 'min_length[8]');
$this->form_validation->set_message('min_length', '%s - kentässä on liian vähän merkkejä');
$this->form_validation->set_message('matches', 'Uudet salasanat eivät täsmää');
$this->form_validation->set_message('required', '%s - kenttä on pakollinen');
$this->form_validation->set_message('is_unique', '%s on jo rekisteröity');
if($this->form_validation->run() == FALSE)
{
$this->output->set_content_type('application_json');
$this->output->set_output(json_encode(array('result'=>0, 'error' => $this->form_validation->error_array())));
return false;
}
if(!$this->input->post('email') == "")
{
$update_data['email'] = $this->input->post('email');
}
if(!$this->input->post('phone_number') == "")
{
$update_data['phone_number'] = $this->input->post('phone_number');
}
if(!$this->input->post('new_password') == "")
{
$update_data['password'] = $this->phpass->hash($this->input->post('new_password'));
}
if($this->user_model->edit_user($update_data, $this->session->userdata('user_id')))
{
$this->output->set_content_type('application_json');
$this->output->set_output(json_encode(array('result'=>1, 'success' => 'Success!')));
}
}
例如,如果我输入的实际密码错误,以便对我的信息进行编辑,那么JSON会导致开发人员选项卡:
error: "Password didn't match your password"
result: 0
但它只会在错误div中输出字母“d”。 控制台在我的javascript中没有显示任何错误。
答案 0 :(得分:0)
似乎data.error
是一个字符串,而不是一个对象。
for (var key in data.error) {
var value = data.error[key];
var output = '<p>' + value + '</p>';
}
对于循环的每次迭代,data.error[key]
将是字符串中的下一个字符。
你可能只想要:
var output = '<p>' + data.error + '</p>'
答案 1 :(得分:0)
您的问题是这段代码:
for (var key in data.error) {
var value = data.error[key];
var output = '<p>' + value + '</p>';
}
data.error
是一个字符串,因此您在迭代每个字符。在最后的迭代中,output
等于字符串的最后一个字符,包含在p
标记中。
相反,您可以直接显示错误:
var output = '<p>' + data.error + '</p>';
$("#edit_user_error").fadeIn(1000).show().(output);