当我从数据库加载法语文本时,数据表返回无效的 json 响应

Posted

技术标签:

【中文标题】当我从数据库加载法语文本时,数据表返回无效的 json 响应【英文标题】:datatables returns Invalid json response when i am loading french text FROM database 【发布时间】:2017-04-17 05:14:16 【问题描述】:

仅当我选择包含法语内容的列时才会收到此错误。可能是语言问题。我能做些什么来避免这个错误?

DataTables 警告:表 id=example - JSON 响应无效。有关此错误的更多信息,请参阅http://datatables.net/tn/1

$(document).ready(function() 
    $('#example').DataTable(
        "processing": true,
        "serverSide": true,
        /*"contentType": false,*/
        "ajax": '<?=base_url()?>'+"posts/get_html_posts"
    );
);
<table id="example" class=" ui table" cellspacing="0" >
    <thead>
        <tr>
            <th>No</th>
            <th>Category Name</th>
            <th>Subcategoty Name</th>
            <th>Title En</th>
            <th>Title Fr</th>
            <th>Is Draft</th>
            <th>Edit</th>
            <th>Delete</th>
            <th>Website url</th>
        </tr>
    </thead>
</table>

控制器

public function get_html_posts()
    
        require(APPPATH .'third_party/ssp.class.php' );
        $table = 'posts';
        $primaryKey = 'post_id';
        $columns = array(
            array('db' => 'post_id','dt' => 0),
            array( 'db' => 'category_id', 'dt' => 1 ),
            array( 'db' => 'subcategory_id',  'dt' => 2 ),
            array('db'=>'title_en','dt'=>3),
            array('db'=>'title_fr','dt'=>4),
            array('db' => 'is_draft','dt' => 5,"formatter"=>function($d,$row) 
                if($row['is_draft']==1)
                return "<spna class='ui orange label'>Draft</span>";
                else
                return "<spna class='ui green label'>Published</span>";
            ),
            array('db' => 'post_id','dt'=>6,"formatter"=>function($d,$row) 
                return "<a href='".base_url()."posts/edit/".$row['post_id']."' class='ui orange button padding-10'><i class='write icon margin-0'></i></a>";
            ),

            array('db'=>'post_id','dt'=>7,"formatter"=>function($d,$row) 
                return "<a href='#' class='ui red button padding-10' onclick='return delete_record(this.id)' id='".$row['post_id']."'><i class='remove icon margin-0'></i></a>";
            ),
            array('db'=>'post_slug','dt'=>8,"formatter"=>function($d,$row)
            
                $web_url = "http://localhost";
                return "<a class='ui orange button padding-10' target='_blank' href=".$web_url.'category/'.str_replace('-','', $row['category_id']).'/'.$row['subcategory_id'].'/'.$row['post_id'].'/'.$row['post_slug']."><i class='expand icon margin-0'></i></a>";
            )

        );

        $sql_details = array(
            'user' => 'root',
            'pass' => '',
            'db'   => 'my_demo',
            'host' => 'localhost'
        );
        //header('Content-Type: application/json');
        echo json_encode(
            SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns )
        );
    

【问题讨论】:

你也可以分享你的ajax输出吗? 听起来您的 AJAX 响应的字符编码存在问题。请出示 PHP 代码。 当我不得不处理法语时,我在使用单引号时遇到了一些问题,因为单引号经常出现在法语句子中。 @RoryMcCrossan 是的,我也认为。而且我没有在我的代码中使用任何字符编码。 【参考方案1】:

我有时会遇到类似的问题。请确保您获得有效的 json 响应。 这是您可以参考所有与 jquery 数据表相关的查询的最佳示例。 Jquery Datatables

我的控制器看起来像这样:

public function inbox()
     
         $data = array(
                    'receiverEmail' => $this->session->userdata['user_login']['loginEmail'],
            );
        $response = $this->mail_receive->inbox($data);

     $output = array(
                        "iTotalRecords" =>$this->mail_receive->totalRecords($data),
                        "iTotalDisplayRecords" => $this->mail_receive->totalRecords($data),
                         "aaData" => $response,
                );


        header('Content-Type: application/json');
        echo json_encode($output);

     

这就是我进行 ajax 调用的地方

<script>
    $(document).ready(function() 
        var table = $('#inbox').dataTable( 


         "bServerSide": true,
         "sAjaxSource": "<?php echo base_url(); ?>index.php/Inbox_redirect/inbox",
         "bProcessing": true,
        "order": [],
         "bSortable" : true,
          "aaSorting": [[2, 'asc']],
         "sServerMethod": "GET",
         "columns" : [ 
            "data" : "mailId",
            "data" : "mailSender",
            "data" : "mailSubject",
            "data" : "mailContent",
            "data" : "mailSendDate" ],
        "columnDefs": [
         
            "targets": [ 0 ], //first column / numbering column
            "orderable": false, //set not orderable
        ,
        ],

     );
 );


</script>

请发布更多代码,以便更轻松地帮助您!

【讨论】:

我已经使用示例datatables.net/examples/server_side/defer_loading.html实现了数据表 在您的页面中,在适当的地方使用 utf8_encode() 以确保来自数据库或外部文件的值被正确编码(尝试将数据库中字段的编码也设置为 UTF8) ,看看 htmlentities() 函数将特殊字符解析为 html 实体,这也可以解决编码问题。 我已经在包含法语文本的字段中使用了 utf8_encode(),但是我需要在哪里解码该内容? utf8_decode() ...在您的控制器中使用它并传递解码的json字符串,因此ajax调用可以在处理数据后获得有效的json响应

以上是关于当我从数据库加载法语文本时,数据表返回无效的 json 响应的主要内容,如果未能解决你的问题,请参考以下文章

js动态加载HTML元素时出现的无效的点击事件

C#调用替换后Oracle包无效

无效的 API 令牌

使用法语口音时语法无效

加载器的无效数据类型 - Pytorch Lightning DataModule

加载操作中的 BigQuery 错误:令牌无效 - 令牌无效:无状态令牌已过期