Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON在Javascript中编码,在PHP中解码_Javascript_Php_Ajax_Json - Fatal编程技术网

JSON在Javascript中编码,在PHP中解码

JSON在Javascript中编码,在PHP中解码,javascript,php,ajax,json,Javascript,Php,Ajax,Json,我用Javascript创建了一个对象,作为参数传递给PHP脚本 var pattern = new Object(); pattern['@id'] = ''; pattern['@num'] = ''; pattern.cprop = new Object(); //pattern.aprop = new Object(); pattern['@id'] = id; pattern['@num'] = pn; pattern.cprop.$ = pb.find('input[name="su

我用Javascript创建了一个对象,作为参数传递给PHP脚本

var pattern = new Object();
pattern['@id'] = '';
pattern['@num'] = '';
pattern.cprop = new Object();
//pattern.aprop = new Object();
pattern['@id'] = id;
pattern['@num'] = pn;
pattern.cprop.$ = pb.find('input[name="subject"]').val() || '';
var json = {'pattern': pattern};
我的Ajax调用是

url: clr_url_base+'storepat.php?data='+encodeURIComponent($.toJSON(json))
在我的PHP脚本中,我使用

$pat = json_decode(str_replace ('\"','"', $data), true);
$prep = $pat["pattern"]["@id"];
$sense = $pat["pattern"]["@num"];
$cprop = $pat["pattern"]["cprop"]["$"];
//$aprop = $pat["pattern"]["aprop"]["$"];
这是可行的,但是当我添加aprop值时,它就不起作用了。所有的值都是字符串。关于哪里出了问题的任何建议

以下是两个JSON字符串:

{\"pattern\":{\"@id\":\"against\",\"@num\":\"1(1)\",\"cprop\":{\"$\":\"a person or thing (often abstract) opposed\"}}}
{\"pattern\":{\"@id\":\"against\",\"@num\":\"1(1)\",\"cprop\":{\"$\":\"a person or thing (often abstract) opposed\"},\"aprop\":{\"$\":\"verbs (to which \'against\' introduces idea of opposition); nouns denoting conflict\"}}}

第一个has仅具有cprop的值,而第二个has添加了aprop的值。请注意,aprop有单引号。正是这种数据似乎要求在Javascript中编码,在PHP中解码。第二枚炸弹。我从一个表单中有大约20个字段,因此手工创建JSON将变得相当复杂,而不是作为模式中的字段来创建。第二次爆炸时,$pat的值为空。

我强烈建议通过jQuery发布数据,而不是传入查询字符串。为什么?因为这样你就不必担心URL编码之类的问题了

这在javascript/jQuery中可能是这样的。显然,对于任何类型的AJAX发送机制,这个概念基本上是相同的

$.ajax({
    type: 'POST',
    url: clr_url_base+'storepat.php?',
    contentType: 'application/json',
    dataType: 'json', // if you expect JSON in return
    data: json,  // your JSON string here
    success: // your success handler
    error: // your error handler
});
在PHP方面,由于您不处理表单编码的数据,因此需要读取PHP的原始输入。幸运的是,这非常简单,将POST数据转换为PHP对象/数组非常简单。就这么简单:

$json = file_get_contents('php://input');
$variable = json_decode($json);

您有很多问题,但第一个问题是您启用了魔术引号。这就是为什么你有那么多反斜杠。你用
str\u replace
粗略地“修复”它是一个坏主意,因为除了
之外,还有其他东西会被神奇的引号转义。你应该在你的
php.ini
文件中找到设置,并禁用它。这同样适用于“register globals”,这是一个非常不安全的功能。Reference
$\u GET['data']

有了这些,我建议下一件事是使用POST而不是GET。这意味着您不必处理转义数据,因为这总是伴随着出错的风险


您应该能够毫不费力地实现这些更改。

对可能很容易成为查询字符串一部分的数据进行JSON编码似乎很愚蠢。我认为您应该发布JSON数据,而不是通过查询字符串发送数据。只是一个建议:)您的服务器上是否有神奇的引号和注册全局变量…您应该更喜欢
{}
over
new Object()
,在将属性设置为实际值之前不必初始化属性。用以下内容替换整个第一个示例:
json={pattern:{'@id':id'@num':pn,'cprop':{'$':bp.find('input[name=“submit”]).val()| |'''}}
。既然您使用的是jQuery,只需使用
url:pattern
。而且,您是否检查了
json\u last\u error()
()?它可能会直接告诉你问题是什么,或者至少会给你一些指导。@NiettheDarkAbsol你可能是正确的,因为jQUery不是你想要的。我只是假设这是根据提到
url
属性定义的帖子使用的。当然,其他框架可能会使用类似的符号。我已经编辑了我的帖子,以指示这是一个特定的jQUery示例,但无论使用何种机制,其概念都是相似的。实际上,最重要的收获是发布数据并在PHP端处理原始输入。我不明白的是file_get_contents的参数应该是什么。(不需要数据类型,因为我不期望JSON作为回报。)(我正在将数据放入MySQL数据库。)参数是
php://input
这允许您通过读取原始输入流来获取发布到PHP脚本的内容。有关更多信息,请参阅此链接,以这种方式读取数据是必要的,因为当您在请求中不使用表单编码的contentType标头时,PHP不会填充
$\u POST
超级全局。您必须从原始输入流中获取发布的内容。@KenLit我仍然建议您的脚本向调用的javascript返回某种消息,以指示DB update/insert的成功/失败。是否使用JSON格式返回消息当然取决于您。好的,我已获得数据“模式%5B%40id%5D=反对&模式%5B%40num%5D=1(1)&模式%5Bcprop%5D%5D%5B%24%5D=a+person+或+thing+(通常+抽象)+反对”对于我的简单情况。但是,这看起来不像是解码到数组中,只是一个我需要进一步解码的字符串。我缺少什么了吗?