为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 PHP 中访问并返回 foreach 的特定值

如何在 PHP 中访问并返回 foreach 的特定值

PHP
慕田峪9158850 2024-01-19 16:44:43
所以我有一个如下所示的请求响应$json='[ {"item_cat":"Stationary","items":[{"item_name":"A4 Paper","qty":"2"},{"item_name":"Test Paper","qty":"6"}],"total":"2"},{"item_cat":"Computer Accessory ","items":[{"item_name":"Power pack","qty":"2"}],"total":"1"},{"item_cat":"Material","items":[{"item_name":"T-Shirt","qty":"3"},{"item_name":"Cap","qty":"5"}],"total":"2"}]';我正在尝试获取每个 item_name 和 qty,以便我可以使用它们来操作我的数据库。这是我所做的$data = json_decode($json, true);$len = count($data);    for($i =0; $i< $len; $i++){            $item_length = count($data[$i]['items']);        for($c=0; $c < $item_length; $c++){            foreach ($data[$i]['items'][$c] as $key => $value ) {                $qty = '';                if($key == "qty"){                    $qty = $data[$i]['items'][$c];                    }                if($key == 'item_name'){                    $item_name = "$value";                    }                    $sql= $db->query("SELECT `stock` from `inventory` WHERE `item_name` = '$item_name'");                    while ($sql1 = $sql->fetch_assoc()) {                            $stock = $sql1['stock'];                  }                    if($stock > $qty ){                        $stock_balance = $stock - $qty;                    $quantity = (int)$qty;                         $db->query("UPDATE `inventory` SET `stock` =  (`stock` - '$quantity')   WHERE `item_name` = '$item_name'");                    }else{                        echo "<h3> This Operation Not Allowed: Stock Balance Is Less Than The Request <h3>";                    }                }            }        }遇到非数字值,这是 $qty 的结果,因为我无法仅返回 qty 值。我尝试过其他几种方法。我真的很累了。如果有任何帮助,我将不胜感激。干杯!
查看完整描述

1 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

让我们分解你的代码。


这是json:


[

   {

      "item_cat":"Stationary",

      "items":[

         {

            "item_name":"A4 Paper",

            "qty":"2"

         },

         {

            "item_name":"Test Paper",

            "qty":"6"

         }

      ],

      "total":"2"

   },

   {

      "item_cat":"Computer Accessory ",

      "items":[

         {

            "item_name":"Power pack",

            "qty":"2"

         }

      ],

      "total":"1"

   },

   {

      "item_cat":"Material",

      "items":[

         {

            "item_name":"T-Shirt",

            "qty":"3"

         },

         {

            "item_name":"Cap",

            "qty":"5"

         }

      ],

      "total":"2"

   }

]

现在没有 SQL 的数组循环(以确保它按预期工作):


$data = json_decode($json, true);

$len = count($data);


    for($i =0; $i< $len; $i++){

            $item_length = count($data[$i]['items']);


        for($c=0; $c < $item_length; $c++){

            foreach ($data[$i]['items'][$c] as $key => $value ) {


                $qty = '';

                if($key == "qty"){

                    $qty = $data[$i]['items'][$c];

                    }


                if($key == 'item_name'){

                    $item_name = "$value";

                    }

这里的问题是:非人类变量名称以及不正确使用 JSON 对象。

首先,让我们将变量重命名为可读的名称。

例子:

  • $data[$i]将是$catalog_entry(对象)

  • $data[$i]['items']将是$catalog_entry_items(数组)

  • $data[$i]['items'][$c]将是$catalog_entry_item(一件物品,一个物体)

让我们用新变量更改代码:

$data = json_decode($json, true);

$len = count($data);


for($i =0; $i< $len; $i++) {

    $catalog_entry = $data[$i];

    $catalog_entry_items = $data[$i]['items'];

    

    for($c=0; $c < sizeof($catalog_entry_items); $c++) {

        $catalog_entry_item = $data[$i]['items'][$c];

        $qty = $catalog_entry_item['qty'];

        $item_name = $catalog_entry_item['item_name'];

        echo $item_name . ' : ' . $qty . "\n"; // <-- this is for testing

    }

}

运行此代码并查看预期结果:


A4 Paper : 2

Test Paper : 6

Power pack : 2

T-Shirt : 3

Cap : 5

很好,现在我们有了qty和item_name。


我们来查询一下。首先看看你的代码:


$sql= $db->query("SELECT `stock` from `inventory` WHERE `item_name` = '$item_name'");

                    while ($sql1 = $sql->fetch_assoc()) {

                            $stock = $sql1['stock'];

                  }

两个奇怪的事情:1)可能的 SQL 注入,2)$stock用新值多次替换变量(如果我们有超过 1 行的项目inventory)。


无论如何,如果这段代码有效(我无法检查),那么我们进入下一部分:


if ($stock > $qty ) {

    $stock_balance = $stock - $qty;

    $quantity = (int)$qty;

    $db->query("UPDATE `inventory` SET `stock` =  (`stock` - '$quantity')   WHERE `item_name` = '$item_name'");

} else {

    echo "<h3> This Operation Not Allowed: Stock Balance Is Less Than The Request <h3>";

}

首先,不必要地转换为整数,因此删除行$quantity = (int)$qty;并放入$stock_balance查询中。我们将有:


if ($stock >= $qty ) {

    $stock_balance = $stock - $qty;

    $db->query("UPDATE `inventory` SET `stock` =  $stock_balance WHERE `item_name` = '$item_name'");

} else {

    echo "<h3> This Operation Not Allowed: Stock Balance Is Less Than The Request <h3>";

}

……好吧……不只是你累了,所以我现在就结束吧。询问是否有什么不正确或不理解的地方。


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 21 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信