PHP删除订单时,如果有多条商品信息该怎么处理

删除订单时,如果订单已经添加了物料,最多可能有200多条,就要循环查出来,删除对应的物料,再逐个返还库存,最后清空该订单。
菜鸟请教,这样写靠谱吗?
```php
        $sql2 = "delete from orderdiff where oid = '$oid' and codename = '$code'";
        $sql3 = "delete from orderlist where orderid = '$oid' and codename = '$code'";
        /*查询物料id,出货数量 ,最多可能有200条物料信息*/
        $sql = "select id,pid,outnum from orderdetail where orderid='$oid' and codename='$codename'";
        $res = mysqli_query($link,$sql);
        while($row = mysqli_fetch_array($res)){
            $id = $row['id'];
            $outnum = $row['outnum'];
            $pid = $row['pid'];
            $sql_del = "delete from orderdetail where id='$id'";
            $sql_ps = "update products set pnum = pnum + $outnum where pid='$pid'";
            mysqli_query($link,$sql_del);
            mysqli_query($link,$sql_ps);
        }
        //$res1 = mysqli_query($link,$sql1);
        $res2 = mysqli_query($link,$sql2);
        $res3 = mysqli_query($link,$sql3);
        if($res1 !=false && $res2 != false && $res3 != false){
            $info="删除成功";
            $status = 1;
        }else{
            $info="Error:step1 delete order 103";
            $status = 0;
        }

```

【以下回答由 GPT 生成】

以上代码是可行的,它提供了在删除订单时处理多条商品信息的方法。以下是代码的解释和改进建议:

  1. 确保从外部输入的变量(如$oid、$code和$codename)在使用之前经过正确的转义,以防止SQL注入攻击。

  2. 查询商品信息的SQL语句中的变量应该使用占位符,而不是直接将变量嵌入SQL语句中。使用占位符可以防止SQL注入攻击,并提高查询性能。示例代码如下:

$sql = "select id, pid, outnum from orderdetail where orderid = ? and codename = ?";
$stmt = $link->prepare($sql);
$stmt->bind_param("ss", $oid, $codename);
$stmt->execute();
$res = $stmt->get_result();
while($row = $res->fetch_assoc()){
    // 处理每个商品信息
}
$stmt->close();
  1. 在删除商品记录和更新库存数量之前,建议在事务中执行这些操作。这样可以确保这些操作的原子性,如果其中一个操作失败,可以回滚所有操作。示例代码如下:
mysqli_begin_transaction($link);

// 循环遍历商品信息
while($row = $res->fetch_assoc()){
    $id = $row['id'];
    $outnum = $row['outnum'];
    $pid = $row['pid'];

    $sql_del = "delete from orderdetail where id = ?";
    $stmt_del = $link->prepare($sql_del);
    $stmt_del->bind_param("i", $id);
    $stmt_del->execute();
    $stmt_del->close();

    $sql_ps = "update products set pnum = pnum + ? where pid = ?";
    $stmt_ps = $link->prepare($sql_ps);
    $stmt_ps->bind_param("is", $outnum, $pid);
    $stmt_ps->execute();
    $stmt_ps->close();
}

mysqli_commit($link);

使用事务可以确保删除商品记录和更新库存数量的操作的一致性。

  1. 最后,建议在处理数据库操作时,对可能出现的错误添加错误处理代码。这样可以对错误进行处理并提供更准确的错误信息。示例代码如下:
if($res1 != false && $res2 != false && $res3 != false){
    $info = "删除成功";
    $status = 1;
}else{
    $info = "Error: step1 delete order 103";
    $status = 0;
    // 处理错误
    // 可以打印错误信息或者记录日志
}

通过以上改进,可以确保代码的可靠性,并提高代码的安全性和性能。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^