我开始用Python编写脚本,然后遇到了一个奇怪的问题。
我试图在mysql数据库中插入一些值。 数据库字段是varchar,utf-8 unicode
使用Python 3.2和wamp server 2.2(apache 2.2.21,mysql 5.5.20)
如果我尝试打印(ime),打印(prezime)等,它会从另一页打印一个表单的值,所以我得到了正确的值。
如果我将sql语句编写为:
"INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES ("aa","aa","aa","aa")"
将这些值插入数据库
如果我写:
sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (%s,%s,%s,%s)",(ime,prezime,email,tel)
它不起作用
最后,如果我把sql =“INSERT INTO Clanovi(CL_Ime,CL_Prezime,CL_Email,CL_Tel)VALUES(%s,%s,%s,%s)”%(ime,prezime,email,tel)
如果我只将数字放入表单字段,它将提交数据库(添加新数据) ime = 21 prezime = 232 email = 123 tel = 123 如果我把任何其他类似的字母,它不会添加新行到数据库 ime = smth prezime = blabla email = aa tel = dada
(我知道这种方法存在安全风险)
这里是整个代码(我推特打印(sql)只是为了看看我的查询最后是什么样子)
#!c:\python32\python.exe
import MySQLdb
import cgi
print ("Content-type: text/html\n\n")
form = cgi.FieldStorage()
ime =form["ime"].value
prezime = form["prezime"].value
email= form["email"].value
tel = form["tel"].value
print(ime)
db = MySQLdb.connect("localhost","root","","biblioteka" )
cursor = db.cursor()
sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (%s,%s,%s,%s)"%(ime,prezime,email,tel)
print(sql)
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
db.close()
感谢您的时间和帮助。
答案 0 :(得分:0)
你不应该使用Python的字符串操作来组装你的查询,因为这样做是不安全的;它使您的程序容易受到SQL注入攻击。
而是使用DB-API的参数替换。将?
作为占位符放在您想要使用值的位置,然后提供一个值元组作为游标execute()
方法的第二个参数:
sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)"
print(sql)
try:
cursor.execute(sql, (ime, prezime, email, tel))
db.commit()
except:
db.rollback()
db.close()
更新:Luke是对的(见评论):MySQL使用'%s'代替'?
更新了sql-statement:sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)"