1 回答
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>";
}
……好吧……不只是你累了,所以我现在就结束吧。询问是否有什么不正确或不理解的地方。
- 1 回答
- 0 关注
- 62 浏览
添加回答
举报