如何在客户端存储一个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 有一个值 = &amp;lt;,JS 会将其视为 &amp;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数组?的主要内容,如果未能解决你的问题,请参考以下文章

将php数组传递给jquery函数

如何使用 PHP 在 Mysql 中存储数组

如何在 PHP 中返回从 MySQL 获取的数组

如何在 PHP 中包含名称存储在数组中的文件?

如何在 PHP 中展开多维数组(原始键访问路径存储为单个键)?

如何在循环中使用 curl PHP 100 次? [关闭]