0

我在 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。

4

2 回答 2

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);
于 2013-11-08T20:54:53.400 回答
0

你有很多问题,但第一是你启用了魔术行情。这就是为什么你有所有这些反斜杠。您粗暴地尝试“修复”它str_replace是一个坏主意,因为除此之外还有其他事情"会被 Magic Quotes 逃脱。您应该在php.ini文件中找到该设置,然后将其禁用。“注册全局变量”也是如此,这是一个非常不安全的功能。$_GET['data']改为参考。

有了这个,我建议的下一件事是使用 POST 而不是 GET。这意味着您不必搞乱转义数据,因为这总是伴随着搞砸它的风险。

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

于 2013-11-08T21:08:44.273 回答