PHP PDO更新表函数故障求助:Udemy课程编写的代码无法运行
分析你的PHP PDO更新函数问题
我帮你排查了代码里的几个关键问题,这应该就是它无法正常工作的核心原因:
1. 列名错误地使用了单引号
你在SQL语句里给列名加了单引号(比如'user_id'和'{$name}'),这会让MySQL把这些内容当成字符串字面量,而不是表的列名。举个例子,WHERE子句里的'user_id' = {$user_id}实际上是在比较字符串'user_id'和你的$user_id值,这显然永远不匹配,所以更新操作根本找不到要修改的行。
正确的做法是:列名不需要加单引号,如果列名有特殊字符或者和关键字冲突,用反引号(`)包裹,或者直接省略引号(只要列名合法)。
2. $user_id直接拼接在SQL里,有安全风险且易出错
你把$user_id直接拼进了SQL语句,这不仅存在SQL注入的安全隐患,当$user_id是字符串类型时还会导致语法错误。应该像处理其他字段一样,用参数绑定的方式来处理它。
3. 缺少错误处理逻辑
你的代码没有处理prepare()或者execute()失败的情况,这会让你很难排查具体的错误原因(比如SQL语法错误、数据库连接问题等)。
修正后的完整代码
public function update($table, $user_id, $fields = array()){ $columns = ''; $i = 1; foreach($fields as $name => $value){ // 列名用反引号包裹,避免关键字冲突 $columns .= "`{$name}` = :{$name}"; if($i < count($fields)){ $columns .= ', '; } $i++; } // 修改WHERE子句,用占位符绑定user_id,列名去掉单引号 $sql = "UPDATE {$table} SET {$columns} WHERE `user_id` = :user_id"; try { if($stmt = $this->pdo->prepare($sql)){ // 绑定字段参数 foreach($fields as $key => $value){ $stmt->bindValue(':'.$key, $value); } // 绑定user_id参数 $stmt->bindValue(':user_id', $user_id); // 执行并检查是否成功 if($stmt->execute()){ // 返回受影响的行数,方便调用方判断是否真的更新了数据 return $stmt->rowCount(); } else { throw new Exception("执行更新语句失败: " . implode(', ', $stmt->errorInfo())); } } else { throw new Exception("预处理语句失败: " . implode(', ', $this->pdo->errorInfo())); } } catch(Exception $e){ // 这里可以根据需求记录日志或者返回错误信息 error_log($e->getMessage()); return false; } }
额外说明
- 用
rowCount()返回受影响的行数,调用这个方法时可以知道是否真的有行被更新(比如用户输入的内容和原数据一致时,rowCount会返回0)。 - 增加了try-catch块来捕获异常,方便排查错误,你可以根据项目需求调整错误处理的方式(比如返回错误信息给前端,或者写入日志)。
- 列名用反引号包裹是个好习惯,尤其是当你的列名和MySQL关键字(比如
update、user等)重名时,能避免语法错误。
内容的提问来源于stack exchange,提问作者A. Maher
相关产品推荐
相关产品推荐

