我正在尝试编写一些代码来从用户名中检索用户密码。
但是当我执行以下代码时,会出现此错误
““ 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')
编辑:格式化代码
答案 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')"