PHP$\u COOKIE全局中的转义JSON

PHP$\u COOKIE全局中的转义JSON,php,javascript,json,Php,Javascript,Json,好的,所以我对最近的一个项目有一个奇怪的要求。为了绕过CMS和缓存的限制,我需要在进行几个AJAX调用后,在cookie中存储和更新JSON对象。稍后,如果用户完成了一个过程,则此cookie中存储的信息将用于标识先前所做的选择。完成时间可以跨越几分钟到几周,即页面转换几乎没有时间限制 当我从$_cookieglobal中提取编码的JSON字符串时,我开始发现JSON语法错误,事实上,这些错误是在那之前出现的,但那是我开始弄清楚发生了什么。我在Javascript中使用内置的JSON.strin

好的,所以我对最近的一个项目有一个奇怪的要求。为了绕过CMS和缓存的限制,我需要在进行几个AJAX调用后,在cookie中存储和更新JSON对象。稍后,如果用户完成了一个过程,则此cookie中存储的信息将用于标识先前所做的选择。完成时间可以跨越几分钟到几周,即页面转换几乎没有时间限制

当我从$_cookieglobal中提取编码的JSON字符串时,我开始发现JSON语法错误,事实上,这些错误是在那之前出现的,但那是我开始弄清楚发生了什么。我在Javascript中使用内置的JSON.stringify设置cookie值,在PHP中使用JSON_解码

显然,PHP将从$\u COOKIE中转义字符串值中的引号,这导致了JSON语法错误,以及之后的级联效应。我在PHP JSON函数或$\u COOKIE文档中没有看到任何提及。最后我在“\”上做了一个preg_替换并移除了它们,现在它“工作”了

这看起来像是一个令人讨厌的工作。我有什么遗漏吗?将来有没有更好的办法

回显值和json_last_错误时:

$cookie=$\u cookie['cookie\u name'];=>{\suffix\:\general\…} $cookie=json\u解码$cookie,true;=>语法错误:NULL $cookie=preg\u替换“/\\/”,$cookie;=>{后缀:一般…} $cookie=json\u解码$cookie,true;=>无错误:数组


您需要添加json_encode的第二个参数,因为一些常量需要PHP5.3

json_encode($data, JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

此外,您还需要json_decodestripslashes$json,因为magic_quotes_gpc似乎处于启用状态,您需要添加json_encode的第二个参数,因为某些常量需要PHP5.3

json_encode($data, JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

此外,您还需要json\u decodeStripsalshes$json,因为它看起来像是magic\u quotes\u gpc,您可能是它的受害者。
确保它们已关闭。

你很可能是一个病毒的受害者。
确保它们已关闭。

JSON到字符串的编码在JSON.stringify的Javascript中发生,并且存储正确,或者至少在我将其登录到控制台并发出警报时是这样。我主要使用Firefox进行开发,然后在PHP上使用stripslashes,如我所示,或者在PHP.ini中禁用magic_quotes_gpc,如果您不介意的话,您的答案中没有看到第二行。天哪!我简直不敢相信我错过了stripslashes功能——凌晨1:30疯狂挤压bug对大脑不好。JSON编码为字符串是在Javascript中使用JSON.stringify实现的,并且存储正确,或者至少在我将其登录到控制台并发出警报时是这样。我主要使用Firefox进行开发,然后在PHP上使用stripslashes,如我所示,或者在PHP.ini中禁用magic_quotes_gpc,如果您不介意的话,您的答案中没有看到第二行。天哪!我简直不敢相信我错过了stripslashes功能——凌晨1:30疯狂挤压bug对大脑不好。这项功能在PHP 5.3.0中被弃用,在PHP 5.4.0中被删除。我刚刚检查了自己的配置——在本地运行MAMP开发,我使用的是5.3 PHP。我将5.2ini改为OFF,但phpinfo仍然说它们是在神奇的引号中。我不得不放弃显式指令,将它们关闭到我的5.3INI文件中,最终使它们完全关闭。因此,即使已弃用,仍然存在,并且需要在5.3on中默认关闭==com'on man!这个特性在PHP5.3.0中被弃用,在PHP5.4.0中被删除。我刚刚检查了自己的配置——运行MAMP在本地开发,我使用的是5.3 PHP。我将5.2ini改为OFF,但phpinfo仍然说它们是在神奇的引号中。我不得不放弃显式指令,将它们关闭到我的5.3INI文件中,最终使它们完全关闭。因此,即使已弃用,仍然存在,并且需要在5.3on中默认关闭==com'on man!