将关联数组从PHP传递到JavaScript

3
我想从php代码传递一个关联数组到javascript代码中,请问如何实现?JSON在这方面有帮助吗?如果有的话,请提供一个简单的代码示例。谢谢。
以下是评论中的HTML + PHP代码:
<td> 
    <input type="text" style="width:70;" name="<?php echo $quantity;?>" id="<?php echo $quantity;?>" onkeyup="check_valid_range('<?php echo $itemName;?>','<?php echo $quantity;?>',<?php echo json_encode($product_inventory);?>);">
</td> 
<script type="text/javascript"> 
    function check_valid_range(product_field, quantity_field, inventory){ 
        var product = document.getElementById(product_field).value; 
        var quantity = document.getElementById(quantity_field).value; 
        var v = inventory[product]; 
        alert(v); 
    } 
</script>

3
做过研究吗?其实这是一个相当常见的任务(不过,仅将其转换为 JSON 是不够的,因为 JSON 中出现的 "</script>" 是一个反例)。JSON 之所以“有效”,只是因为它是 JavaScript 字面表达式的一个子集。 - user166390
4
为什么会有这么多差评?这并不是一个糟糕的问题。 - Paweł Adamski
2
可能是因为它是一个重复的。 - Joe the Person
1
存在重复问题并不是将其降低评分的有效理由。您应该因为问题难以理解或措辞不当而进行评分,而不是因为其他人已经问过同样的问题。 - cdhowie
1
@pst 这是错误的,JSON允许转义/字符以便转义</script>,而json_encode会自动处理。https://dev59.com/yVrUa4cB1Zd3GeqPmbNZ#7217312 - Arnaud Le Blanc
显示剩余7条评论
2个回答

10

JSON很完美:

<?php

$mySweetJSONString = json_encode($myAssocPHPArray);

?>
<script>
    var iWantThePHPArrayHere = <?php echo $mySweetJSONString; ?>;
</script>

用户pst提出了以下问题:

  • "array("</script>") -- darn, just broke this "perfect" approach."
    这似乎是可以工作的,因为 (</script> => <\/script>):
    jsFiddle

  • "What about ]]> which could occur in XHTML?"
    该字符串可以被传输。
    jsFiddle


更新:

关于调试JS的问题:
控制台有错误吗?你的其中一个 document.getElementById(...) 可能返回 null。因此成员 value 不存在。


谢谢@cdhowie,我通常尝试拥有完整的代码O_o。 - afuzzyllama
code <script type="text/javascript"> function check_valid_range(product_field, quantity_field, inventory) { var product = document.getElementById(product_field).value; var quantity = document.getElementById(quantity_field).value; var v = inventory[product]; alert(v); } </script> - Abhimanyu1310
post it in your question - afuzzyllama
1
这是完全安全的,即使字符串包含 </script>。PHP 的 json_encode 会为此目的转义 / - Arnaud Le Blanc
@arnaud576875 已经纠正了负评。那么在 XHTML 中可能出现的 ]]> 怎么办? - user166390
显示剩余8条评论

0

我一直相信JSON是为此而发明的:

<script>
    var myArray = <?=json_encode($myArray)?>;
</script>

这将呈现为:

<script>
    var myArray = {"key":"value","key2":"value2",...};
</script>

安全性

对于JavaScript来说,这是完全安全的,因为JSON是JavaScript语法的子集。这意味着任何JSON字符串都可以被视为JavaScript。

PHP的json_encode()在将JSON嵌入到<script>标签中时也是完全安全的,因为PHP会转义/字符:

json_encode('</script>');
=> "<\/script>"

因此,不可能编写</script>,这是转义<script>标记的唯一方法。(<script>标记中的所有内容都是脚本的一部分,不会被解析为HTML。)JSON 允许转义/以实现此目的。

因此,没有任何JSON字符串可以转义<script>标记。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接