Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何根据批次号更新库存数量_Php_Mysql - Fatal编程技术网

Php 如何根据批次号更新库存数量

Php 如何根据批次号更新库存数量,php,mysql,Php,Mysql,我正在开发一个应用程序,在该应用程序中,我使用不同的批号保存一个项目的数量。请查看数据库示例: 总和(qty\u avbl)显示可供销售的总数量为17。我想卖一件7件的货。如何从上表中选择并将该项目插入销售表 我尝试过以下代码: $pid = 7901; $order = 7; $gets = mysqli_query($con, "SELECT * FROM `purchase_order`

我正在开发一个应用程序,在该应用程序中,我使用不同的批号保存一个项目的数量。请查看数据库示例:

总和(qty\u avbl)
显示可供销售的总数量为17。我想卖一件7件的货。如何从上表中选择并将该项目插入销售表

我尝试过以下代码:

$pid = 7901;
$order = 7;
$gets = mysqli_query($con, "SELECT * 
                            FROM `purchase_order` 
                            WHERE `pid` LIKE '$pid' 
                            AND `qty_avbl` > 0 ")
            or die(mysqli_error($con));
while($rows = mysqli_fetch_array($gets)){
    $getBatchNumber = $rows['batch_number'];
    $qty_avble = $rows['qty_avbl'];
            
    mysqli_query($con,"UPDATE `purchase_order` 
                            SET `qty_avbl`=`qty_avbl` - $order 
                        WHERE `qty_avbl` > 0 
                        LIMIT 1")
        or die("err Update ".mysqli_error($con));
}

警告您当前的代码易受SQL注入攻击。请确保始终使用参数化的预处理语句,并且不要在代码中使用
die(mysqli_erro($con))

不需要任何PHP逻辑就可以解决这个问题。在SQL中,最好一步完成此类操作。然而,这项任务不是很容易一步完成,但它是可能的一个技巧。诀窍是在
UPDATE
语句中使用一个临时变量来跟踪已使用的库存

$con->begin_transaction();

$con->query('SET @qty = 7');
$stmt = $con->prepare('UPDATE purchase_order 
    SET qty_avbl = qty_avbl-(@bought := LEAST(@qty,qty_avbl)), 
    qty_avbl = if(@qty := @qty-@bought, qty_avbl, qty_avbl) 
    WHERE pid = ?
    ORDER BY batch_number');
$stmt->bind_param('s', $pid);
$stmt->execute();

$con->commit();

好的代码缩进将帮助我们阅读代码,更重要的是,它将帮助您为自己的利益调试代码。您可能会被要求在几周/几个月内修改此代码,最终您将感谢我。您的脚本将开放给我。甚至您也应该始终在
MYSQLI_uquot>或
PDO
API中使用,而不是将用户提供的值连接到查询中。永远不要相信任何用户输入!使用
die(mysqli_error($conn))是一个非常糟糕的主意
在您的代码中,因为它可能会泄漏敏感信息。有关更多说明,请参阅本文: