PHP接收GET参数更新sales表记录状态无响应,求排查
问题分析与修复方案
我帮你排查了代码里的几个关键问题,这些就是导致你更新数据库记录没反应的核心原因:
1. 模型获取数据的逻辑错误
你的mdlShowSales方法用了fetch(),这个方法只会从结果集中取出第一条记录,而不是整个sales表的所有数据。这就导致你的foreach循环根本遍历不了全部记录,自然找不到匹配的number值。
修正后的模型方法:
static public function mdlShowSales($table){ $stmt = Conection::conect()->prepare("SELECT * FROM $table"); $stmt->execute(); $result = $stmt->fetchAll(); // 改用fetchAll()获取所有记录 // 先清理连接资源再返回结果 $stmt->close(); $stmt = null; return $result; }
2. 控制器变量名不匹配
你在控制器里用$respuesta = CartModel::mdlShowSales($table);接收模型返回的数据,但foreach循环却用了未定义的$response变量——这会直接触发PHP警告,循环根本无法执行。
修正后的控制器循环部分:
// 把$response改成$respuesta foreach ($respuesta as $key => $value) { if ($value["number"] == $number) { $find = 1; $id = $value["id"]; break; } }
3. 更新SQL语句的语法与绑定错误
mdlUpdateRecord里的SQL语句写反了,WHERE子句应该是id = :id,而不是$id = :$id(这种写法既语法错误,又存在SQL注入风险)。同时参数绑定的逻辑也需要调整,确保变量和占位符对应。
修正后的更新方法:
static public function mdlUpdateRecord($table, $id) { $status = "Verified"; $stmt = Conection::conect()->prepare("UPDATE $table SET status = :status WHERE id = :id"); $stmt->bindParam(":id", $id, PDO::PARAM_INT); $stmt->bindParam(":status", $status, PDO::PARAM_STR); $result = $stmt->execute() ? "ok" : "error"; // 先清理资源再返回结果 $stmt->close(); $stmt = null; return $result; }
4. 代码执行顺序问题
你原来的代码里,return语句写在连接清理代码之前,这会导致close()和变量置空的逻辑永远不会执行,虽然不影响功能,但会造成数据库连接资源泄漏。建议调整顺序,先清理资源再返回结果。
修正后的完整控制器代码
static public function ctrShowSales($number){ $table = "sales"; $respuesta = CartModel::mdlShowSales($table); $find = 0; $id = null; foreach ($respuesta as $key => $value) { if ($value["number"] == $number) { $find = 1; $id = $value["id"]; break; } } if ($find == 1){ $response2 = CartModel::mdlUpdateRecord($table, $id); return $response2; } else { return "Did not find"; } }
另外建议开启PHP错误提示(添加error_reporting(E_ALL); ini_set('display_errors', 1);),这样能快速定位变量未定义、SQL语法错误这类问题,方便调试。
内容的提问来源于stack exchange,提问作者user10631553
相关产品推荐
相关产品推荐

