【问题标题】:How may I avoid a syntax error when echoing JSON.parse in a script in PHP foreach?在 PHP foreach 的脚本中回显 JSON.parse 时,如何避免语法错误?
【发布时间】:2020-02-24 01:44:08
【问题描述】:

这是我在 StackOverflow 上的第一个问题,我认为自己是新手(自学成才)。请多多包涵。

以下脚本在未包含在 php 标签中时可在页面上运行。

<script>
  var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
  for (var k in obj) {
    if (obj[k] instanceof Object) {
      printValues(obj[k]);
    } else {
      document.write(obj[k]);
    };
  }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script>

当包裹在 php 标签中并被回显时,相同的脚本在页面上不起作用。

它实际上使网站崩溃。

下一个代码块中的第二行var json = '{"submitted_values":{"15":{"15.1":"123"}}}'; 得到syntax error, unexpected ':'

<?php echo '<script>
  var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
  for (var k in obj) {
    if (obj[k] instanceof Object) {
      printValues(obj[k]);
    } else {
      document.write(obj[k]);
    };
  }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script>'; ?>

下面描述了我想要工作的内容。

测试是一行三列。

下一个代码块中的第 1 列是上面的脚本,当然,它不起作用。

Col 2 工作并产生一个字符串,其中脚本中的document.write(obj["submitted_values"]["15"]["15.1"]); 工作。我已经测试了一个实际的(精心制作的、嵌套的)字符串,它确实有效,但只有在 php 标签之外时才有效。

Col 3 是上面的脚本,但 '{"submitted_values":{"15":{"15.1":"123"}}}' 替换为 ' . esc_html($incomplete_submission-&gt;submission) . '

Col 3 是我最终想要在 WordPress 插件中工作的内容。

如果可以的话,请有人从echo '&lt;!-- Col 3 --&gt;&lt;td&gt;&lt;script&gt; 复制以下代码块,更改代码以使其正常工作,然后将其全部粘贴到答案中吗?

我要求粘贴整个内容,因为它可能会为您节省额外的来回时间。

谢谢!

<?php
foreach ($incomplete_submissions as $incomplete_submission)
{
 echo '<!-- Row --><tr>';
 echo '<!-- Col 1 --><td><script>
    var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script></td>';
    echo '<!-- Col 2 --><td>' . esc_html($incomplete_submission->submission) . '</td>';
    echo '<!-- Col 3 --><td><script>
    var json = ' . esc_html($incomplete_submission->submission) . ';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]);
</script></td>';
    echo '</tr>';
   }
?>

【问题讨论】:

  • 你有一个未转义的引用 ' 那里。解决这个问题
  • 不要使用 echo 一开始就输出大块的静态 HTML / JS 代码。使用php.net/manual/en/language.basic-syntax.phpmode.php下显示的语法,只使用小的PP代码段来输出实际动态的部分。
  • “它实际上使网站崩溃了。” - 什么意思 - “空白页面”?然后你应该首先通过 PHP 配置启用正确的 PHP 错误报告,以便 PHP 有机会告诉你语法错误。

标签: php json foreach syntax-error echo


【解决方案1】:

PHP 有 Heredoc 和 Nowdoc 字符串,它们是 PHP 中处理多行字符串的最佳方式。

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

您可以通过使用这种类型的字符串来解决您的问题,如下所示:

<?php echo <<<EOD
    <script>
        var json = '{"submitted_values":{"15":{"15.1":"123"}}}';
        var obj = JSON.parse(json);

        function printValues(obj) {
          for (var k in obj) {
            if (obj[k] instanceof Object) {
              printValues(obj[k]);
            } else {
              document.write(obj[k]);
            };
          }
        };
        printValues(obj);
    </script>
EOD; 
?>

注意结束标记 EOD 绝对不能缩进,否则 PHP 不会承认它。此外,您不必使用“EOD”;它可以是你想要的任何字符串。

【讨论】:

  • 感谢您的建议。当该代码正常工作时,它将回显 123。在 PHP 7.3+ 中,整个脚本都被回显。它会使网站崩溃。自己试试你的代码:sandbox.onlinephpfunctions.com
  • @tom-usher 当您测试sandbox.onlinephpfunctions.com 中的代码时,结果等于“代码的html 输出”。如果您在主机上测试代码,当您尝试在浏览器中打开该页面时,您会看到它工作正常……请投票。谢谢。
【解决方案2】:

感谢@cbroe的评论,您可以在自己设置$myJson变量后使用下面的代码,并在wordpress插件中使用它来解决问题:

<script>
    function printValues(jsonString) {
        var obj = JSON.parse(jsonString);
        for (var k in obj) {
            if (obj[k] instanceof Object) {
                printValues(obj[k]);
            } else {
                document.write(obj[k]);
            };
        }
    };
</script>
<?php
    $myJson = '{"submitted_values":{"15":{"15.1":"123"}}}';
    foreach ($incomplete_submissions as $incomplete_submission)
    {
        ?>
        <tr><!-- Row -->
            <td><!-- Col 1 -->
                <script>
                    var jsonString = <?php echo $myJson; ?>;
                    printValues(jsonString);
                </script>
            </td>
            <td><!-- Col 2 -->
                <?php echo esc_html($incomplete_submission->submission); ?>
            </td>
            <td><!-- Col 3 -->
                <script>
                    var jsonString = <?php echo wp_json_encode($incomplete_submission->submission); ?>;
                    printValues(jsonString);
                </script>
            </td>
        </tr>
        <?php
    }
?>

【讨论】:

  • 您的代码导致第 1 列和第 3 列为空。 document.write(obj["submitted_values"]["15"]["15.1"]);是我脚本中返回值 15.1 的部分,即 123。
【解决方案3】:

感谢所有试图提供帮助的人。

这是如何完成的:

echo '<!-- Col 3 --><td>';
?>
<script>
var json = '<?php echo $incomplete_submission->submission; ?>';
var obj = JSON.parse(json);

function printValues(obj) {
    for (var k in obj) {
        if (obj[k] instanceof Object) {
            printValues(obj[k]);
        } else {
            document.write(obj[k]);
        };
    }
};
document.write(obj["submitted_values"]["15"]["15.1"]); </script>
<?php
echo '</td>';

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2017-09-24
    • 2020-11-03
    • 2011-09-26
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2013-10-14
    • 2017-12-01
    相关资源
    最近更新 更多