【问题标题】:Error When Parsing Json data from Ajax request从 Ajax 请求解析 Json 数据时出错
【发布时间】:2020-03-06 08:10:52
【问题描述】:

我对 ajax 并不陌生,但我在这里遇到了非常奇怪的问题,我正在使用 codeigniter 框架。我尝试使用以下代码使用 ajax jquery 从视图发出请求:

$("#form_tambah_skko").parsley();
    $("#form_tambah_skko").on('submit', function(event) {
            // validate form with parsley.
            $(this).parsley().validate();

            // if this form is valid
            if ($(this).parsley().isValid()) {
                // show alert message
                $('#btnSave').text('menyimpan...'); //change button text
                $('#btnSave').attr('disabled',true); //set button disable 

                var url;
                url = "<?php echo site_url('dataskko/ajax_add')?>";
                $('#loading_').show();

                // ajax adding data to database
                $.ajax({
                    url : url,
                    type: "POST",
                    data: $('#form_tambah_skko').serialize(),
                    success: function(data)
                    {
                        if(data.status) //if success close modal and reload ajax table
                        {   
                            $('#btnSave').text('simpan');
                            $('#btnSave').attr('disabled',false);
                            $('#form_tambah_skko')[0].reset();
                            $('#loading_').hide();
                            swal('Ok!', 'Data SKKO Berhasil diinput!', 'success');

                            window.location.replace("<?php echo site_url('admin/skko/pagu') ?>");
                        }
                        else
                        {
                            alert("gagal input data");

                            for (var i = 0; i < data.inputerror.length; i++) 
                            {
                                $('[name="'+data.inputerror[i]+'"]').parent().parent().addClass('has-error'); //select parent twice to select div form-group class and add has-error class
                                $('[name="'+data.inputerror[i]+'"]').next().text(data.error_string[i]); //select span help-block class set text error string
                            }
                        }
                        $('#btnSave').text('save'); //change button text
                        $('#btnSave').attr('disabled',false); //set button enable 
                    },
                    error: function (jqXHR, textStatus, errorThrown)
                    {
                        swal("Oops", "No SKKO tidak boleh sama!", "error");

                        console.log(jqXHR.status);
                        console.log(jqXHR.responseText);
                        console.log(errorThrown);

                        $('#btnSave').text('simpan');
                        $('#btnSave').attr('disabled',false); //set button enable 

                    }
                });
            }

            // prevent default so the form doesn't submit. We can return true and
            // the form will be submited or proceed with a ajax request.
            event.preventDefault();
        });

这是我的控制器

public function ajax_add_murni()
    {
        header("Content-Type: application/json; charset=utf-8");
        date_default_timezone_set('Asia/Kuala_Lumpur');

        $pagu_ao = preg_replace('/\,/', '', $this->input->post('ao_pagu'));
        $ao_now = $this->input->post('sisa_ao1');

        //if ($ao_now/$pagu_ao < 0.1) {
        if($this->config->item('send_mail')) $this->kirim_email();
        //} 

        // $tgl_kontrak = $this->input->post('tanggal_kontrak');
        $no_kontrak = ltrim($this->input->post('no_kontrak'));

        $jml2 = preg_replace('/\,/', '', $this->input->post('nilai_kontrak'));

        $data = array(
                'no_skko'  => $this->input->post('no_skko'),
                'no_kontrak'         => $no_kontrak,
                'tgl_awal'         => $this->input->post('tanggal_awal_kontrak'),
                'tgl_akhir'         => $this->input->post('tanggal_akhir_kontrak'),
                // 'tgl_kontrak'         => $tgl_kontrak,
                'uraian_kegiatan'         => $this->input->post('kegiatan'),
                'nilai_kontrak'         => $jml2,
                'saldo_kontrak'         => $jml2,
                'file_kontrak'    => $this->input->post('encrypted_file'),
                'jaminan_bank'    => $this->input->post('encrypted_file2'),
                'jenis'    => $this->input->post('jenis'),
                'id_vendor'    => $this->input->post('id_vendor'),
                'id_bank'    => $this->input->post('id_bank_tujuan'),
                'no_rekening'    => $this->input->post('no_rekening'),
                'pemilik_rekening'    => $this->input->post('pemilik_rekening'),
                'tgl_create'    => date('Y-m-d H:i:s'),
                'creator' => $this->input->post('_creator')
            );

        $data2 = array(
                'id_skko'  => $this->input->post('id_skko'),
                'ao_terkini'  => $this->input->post('sisa_ao1')
            );

        if($this->cek_no_kontrak($no_kontrak) >= 1){
            echo json_encode(array('status_post' => "kontraksama", "message" => "nomor kontrak sudah pernah ada"));
        }else{
            if(($this->kontrak_model->save($data)) && ($this->dataskko_model->update(array('id_skko' => $this->input->post('id_skko')), $data2))){
                echo json_encode(array("status_post" => TRUE));
            } else{
                echo json_encode(array("status_post" => FALSE));
            }
        }

    }

这是我得到的响应,它总是在数组索引的开头添加额外的数组{"status":null},我确定第一个索引为空值,导致 json 无法解析。但我不知道如何解决这个问题。任何帮助将不胜感激。谢谢你

Status: 200
ResponseTest: {"status":null}{"status_post":"kontraksama","message":"nomor kontrak sudah pernah ada"}
SyntaxError: Unexpected token { in JSON at position 15
    at JSON.parse (<anonymous>)
    at n.parseJSON (jquery.min.js:4)
    at Xb (jquery.min.js:4)
    at y (jquery.min.js:4)
    at XMLHttpRequest.c (jquery.min.js:4)

【问题讨论】:

    标签: jquery ajax codeigniter view controller


    【解决方案1】:

    看起来您的 PHP 代码中的其他地方(在服务器端)之前已经回显了 JSON 字符串。在 site_url('dataskko/ajax_add') 的开头和实际调用 public function ajax_add_murni() 的时间之间搜索 echo 语句。

    【讨论】:

    • 谢谢你,如果你看看我的控制器。当数据发布时,我试图发送电子邮件通知。看起来问题是因为电子邮件发送失败。
    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多