我试图将一些值更新到数据库中。用户可以给出应该更改的行。然而,来自用户的输入是字符串。当我尝试使用python将其解析为MySQL连接器时,由于撇号而导致错误。我到目前为止的代码是:
import mysql.connector
conn = mysql.connector
conn = connector.connect(user=dbUser, password=dbPasswd, host=dbHost, database=dbName)
cursor = conn.cursor()
cursor.execute("""UPDATE Search SET %s = %s WHERE searchID = %s""", ('maxPrice', 300, 10,))
我收到这个错误
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''maxPrice' = 300 WHERE searchID = 10' at line 1
我如何摆脱撇号?因为我认为他们造成了问题。
如上所述,您无法使用字段进行准备。
也许最安全的方法是仅允许那些预期的字段,例如,
#!/usr/bin/python
import os
import mysql.connector
conn = mysql.connector.connect(user=os.environ.get('USER'),
host='localhost',
database='sandbox',
unix_socket='/var/run/mysqld/mysqld.sock')
cur = conn.cursor(dictionary=True)
query = """SELECT column_name
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'Search'
"""
cur.execute(query)
fields = [x['column_name'] for x in cur.fetchall()]
user_input = ['maxPrice', 300, 10]
if user_input[0] in fields:
cur.execute("""UPDATE Search SET {0} = {1} WHERE id = {1}""".format(user_input[0], '%s'),
tuple(user_input[1:]))
print cur.statement
打印:
UPDATE Search SET maxPrice = 300 WHERE id = 10
哪里:
mysql> show create table Search\G
*************************** 1. row ***************************
Search
CREATE TABLE `Search` (
`id` int(11) DEFAULT NULL,
`maxPrice` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
列名不是参数。将列名称maxPrice
直接放入SQL中。
cursor.execute("""UPDATE Search SET maxPrice = %s WHERE searchID = %s""", (300, 10))
如果要使用具有不同列名的相同代码,则必须修改字符串本身。
sql = "UPDATE Search SET {} = %s WHERE searchID = %s".format('maxPrice')
cursor.execute(sql, (300,10))
但请记住,注入参数的方式不安全,因此请确保您的列名不是用户输入的字符串或类似的东西。
你不能这样做。在调用cursor.execute
之前,需要将列名放在字符串中。在cursor.execute
中转换变量时,不能使用列名。
像这样的东西会起作用:
sql = "UPDATE Search SET {} = %s WHERE searchID = %s".format('maxPrice')
cursor.execute(sql, (300, 10,))
您不能动态绑定对象(例如,列)名称,只能绑定值。如果这是你想要实现的逻辑,那么你必须采用字符串操作/格式化(具有随之而来的SQL注入攻击的所有风险)。例如。:
sql = """UPDATE Search SET {} = %s WHERE searchID = %s""".format('maxPrice')
cursor.execute(sql, (300, 10,))