PHP中拼接$_POST参数的UPDATE SQL语句执行成功但未更新数据库
问题排查和解决方法
- 首先验证参数实际值
先打印$_POST['m_payment_id']的输出内容,排查是否存在空格、换行符、特殊字符,或者参数名拼写错误导致拿到的数值和预期的固定值不一致,匹配不到对应txn_id自然不会触发更新。也可以直接打印拼接后的完整SQL,复制到数据库管理工具中直接执行,验证是否能正常修改数据:// 调试用代码,定位问题后可删除或注释 $payment_id = $_POST['m_payment_id']; var_dump($payment_id); $sql = "UPDATE `transactions` SET `status` ='Success' WHERE `transactions`.`txn_id` = ".$payment_id; echo $sql; - 排查数据类型匹配问题
如果txn_id字段是数值类型,$_POST获取的参数默认是字符串类型,部分数据库开启严格模式时会出现类型不匹配无法命中数据的问题,建议先把参数转为对应数值类型再拼接:$payment_id = intval($_POST['m_payment_id']); $sql = "UPDATE `transactions` SET `status` ='Success' WHERE `transactions`.`txn_id` = ".$payment_id; - 校验事务逻辑
确认事务代码是否正常执行了commit操作,排查有没有逻辑分支触发了rollback,或者代码漏写了事务提交语句导致更新被回滚。 - 修复SQL注入风险同时验证执行结果
直接拼接用户传入的$_POST参数到SQL语句存在严重的SQL注入漏洞,建议改为预处理语句执行,同时可以通过影响行数判断实际更新结果,比单纯的事务执行状态更准确:// PDO预处理示例 $pdo = new PDO('mysql:host=数据库地址;dbname=库名;charset=utf8', '用户名', '密码'); $stmt = $pdo->prepare("UPDATE `transactions` SET `status` ='Success' WHERE `transactions`.`txn_id` = ?"); $stmt->execute([intval($_POST['m_payment_id'])]); // 输出影响行数,返回1则更新成功,返回0说明没有匹配到对应数据 echo $stmt->rowCount();
内容的提问来源于stack exchange,提问作者Youssef Mohamed
相关产品推荐
相关产品推荐

