如何将JSON解码为PHP数组/变量

时间:2017-05-22 22:44:28

标签: javascript php jquery json ajax

我是PHP的新手,并且无法用这种语言理解关于将POST请求中的数据传递给PHP的几点。这是我对我的代码和问题的一点描述:

我有一些序列化数组,它被转换为JSON并需要通过ajax发送到PHP,所以我可以使用数组中的这些值将它们插入到数据库中。

这是我的代码:

验证函数,我只获取所有经过验证的表单(填充表单)中的值,因为其中一些值可能是空的。我正在使用。 serializeArray()对这些表单进行编码,然后我将它们转换为JSON,因为在此函数结束时我需要返回一个数组,以便我可以在ajax POST中使用它。 / p>

// Validate forms
function validateForms() {
var formData = [];

$('#add-items form').each(function () {
    var itemFormId = $(this).attr('id');

    if ($(this)[0].checkValidity() == false) {
        console.log("Empty forms: " + itemFormId);
    } else {
        console.log("Filled forms: " + itemFormId + "\n");       
        var formDataX = $(this).serializeArray();

        switch (itemFormId) {
            case 'equippable-item-form':
                formDataX.push({name: 'item-type', value: "equippable"});
                break;
            case 'weapon-form':
                formDataX.push({name: 'equippable-item-type', value: "weapon"});
                break;
            case 'armor-form':
                formDataX.push({name: 'equippable-item-type', value: "armor"});
                break;
        }
        formData.push(...formDataX);
    }
});

formData = JSON.stringify(formData);
console.log(formData);
return formData;
}

以下是简短版本的ajax POST:

formData = validateForms();
$.ajax({
    type: 'POST',
    url: 'php/admin.php',
    data: { items_data: formData },   
    success: function (data) {
         data = $.parseJSON(data);
         $("#status-message").text(data.message);
    },
 });

PHP代码,我正在获取此POST并尝试解码此JSON:

if (isset($_POST['items_data'])) {
    $data = json_decode(stripslashes($_POST['items_data']),true);
    $status = testNewItem($data['item-name-input'], $data['price-input'], $data['item-level-input'], $data['required-level-input']);
}

// Print the status
if ($status):
    echo json_encode(["message" => $status]);
endif;

这是我的database.php中的代码,我将值插入数据库:

function testNewItem($itemName, $price, $itemLevel, $reqLevel)
{
    $conn = connection();
    $conn->query("INSERT INTO item (`name`, `price`, `item_level`, `required_level`) VALUES ('" . $itemName . "', $price, $itemLevel, $reqLevel)");
    $conn->errorInfo();

    $status = "Successfully inserted new item into the database!";

    return $status;
    $conn = null;
}

我的JSON的简短版本:

[{
    "name": "item-name-input",
    "value": "asdasd"
}, {
    "name": "price-input",
    "value": "2"
}, {
    "name": "item-level-input",
    "value": "4"
}, {
    "name": "required-level-input",
    "value": "2"
}]

问题:我不知道我是否正确解码了这个JSON数组,但是在POST成功后我无法打印它。此外,我不知道如何将这些值从 $ data 传递到名为 testNewItem 的函数中,该函数应该将此值插入数据库中(如果我放入此函数,则此函数可正常工作手动固定值)。我尝试了很多解决方案,我在这里找到了stackoverflow,但找不到我在做错的地方。

如果有人能帮助我,我会非常感激。

2 个答案:

答案 0 :(得分:1)

目前你的json有这样的结构

Array
(
    [0] => Array
        (
            [name] => item-name-input
            [value] => asdasd
        )

    [1] => Array
        (
            [name] => price-input
            [value] => 2
        )

    [2] => Array
        (
            [name] => item-level-input
            [value] => 4
        )

    [3] => Array
        (
            [name] => required-level-input
            [value] => 2
        )

)

以你想要的方式访问它,你必须将json数组转换为键值格式。这可以这样做

$json_data = json_decode(stripslashes($_POST['items_data']),true);
$data = [];
foreach ($json_data as $item) {
    $data[$item['name']] = $item['value'];
}

或者如果您不想使用循环

$data = array_combine(
    array_column($data, 'name'),
    array_column($data, 'value'));

答案 1 :(得分:0)

你的json正被转换为一个阵列,下面有更多的数组。

您正尝试使用$ data访问它,但您需要执行$ data [0]才能访问第一个数组。

$ data [0] [' name'] = item-name-input