【问题标题】:Update array with post values使用帖子值更新数组
【发布时间】:2022-01-03 15:46:05
【问题描述】:

我目前正在尝试使用另一个数组的值更新一个数组。 基本上有一个表单,您可以在其中更新对象的数据,表单发送一个 json 数组,如下所示:

{
    "name": "Test2",
    "address": "Adresas 2",
    "object_id": "44",
    "job_id": [
            "31",
             "33"
             ],
    "amount": [
        "500",
        "500"
    ]
}

我的目标是使用 job_idd 和 amount 的值更新从数据库中获取的另一个数组。

数据库中的数组如下所示:

{
    "jobs": [
        {
            "id": "31",
            "amount": "500",
            "have": 250
        },
        {
          "id": "33",
          "amount": "500",
          "have": 0
        }
    ]
}

我需要用第一个数组“amount”中的发布值更新第二个数组值“amount”,但这样第二个数组仍然具有原始“have”值

我尝试使用嵌套的 foreach 方法:

$object_id = $_POST['object_id'];
$data = json_encode($_POST);
$json = json_decode($data, true);
$i = 0;

foreach($json['job_id'] as $item) {

    $job_id = $item;

    $query33 = "SELECT * FROM `objektai` WHERE id='$object_id'"; 
    $result33 = mysqli_query($conn, $query33) or die(mysqli_error($conn));
         
    while($row2 = mysqli_fetch_array($result33)){
        $job_info = $row2['info'];
    }

    $json_22 = json_decode($job_info, true);

    foreach ($json_22['jobs'] as $key2 => $entry2) {
        $have = $json_22['jobs'][$key2]['have'];
    }

    $result["jobs"][] = array(
        'id' => $job_id,
        'kiekis' => $json['amount'][$i],
        'turima' => $have,
        );

    $i++;
}

使用上面的示例,foreach 会打印 2 次值,而我更新的 json “拥有” 值为 0,“金额”条目已正确更新

提前感谢您的帮助!

更新

添加 var_export($_POST):

array ( 'name' => 'Test2', 
        'address' => 'Adresas 2', 
        'object_id' => '44', 
        'job_idd' => array ( 
                0 => '31', 
                1 => '33', 
        ), 
        'darbo_kiekis' => array ( 
                0 => '500', 
                1 => '500', 
        ), 
    )

【问题讨论】:

  • 良好的代码缩进将帮助我们阅读代码,更重要的是,它将帮助您调试代码Take a quick look at a coding standard 为您自己的利益。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • 警告:您对SQL Injections 持开放态度,应该使用参数化的prepared statements,而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your dataEscaping is not enough!
  • 在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?
  • 请先向我们展示var_export($_POST);
  • $_POST 与 JSON 之间的转换有什么意义?

标签: php arrays json


【解决方案1】:

当您从数据库中循环遍历数组时,您需要将id 值与$obj_id 进行比较。

我还在下面展示了如何使用准备好的语句来防止 SQL 注入。

我删除了很多不必要的代码:

  1. 无需将$_POST 与JSON 相互转换。
  2. foreach 循环中使用$i => 来获取数组索引。
  3. 如果只返回一行,则在处理查询结果时不需要while 循环。
  4. 你不需要$key2,你可以使用$entry2
$object_id = $_POST['object_id'];

$query33 = "SELECT * FROM `objektai` WHERE id = ?"; 
$stmt33 = $conn->prepare($query33);
$stmt33->bind_param('i', $job_id);

foreach($_POST['job_id'] as $i => $job_id) {
    $stmt33->execute();
    $result33 = $stmt33->get_result();
    $row2 = $result33->fetch_assoc();
    $job_info = $row2['info'];

    $json_22 = json_decode($job_info, true);

    foreach ($json_22['jobs'] as $entry2) {
        if ($entry2['id'] == $job_id) {
            $result["jobs"][] = array(
                'id' => $job_id,
                'kiekis' => $json['amount'][$i],
                'turima' => $entry2['have']
            );
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多