如何在客户端存储一个php数组?
Posted
技术标签:
【中文标题】如何在客户端存储一个php数组?【英文标题】:How to store a php array on the client side? 【发布时间】:2011-07-30 12:01:23 【问题描述】:我正在从 mysql 数据库中提取一个数组。一个非常简单的select
语句,然后将其放入普通的多维数组(行和列)中以生成一些 html。到目前为止一切顺利。
我希望能够将该数组存储在客户端的某处(DOM?),以便客户端可以重复使用和操作该数据(通过 jQuery),而不必重新查询数据库以获取相同的数据时间。
所以...假设我的 php 数组是:
$fruits = array ( "fruits" => array ( "a" => "orange",
"b" => "banana",
"c" => "apple"
),
"numbers" => array ( 1,
2,
3,
4,
5,
6
),
"holes" => array ( "first",
5 => "second",
"third"
)
);
如何将$fruits
存储在客户端,以便通过javascript 重新使用命令中的数据?
【问题讨论】:
【参考方案1】:使用json_encode 将 $fruits 序列化为 JSON,然后将其写入类似于隐藏输入的内容。使用 jQuery,您可以查询 DOM 的输入和 $.parseJSON 它的值。
服务器端:
<input type="hidden" id="FruitData" value="<?php echo htmlentities( json_encode( $fruits ) );?>" />
客户端:
var fruits = $.parseJSON( $( '#FruitData' ).val() );
你可以把它放在任何你喜欢的地方,真的——我只是更喜欢输入。输入对于将数据传送回服务器也很方便(甚至通过 AJAX 以外的方法)。饼干也可以。我确实避免直接输出到脚本块中。我不喜欢我的语法编辑器如何在 JS 中的 PHP 上发疯,它通常会导致大量全球化代码,并且在将脚本移动到外部文件时会妨碍我。
此外,只要您将JSON API 提供给旧版浏览器,您就可以将$.parseJSON
替换为JSON.parse
。
【讨论】:
谢谢,有什么理由使用 $.parseJSON 而不是 JSON.parse 还是使用 JSON.parse 总是更好? +1 虽然我不喜欢为此使用属性,但这是发布的唯一答案(包括我的),它不受有效 JSON 破坏的影响HTML 或 Javascript。 字符串将根据需要进行 HTML 转义,而不是 JS 转义。如果 PHP 有一个值 =&lt;
,JS 会将其视为 &lt;
而不是 '
@Thrustmaster 读取文档发生的“&”转换。 (HTML 对 【参考方案2】:
将它存储为一个简单的 javascript 对象怎么样?类似于以下内容:
//yourphpfile.php
<script type="text/javascript">
var obj = JSON.parse('<?php echo json_encode($my_arr,JSON_HEX_TAG|JSON_HEX_APOS); ?>');
console.log(obj);
</script>
客户端会将整个数据放入obj
对象中。
【讨论】:
如果您从 PHP 输出中删除双引号,您可以不调用 JSON.parse。不过,我宁愿永远不要在 JS 块中输出 PHP。当我准备将脚本移动到外部文件时,它只会妨碍我。 谢谢,但我很好奇它的可重用性?这是一种简单的方法,但似乎其他答案将其与页面上的隐藏 div 或输入字段结合使用,而您没有。 @JAAulde:是的,但JSON.parse
肯定是一种安全的方式。如果我的邪恶 (:P) 同事将 PHP 响应修改为 "a":"b"; doSignOut();
之类的东西怎么办:-) @themerlinproject:它肯定是可重用的。只要您正确引用它,您就可以使用与使用隐藏 div/input 的其他方法完全相同的方式来使用它。
@Thrustmaster 是的,我明白你在说什么关于脚本注入。确实是一个有效的观点。
我看到你接受了这个答案,我建议你阅读我的回答中关于向不原生提供 JSON API 的旧浏览器(IE
【参考方案3】:
一种方法,也是我们(我们的公司)以前使用过的一种方法,是将数据作为 JSON 回显在页面上隐藏的 div
中。然后结合使用jQuery的.text()
方法和JSON.parse()
在客户端获取数据为JSON。
类似这样的:
echo "<div id = 'fruits' style = 'display:none;'>".json_encode($fruits)."</div>";
然后在Javascript中:
var fruits = JSON.parse($("#fruits").text());
console.log(fruits.fruits.a); // orange
【讨论】:
-1 这是不正确的。 JSON 可以包含诸如“”和“&”之类的字符(在字符串文字中),这可能会破坏这一点。【参考方案4】:实际上,这存在一个问题并且“不安全”(但我将此回复留作参考以及暴露我之前没有考虑过的缺陷):
如果“”出现在 JSON 的输出中(这是完全合法的),则 HTML 无效。
编辑: json_encode
采用可选的JSON_HEX_TAG
,这将防止上述情况发生。 请务必根据上下文使用正确的输出转义。
(还有以前的东西……)
我会和其他人一样写出同样的答案……
...使用 json_encode
或类似/更好的 JSON 编码机制。这应该会生成 JSON——JSON 是 JavaScript 对象文字子集的文本表示。然后这个 JSON(除非 json_encode 被破坏)保证是 JavaScript 中 100% 有效的无副作用表达式。
...有一个例外:按原样使用-valid-JS-expression。
# Look, no added nonsense.
var blah = <?= json_encode($my_arr); ?>;
不太可能在使用良好的设计之前必须将 JSON 塞入元素属性中。 (例如,可能不需要对存储值进行任何“解析”;在发出代码时利用 JavaScript 以及后端和前端之间的执行顺序。)
请花点时间想想处理发生的不同阶段。例如,以下是错误的:
var blah = ParseJson("<?= json_encode($my_arr); ?>;")
这是错误的,因为 PHP 运行后返回给浏览器的结果 HTML 可能是:
var blah = ParseJson(""hello": "world"")
愉快的编码
【讨论】:
虽然json_encode
值得信赖,但我相信 Thrustmaster 担心有人可能会或可能不知道他们在做什么删除 json_encode
并通过任意数量的恶意或意外方式添加破坏性代码.虽然这种可能性很低,并且几乎所有输出到客户端的东西都可以提出相同的论点,但它应该(至少)在开发人员心中。所以虽然不是一个大问题,但我相信他的观点是正确的。无论如何,您的回答也很有效——尽管正如我在自己的回答中详细说明的那样,我将 PHP 排除在我的脚本之外。
@JAAulde 由于发布的其他原因,没有什么不同。写完我的答案后,我意识到我对 JSON 生成的一些假设只是“把它放在 Javascript 块中”是无效的,正如顶部更新中所暗示的那样。在定义明确的 be 行为的小区域之外,这些答案均无效。以上是关于如何在客户端存储一个php数组?的主要内容,如果未能解决你的问题,请参考以下文章