为什么得到“ where子句中的未知列'Jacob'”?

时间:2018-12-19 16:40:28

标签: python mysql sql

我正在尝试编写一些代码来从用户名中检索用户密码。

但是当我执行以下代码时,会出现此错误

  

““ where子句”中的未知列“ Jacob””

我的用户表:https://gyazo.com/c3f9aff0e0ceea9be39ba51c4a8680f3

def get_passwd(user_name):
    user_passwd = mycursor.execute("SELECT passwd FROM users WHERE name LIKE (%s)"%(user_name))
     print(user_passwd)

get_passwd('Jacob')

编辑:格式化代码

3 个答案:

答案 0 :(得分:2)

您没有正确设置查询的参数,因此它会将文字值传递给SQL,而不是将其用字符串引号引起来。另外,LIKE值不需要用括号括起来。

使用execute方法的正确方法如下-将值作为参数传递,而不是进行字符串插值:

def get_passwd(user_name):
    user_passwd = mycursor.execute("SELECT passwd FROM users WHERE name LIKE %s", ('%' + user_name + '%',))
    print(user_passwd)

get_passwd('Jacob')

请注意,现在如何在用户名值的前面和后面加上声明为字符串的'%'-因此在SQL内形成一个包含通配符运算符的字符串,而不是python字符串连接运算符。

还请注意如何将值不插值到字符串中,而是作为一个单独的参数的一部分传递给execute()方法,以正确地进行参数化和转义-从而帮助语法和处理SQL的风险注射。

有关更多详细信息,请参见https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html


P.S。我想问一问,为什么您要编写一种完全可以检索用户密码的方法...要拥有一个适当安全的环境密码,一定不能以纯文本形式存储密码,而应以单向散列然后再也无法检索的方式进行。要在登录期间检查密码的有效性,请使用相同的盐再次对密码进行哈希处理,以查看其是否与数据库版本匹配。而且,如果用户忘记了密码,请编写例程以允许他们重置密码,而不是找回密码。

答案 1 :(得分:0)

您是否正在寻找这样的

def get_passwd(user_name):
user_passwd = mycursor.execute("SELECT passwd FROM users WHERE name LIKE '%s'"%user_name)
 print(user_passwd)

致电

  

get_passwd('Jacob')

尽管这很容易受到攻击。

user_name = // assign your parameter in this variable
user_passwd = mycursor.execute('SELECT passwd FROM users WHERE name LIKE ?' ,user_name)

答案 2 :(得分:-1)

您需要在%s周围添加单引号

"SELECT passwd FROM users WHERE name LIKE ('%s')"