JSON只返回错误句子的最后一个字母

时间:2014-05-07 13:22:31

标签: php jquery ajax json codeigniter

我的表单上有一个奇怪的错误,用户可以编辑他/她的信息。每次用户按下 提交按钮,它将返回实际错误,但只返回它的最后一个字母。我可以使用我的开发人员工具查看错误。

这是我的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">&times;</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中没有显示任何错误。

2 个答案:

答案 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);