我在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\"}}}
第一个只有 cprop 的值,而第二个则添加 aprop 的值。请注意, aprop 具有单引号。正是这种数据似乎要求在Javascript中进行编码并在PHP中进行解码。第二枚炸弹。我有一个表单中的大约20个字段,因此手动创建JSON会变得非常复杂,而不是 pattern 中的字段。当第二枚炸弹时, $ pat 的值为NULL。
答案 0 :(得分:1)
我强烈建议通过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);
答案 1 :(得分:0)
您遇到了许多问题,但排名第一的是您启用了Magic Quotes。这就是为什么你有这些反斜杠。你用str_replace
“修复”它的原始尝试是一个坏主意,因为除了"
之外还有其他东西可以通过Magic Quotes逃脱。您应该在php.ini
文件中找到该设置,并将其禁用。 “注册全局变量”也是如此,这是一个非常不安全的功能。改为参考$_GET['data']
。
有了这个,我建议的下一件事是使用POST而不是GET。这意味着你不必乱用数据,因为这总是带来搞砸它的风险。
您应该能够毫不费力地实施这些更改。