json_encode只能处理某些php数组而不能导入其他数据

时间:2018-03-26 23:37:36

标签: javascript php mysql json mariadb

我正在尝试使用json_encode

将三个数组从php导入js

以下是代码:

<?php
    $query2 = "SELECT * FROM all_data";

    $result2 = $conn->query($query2);

    $bu = [];
    $rank = [];
    $id = [];

    if ($result2->num_rows > 0) {

        while($row2 = $result2->fetch_assoc()) {
            $bu[] = $row2["bu"];
            $rank[] = $row2["rank"];
            $id[] = $row2["id"];
            echo "<tr class='dn' id='u-" . $row2["rank"] . "'>";
            echo "<td>" . $row2["rank"] . "</td>";
            echo "<td>" . $row2["bu"] . "</td>";
            echo "<td>" . $row2["tokens"] . "</td>";
            echo "</tr>";
        }

    }


    ?>

    var users = <?php echo json_encode($bu); ?>;
    var ranks = <?php echo json_encode($rank); ?>;
    var identifier = <?php echo json_encode($id); ?>;

问题是,数组排名和标识符是否正确导入,但用户不是。这个脚本在我使用它的最后几次工作。然而,最近我更改了表all_data,删除它然后再次从csv导入它。然而,当我导入时,charset是utf8,所以我不明白这里可能出现的问题。

即使我只是做<?php echo json_encode($bu) ?>,它也无法正常工作。但是<?php print_r($bu) ?>告诉我数组实际上不是空的,它实际上包含查询结果。

2 个答案:

答案 0 :(得分:2)

json_encode将数组转换为字符串;如果您想在Javascript中再次访问该数组,请再次将该字符串解析回数组,例如:

var users = JSON.parse('<?php echo json_encode($bu); ?>');

但是这样做是非常糟糕的做法 - 如果你想让脚本从你的PHP提供信息,要么将对象插入到由Javascript解析的元素中,要么使用数据属性。

答案 1 :(得分:0)

正如@kip在注释中指出的那样,失败的最可能原因是unicode字符或其他导致json_encode无法对数组编码的特殊字符的转换。

您很有可能需要使用json_encode预定义常量之一,例如@kip建议:
    json_encode($ bu,JSON_UNESCAPED_UNICODE);

我实际上将更进一步并使用:
    json_encode($ bu,JSON_UNESCAPED_UNICODE,JSON_PARTIAL_OUTPUT_ON_ERROR)

最后,由于您知道在运行线路后会遇到某种json_encode错误
   var users = <? PHP的回声json_encode($ bu); ?>;

您可以添加以下行:
   json_last_error()

这将准确地告诉您问题是什么,并且应该允许您调整json_encode的参数以与$ bu数组一起使用。