【问题标题】:Python cgi script inserts only integers into mysql databasePython cgi 脚本仅将整数插入 mysql 数据库
【发布时间】:2012-04-19 17:41:30
【问题描述】:

我开始使用 Python 编写脚本,但遇到了一个奇怪的问题。

我正在尝试将一些值插入 mysql 数据库。 数据库字段为varchar、utf-8 unicode

使用 Python 3.2 和 wamp 服务器 2.2(apache 2.2.21, mysql 5.5.20)

如果我尝试 print(ime)、print(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 电子邮件=123 电话=123 如果我放其他任何东西,比如字母,它不会向数据库添加新行 ime= smth prezime=blabla email = aa tel =dada

(我知道这种方法有安全风险)

这是整个代码(我放了 print(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()

感谢您的时间和帮助。

【问题讨论】:

标签: python python-3.x cgi mysql-python cgi-bin


【解决方案1】:

您不应该使用 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 是对的(参见 cmets):MySQL 使用 '%s' 而不是 '?

更新的 sql 语句:sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)"

【讨论】:

  • MySQLdb 使用%s 作为其占位符,而不是?。您上面的代码将给出“字符串格式化期间并非所有参数都转换”错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2014-12-02
  • 2015-03-10
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多