Передача массива php в js в виде JSON приводит к неперехваченной синтаксической ошибке: отсутствует) после списка аргументов

#javascript #php #json

#javascript #php #json

Вопрос:

Я пытаюсь передать php-массив в ajax.

Когда я передаю его в функцию onclick, я получаю неперехваченный SyntaxError: отсутствует ) после списка аргументов.

Когда я изменяю только переменную $ module, ошибка исчезает.

PHP-код :

 <?php foreach($this->data AS $module_name => $module): 
        
            if ($module_name == "Descriptions") {
                continue;
            }

        ?>
        <table>
            <thead>
                <tr>
                    <th onclick="loadModule('<?=$module_name?>', '<?=htmlspecialchars(json_encode($module))?>', '<?=json_encode($this)?>')" data-module="<?=$module_name?>" colspan="<?php echo count($this->langs)   2; ?>"><?= $module_name; ?>
                        
  

Модуль загрузки функции JS:

 function loadModule(module_name, module, thisObj) {
        console.log("load");

        if (!$(event.target).hasClass("btnEditDesc")) {


            $.ajax({
            url: "<?php echo linkGenerator::getIT()->buildURL('administration/webpage/loadSubmodules.php'); ?>",
            type: "POST",
            dataType: "html",
            data: {
                'thisObj': thisObj,
                'module': module
            },
            beforeSend: function() {
                console.log("before");
            },
            success: function(data) {

                console.log(data);

                // $("tbody['"  module_name  "']").html(data);

                $(this).parents("table").find("tbody").fadeToggle(200);
                    
            },
            error: function(jqXHR, textStatus, errorThrown) {

                console.log(jqXHR);
                console.log(textStatus);
                console.log(errorThrown);

            }
        });


        }

    }
  

дамп var массива модулей:

 > array (size=2)
  'names' => 
    array (size=7)
      'name' => string 'Names' (length=5)
      'table_name' => string 'dictionary_words_names' (length=22)
      'type' => int 2
      'cols' => null
      'key' => string 'dictionary_word_name_term' (length=25)
      'col_prefix' => string 'dictionary_word_name_' (length=21)
      'data' => 
        array (size=7)
          'en' => string 'The query to database has failed. Unknown column 'dictionary_word_name_en' in 'field list'' (length=90)
          'cs' => 
            array (size=275)
              ...
          'de' => 
            array (size=275)
              ...
          'pl' => 
            array (size=275)
              ...
          'it' => string 'The query to database has failed. Unknown column 'dictionary_word_name_it' in 'field list'' (length=90)
          'fr' => string 'The query to database has failed. Unknown column 'dictionary_word_name_fr' in 'field list'' (length=90)
          'hu' => string 'The query to database has failed. Unknown column 'dictionary_word_name_hu' in 'field list'' (length=90)
  'descriptions' => 
    array (size=7)
      'name' => string 'Descriptions' (length=12)
      'table_name' => string 'dictionary_words_descriptions' (length=29)
      'type' => int 2
      'cols' => null
      'key' => string 'dictionary_word_description_term' (length=32)
      'col_prefix' => string 'dictionary_word_description_' (length=28)
      'data' => 
        array (size=7)
          'en' => string 'The query to database has failed. Unknown column 'dictionary_word_description_en' in 'field list'' (length=97)
          'cs' => 
            array (size=275)
              ...
          'de' => 
            array (size=275)
              ...
          'pl' => 
            array (size=275)
              ...
          'it' => string 'The query to database has failed. Unknown column 'dictionary_word_description_it' in 'field list'' (length=97)
          'fr' => string 'The query to database has failed. Unknown column 'dictionary_word_description_fr' in 'field list'' (length=97)
          'hu' => string 'The query to database has failed. Unknown column 'dictionary_word_description_hu' in 'field list'' (length=97)
  

Я не силен в стилизации этих вопросов, извините за это.

Комментарии:

1. Зачем вы это делаете? htmlspecialchars(json_encode($module)) ? Это изменит строку JSON и, возможно, сделает ее недопустимым JSON. Если модулю это нужно, вы должны json_encode(htmlspecialchars($module)) .

2. Если ошибка возникает на стороне клиента, то первое, что вам нужно сделать, это изучить код на стороне клиента, а не код на стороне сервера, который генерирует код на стороне клиента. Найдите, что не так в результате вашего кода, это поможет вам определить, что вам, возможно, потребуется изменить.

3. $module содержит «, ‘ и другие html-теги, и если я не использую htmlspecialchars и json_encode, массив выводится на экран, потому что он завершает onclick и th

4.В чем смысл <?=htmlspecialchars(json_encode($module))?> и <?=json_encode($this)?> , когда то, что вы $module содержите здесь, уже является частью $this ? (Вы перебираете $this->data здесь, чтобы заполнить $module в первую очередь.) Зачем вам нужна эта повторная информация?

5. Синтаксический вопрос на уровне JavaScript: Вы знаете, в чем разница между foo(["bar", "baz"]) и foo('["bar", "baz"]') …?

Ответ №1:

Одним из подходов может быть передача строки в кодировке base 64 в html вместо использования htmlspecialchars. ПРИМЕЧАНИЕ: вам также потребуется кодировать 3-й параметр на базе 64.

   <th onclick="loadModule('<?=$module_name?>', '<?=base64_encode(json_encode($module))?>', '<?=base64_encode(json_encode($this))?>')" data-module="<?=$module_name?>" colspan="<?php echo count($this->langs)   2; ?>"><?= $module_name; ?>
  

И затем в javascript вы можете использовать atob для декодирования базового 64 перед разбором json.

   module = JSON.parse(atob(module));
  thisObj = JSON.parse(atob(thisObj));