Вход

Просмотр полной версии : Возник POST вопрос


Artur_Hopf
27.05.2019, 11:19
Добрый день. Вопрос по поводу передачи массива из объектов.

Допустим у нас есть такая форма:

<form action="post.php" method="post">
<input type="text" name="post[0]['test1']" value="1"><br>
<input type="text" name="post[0]['test2']" value="2"><br>
<input type="text" name="post[1]['test1']" value="3"><br>
<input type="text" name="post[1]['test2']" value="4"><br>
<input type="submit" value="Отправить">
</form>


на выходе в post.php мы получим такой массив:

<?php
if(!empty($_POST['post'])){

print_r($_POST['post']);

Array
(
[0] => Array
(
['test1'] => 1
['test2'] => 2
)

[1] => Array
(
['test1'] => 3
['test2'] => 4
)

)
}


Если мы захотим передать такой же объект через jquery то результат будет таким же:


var post = {
'post': [
{
'test1': 1,
'test2': 2
},
{
'test1': 3,
'test2': 4
}
],
}
$.post("post.php", post, function(data) {
console.log(data);
}, "json");


Но вот если я хочу передать без jquety с помощью вот этой функции:

function postAjax(url, data, success) {
var params = typeof data == 'string' ? data : Object.keys(data).map(
function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
).join('&');
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.open('POST', url);
xhr.onreadystatechange = function() {
if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); }
if (xhr.status==500) { console.log(xhr.responseText); }
};
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(params);
return xhr;
}


То в php отправится такая строка:

post=%5Bobject%20Object%5D%2C%5Bobject%20Object%5D

Подскажите как переделать эту часть функции чтобы объект отправился нормально:


var params = typeof data == 'string' ? data : Object.keys(data).map(
function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
).join('&');

Artur_Hopf
27.05.2019, 12:05
Вот так получилось:
var post = [
{
'test1': 1,
'test2': 2
},
{
'test1': 3,
'test2': 4
}
];
var formData = new FormData(),
request = new XMLHttpRequest();

[].forEach.call(post, function(item, i) {
for (key in item) {
formData.append('post[' + i + ']['+key+']', item[key]);
}
})

request.open("POST", "post.php");
request.send(formData);

рони
27.05.2019, 12:24
[].forEach.call(post, function(item, i) {
post.forEach(function(item, i) {

Artur_Hopf
27.05.2019, 12:50
рони,
поправил, спасибо :thanks: