Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在where子句中会出现“未知列‘Jacob’”?_Python_Mysql_Sql - Fatal编程技术网

Python 为什么在where子句中会出现“未知列‘Jacob’”?

Python 为什么在where子句中会出现“未知列‘Jacob’”?,python,mysql,sql,Python,Mysql,Sql,我正在尝试编写一段代码,从他的用户名中检索用户密码 但是当我执行以下代码时,我得到了这个错误 “where子句”中的未知列“Jacob” 我的用户表: 编辑:格式化代码您没有正确地参数化查询,因此它将文本值传递给SQL,而不是将其括在字符串引号中。同样,LIKE值不需要用括号括起来 使用execute方法的正确方法如下-将值作为参数传入,而不是执行字符串插值: def get_passwd(user_name): user_passwd = mycursor.execute("SELEC

我正在尝试编写一段代码,从他的用户名中检索用户密码

但是当我执行以下代码时,我得到了这个错误

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

我的用户表:


编辑:格式化代码

您没有正确地参数化查询,因此它将文本值传递给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注入的风险

有关更多详细信息,请参阅


另外,我想问你为什么要写一个检索用户密码的方法……为了有一个安全的环境,密码不能以纯文本形式存储,而是单向散列,然后再也无法检索。要在登录期间检查密码有效性,请使用相同的salt再次散列密码,并查看其是否与数据库版本匹配。如果用户忘记了密码,请编写一个例程,允许他们重置密码,而不是检索密码。

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

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

你在找这样的人吗

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

通过“雅各布”

虽然这很容易受到攻击

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

在用户名变量周围需要单引号。但你为什么要把密码存储在这样一个表中呢?今天就开始编码,明天就会泄露信息。听起来是时候从[Bobby Tables如果您正确地参数化了查询,则不会这样做,从而避免了过程中的SQL注入风险。此版本不安全。这是一个更大的问题的包袱:。不应该,必须。至少使用。@tadman true。没有充分注意措辞。立即修改。谢谢。正确的哈希密码是安全的混蛋。这解决了问题。我不在乎安全,因为这只是一个练习project@JacobPedersen很高兴它对您有所帮助。请记住将答案标记为已接受。单击答案旁边的勾号,使其变为绿色-谢谢。P.S.仅仅因为这是一个实践项目,并不能成为您养成良好习惯的借口安全性。那么当你真正做到这一点时,你就不必再学习这项技术了。这项技术简单易行,没有什么理由不正确地去做。不要把那些不能真正解决问题的快速修复建议作为你答案的第一部分。第二部分是真正的建议。第一部分是pl这并不危险。
user_name = // assign your parameter in this variable
user_passwd = mycursor.execute('SELECT passwd FROM users WHERE name LIKE ?' ,user_name)