You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类实现MySQL用户行存在校验功能触发1064语法错误求助

错误原因

  • 直接触发语法报错的原因是字符串类型参数未加引号:你通过format方法拼接SQL时,邮箱属于字符串类型,拼接后没有被单/双引号包裹,MySQL会将邮箱值识别为标识符而非字符串常量,最终生成的非法SQL类似SELECT COUNT(1) FROM user WHERE email = test@gmail.com,触发1064语法错误。你在MySQL查询编辑器中测试时手动给邮箱加了引号,因此可以正常运行。
  • 该写法还存在严重的SQL注入风险:直接拼接用户可控参数到SQL中,攻击者可以构造特殊邮箱值篡改SQL逻辑,拖取全表数据甚至控制数据库。

修复方案

推荐使用MySQL驱动自带的参数化查询功能,不要手动拼接SQL参数:

def has_user(self, table_name : str, user_credentials: UserCredentials) -> bool:
    # 表名属于标识符无法参数化,需提前校验合法性避免注入
    if not table_name.replace('_', '').isalnum():
        raise ValueError("无效表名")

    # 仅对表名做格式化,查询参数用%s作为占位符,无需额外加引号
    mysql_hasuser_query = f"""
    SELECT COUNT(1) FROM {table_name} WHERE email = %s
    """

    cursor = self.connection.cursor()
    # 参数以元组形式传入execute的第二个参数,驱动会自动处理转义、加引号
    cursor.execute(mysql_hasuser_query, (user_credentials.email,))
    if cursor.fetchone()[0]:
        print("User exists in database!")
        return True
    return False

内容的提问来源于stack exchange,提问作者Ossz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 22:39:03