PHP mysqli代码无法更新数据库却返回成功,请求修正代码
问题分析与代码修正
你的代码存在三个核心问题,导致提示成功但实际未更新数据:
- 参数来源不匹配:代码判断
$_GET['edit']是否存在,但绑定参数时却使用$_POST['edit'],两者不一致会导致传入的orderId值错误或为空,无法匹配到目标订单。 - 更新字段逻辑错误:将
customerTelephone(客户电话)字段设置为'delivered'(已配送),这明显不符合业务逻辑,应该更新订单状态类的字段(比如orderStatus),如果确实需要修改电话,也不应设置为该字符串。 - 未校验实际更新行数:
mysqli_stmt_execute()返回true仅代表SQL语法执行无误,不代表有数据被修改,可能是orderId不存在导致没有匹配到任何行。
修正后的代码如下:
<?php if (isset($_GET['edit'])) { global $conn; // 统一参数来源为GET,先获取并校验有效性 $orderId = $_GET['edit']; if (!is_numeric($orderId)) { echo "无效的订单ID"; exit; } // 修正更新字段为订单状态(根据实际表结构调整字段名) $stmt = mysqli_prepare($conn, "UPDATE orders SET orderStatus='delivered' WHERE orderId=?"); if (!$stmt) { echo "预编译语句错误: " . mysqli_error($conn); exit; } // 绑定正确的参数 if (!mysqli_stmt_bind_param($stmt, "i", $orderId)) { echo "绑定参数错误: " . mysqli_stmt_error($stmt); exit; } if (!mysqli_stmt_execute($stmt)) { echo "执行语句错误: " . mysqli_stmt_error($stmt); exit; } // 检查实际受影响行数,确认是否真的更新了数据 $affectedRows = mysqli_stmt_affected_rows($stmt); if ($affectedRows > 0) { echo "成功!订单已更新。"; } else { echo "未找到匹配的订单,或订单状态无需更新。"; } // 关闭语句和连接(建议养成习惯) mysqli_stmt_close($stmt); mysqli_close($conn); } else { echo "未指定要编辑的订单"; } ?>
额外说明:
- 如果你的
orderId是字符串类型(比如UUID),需要把绑定参数的类型从"i"改为"s"。 - 请根据实际数据库表结构,将
orderStatus替换为你实际要更新的状态字段名。 - 增加了参数有效性校验,避免传入非法值导致的问题。
内容的提问来源于stack exchange,提问作者Edmond Kiryowa
相关产品推荐
相关产品推荐

