Python人脸识别项目:可识别人脸但无法从MySQL读取显示用户信息
问题分析与修复方案
核心错误点
- 查询结果处理错误:调用
fetchone()后已获取到单条结果(元组格式),但后续错误地尝试将游标对象用"+".join()拼接,游标并非可迭代的字符串集合,导致n、r、i无法得到正确的用户信息。 - 重复查询效率低下:针对同一个
Id执行三次独立查询,完全可以合并为一次查询获取所有需要的字段。 - 存在SQL注入风险:直接拼接字符串构造SQL语句,容易引发安全问题。
- 空值未处理:未考虑查询结果为空(无匹配
Id的记录)的情况,会导致后续代码报错。
修复后的代码片段
my_cursor = conn.cursor() # 一次查询获取所有字段,使用参数化查询避免SQL注入 sql = "select Name, RollNo, Id from student where Id = %s" my_cursor.execute(sql, (str(id),)) result = my_cursor.fetchone() # 初始化默认值,避免无匹配记录时出错 n = "Unknown" r = "Unknown" i = "Unknown" # 若查询到有效结果,提取对应字段值 if result: n, r, i = result if confidence > 77: cv2.putText(img, f"Name:{n}", (x, y - 75), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1) cv2.putText(img, f"Roll:{r}", (x, y - 40), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1) cv2.putText(img, f"Id:{i}", (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1) else: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3) cv2.putText(img, "Unknown Face", (x, y - 55), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 3) coord = [x, y, w, h] return coord
关键修复说明
- 合并查询+参数化:用单条SQL语句查询所有需要的字段,通过
%s占位符传递参数,既避免了SQL注入风险,又提升了查询效率。 - 正确处理结果:
fetchone()返回匹配的元组数据(若存在),直接解构赋值给变量;无匹配记录时使用默认值,防止后续代码报错。 - 移除无效操作:删除
"+".join(my_cursor)这类错误的游标拼接逻辑,直接使用查询返回的结果数据。
内容的提问来源于stack exchange,提问作者Rambo7153
相关产品推荐
相关产品推荐

