我正在制作一个程序,该程序是小学教师设置的测验的用户界面。我正在尝试使用用户在上一页输入的数据的查询。它正在数据库中寻找与相关用户名和测验编号相匹配的人。这样老师就可以看到学生在某些测验中的表现。
这是我的代码。
dbDatabase = sqlite3.connect('c:\\xampp\\cgi-bin\\MakingATable.db')
cuDatabase = dbDatabase.cursor()
Fieldstorage = cgi.FieldStorage() #what you typed in on the webpage
Quizno = Fieldstorage.getvalue("quizno")
UserID = Fieldstorage.getvalue("username")
#print (Quizno)
#print (UserID)
cuDatabase.execute ("""
SELECT Result
FROM resultstable
WHERE QuizID = '""" + str(Quizno) + """
AND UserID = '""" + UserID + "'")
for (row) in cuDatabase:
print (row)
dbDatabase.commit()
cuDatabase.close()
Run Code Online (Sandbox Code Playgroud)
这是我运行网页时收到的错误消息:
40 FROM resultstable
41 WHERE QuizID = '""" + str(Quizno) + """
=> 42 AND UserID = '""" + UserID + "'")
43
44 for (row) in cuDatabase:
AND undefined, UserID = 'HuPa1'
OperationalError: near "HuPa1": syntax error
args = ('near "HuPa1": syntax error',)
with_traceback = <built-in method with_traceback of OperationalError object>
Run Code Online (Sandbox Code Playgroud)
我还应该使用OR而不是AND这样,如果用户还没有完成该测验,它将显示用户所做的任何测验。或者,如果很多人都做了一个测验,那么老师会看到每个人,例如,做了测验 1?
您应该使用 SQL 参数:
cuDatabase.execute ("""
SELECT Result
FROM resultstable
WHERE QuizID = ?
AND UserID = ?""", (Quizno, UserID))
Run Code Online (Sandbox Code Playgroud)
该?占位符会被你的价值观所取代,自动报价,以防止SQL注入攻击(和操作失误)。
引用sqlite3模块文档:
通常,您的 SQL 操作需要使用 Python 变量中的值。你不应该使用 Python 的字符串操作来组合你的查询,因为这样做是不安全的;它使您的程序容易受到 SQL 注入攻击(有关可能出错的幽默示例,请参见http://xkcd.com/327/)。
相反,使用 DB-API 的参数替换。
?在任何要使用值的地方作为占位符放置,然后提供一个值元组作为游标execute()方法的第二个参数。(其他数据库模块可能使用不同的占位符,例如%s或:1。)
如果此查询未返回结果,请使用单独的查询向数据库询问其他测验;如果您使用OR而不是AND其他方式,您将获得其他用户已完成的测验结果以及该用户已完成的任何内容。