2011-05-28 64 views
3

我使用AJAX将一些数据放在我的数据库中。我正在使用JSON将数据提交到PHP页面。我正在使用POST请求。你可以将一个POST变量设置为一个数组吗?下面我有充分的AJAX请求,但这里是我设置的数据的两个部分作为阵列的一部分:

"content[]" : testContentArray, 
"content_attr[]" : testContentAttributes, 

下面是我的全部AJAX(使用jQuery):

$.ajax({ 
       type: "POST", 
       url: "../includes/create_test_main.ajax.php", 
       data: {"tags" : $('#testTags').val(), 
             "title" : $('#testTitle').val(), 
             "subject" : $('#testSubject').val(), 
             "description" : $('#testDescription').val(), 
             "content[]" : testContentArray, 
             "content_attr[]" : testContentAttributes, 
             "user_id" : user_id}, 
       success: 

            function(testId) {//redirect Page 
             window.location.href = "http://localhost/nvr_forget/public_html/test/" + testId + "/"; 
            } 
      }); 
     }; 

如果那就是实现它的方式,我将如何在PHP端处理它?作为普通数组处理$ _POST变量?

回答

3

当您将data对象内的数组传递给$.ajax时,它将被解析为name[]=value格式。这是使用$.param完成的,所以我会说明使用:

jQuery.param({'foo': [1, 2, 5]}) 
// "foo%5B%5D=1&foo%5B%5D=2&foo%5B%5D=5" 

%5B%5D是URI编码的方括号。这是将同一个密钥的多个值发送到服务器的常用方法。 PHP解析成一个数组,所以在这种情况下:

var_export($_POST['foo']); 
// array ('1', '2', '5') 

因此,在你的代码,$_POST['content']$_POST['content_attr']都应该是数组。您使用的方括号是不必要的,但不会破坏任何内容。

See the PHP manual on the subject

+0

那么你将如何循环这些数组? 'while($ _ POST ['content']){/ * do something * /}'? – chromedude 2011-05-28 21:08:06

+2

@chromedude你不能使用'while'来循环访问一个数组(你可以,但是在几乎所有可能的情况下它都是愚蠢的)。使用['foreach'](http://php.net/manual/en/control-structures.foreach.php)。 – lonesomeday 2011-05-28 21:09:43

+0

jQuery.param基本上完成了我的解决方案,但就像我说的,你只是使用另一个序列化程序..这很好,我想如果你只是瞎搞:P – Halcyon 2011-05-28 21:13:04

0

当然,你可以 - 它可以是简单的数组(整数作为键)或关联数组。它只取决于你提交的JSON对象。

例如,如果你提交以下JSON对象:

var data = { 
    'a': 'test123', 
    'b': [ 
     'x', 
     'y', 
     'z' 
    ], 
    'c': { 
     'testing': 'abc', 
     'blah': 'qwerty' 
    } 
} 

您将有中$_POST以下元素:

  • $_POST['a'] - 包含字符串test123
  • $_POST['b'] - 包含数组( array('x','y','z')),
  • $_POST['c'] - 还含有数组,但关联(array('testing'=>'abc','blah'=>'qwerty')),
+0

我不认为这有效。 '$ _POST ['b']'最终会变成''Array''而不是'['x','y','z']' – Halcyon 2011-05-28 20:57:18

+0

@Frits这是因为你刚刚回应它。你不会像这样回显数组(这是PHP初学者中的常见错误)。尝试使用'print_r($ _ POST ['b'])''或'var_dump($ _ POST ['b'])''而不是'echo $ _POST ['b']',你会明白我的意思。 – Tadeck 2011-05-28 21:04:20

+0

回声会产生与周围引号的数组?我想不是。请不要假设。我可以输入“'字符串(5)”数组“'”但现在只是愚蠢的是不是? – Halcyon 2011-05-28 21:24:46

0

您可以发布从JS(JSON)的对象和json_decode它在服务器上(PHP)与json_decode。

+0

这完全没有必要。 OP在JS端有JSON,如果他使用jQuery的'.post()'函数,他发送的数据被PHP视为数组。为什么你需要从JS对象构造字符串然后解码它? – Tadeck 2011-05-28 21:01:55

0

你也许可以做到这一点,但你必须完全手工做它像这样:

{ 
    "content[0]": "a", 
    "content[1]": "b", 
    "content[2]": "c", 
    "content[multi][0]": "d" 
} 

$_POST['content']然后将看起来像:

Array(
    0 => "a", 
    1 => "b", 
    2 => "c", 
    multi => Array(
     0 => "d" 
    ) 
) 

这将是一个简单得多,只是:

{ 
    "blob" : JSON.stringify(data_or_array_or_whatever) 
} 

在PHP然后你可以通过检索:

$data = json_decode($_POST['blob'], true); 

虽然这需要旧版浏览器的json2.js库。

我会为后者而去,因为你可能会在最后编写自己的序列化程序:P - 这正是我们拥有JSON的原因。

+0

@Frits使用jQuery并将数组赋值给JSON对象的一个​​属性(通过'.post()'方法发送给服务器的对象)不需要JSON stringify(在客户端)和解码(在PHP方面),所以不需要额外的库。 – Tadeck 2011-05-28 21:17:19

+0

那么为什么OP有问题呢?无论如何,我的观点是,如果你想在不使用jQuery的情况下做到这一点。 – Halcyon 2011-05-28 21:19:52

+1

@Frits因为他是初学者。但他询问更多有经验的人,他期望有人知道如何使用jQuery通过AJAX发送数据。但是,如果你试图在没有jQuery的情况下做到这一点,你可能是对的 - 我已经在问题的背景下看到了你的答案。然而,你说他需要json2.js,而不是 - 对他来说可能没有用或者甚至是合理的(他使用jQuery),但是我会尽快撤销我的downvote(它现在被锁定)。 – Tadeck 2011-05-28 21:26:18

相关问题