删除订单时,如果订单已经添加了物料,最多可能有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 生成】
以上代码是可行的,它提供了在删除订单时处理多条商品信息的方法。以下是代码的解释和改进建议:
确保从外部输入的变量(如$oid、$code和$codename)在使用之前经过正确的转义,以防止SQL注入攻击。
查询商品信息的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();
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);
使用事务可以确保删除商品记录和更新库存数量的操作的一致性。
if($res1 != false && $res2 != false && $res3 != false){
$info = "删除成功";
$status = 1;
}else{
$info = "Error: step1 delete order 103";
$status = 0;
// 处理错误
// 可以打印错误信息或者记录日志
}
通过以上改进,可以确保代码的可靠性,并提高代码的安全性和性能。
【相关推荐】