Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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和sql中使用row作为变量_Python_Mysql_Sql_String_Python 3.x - Fatal编程技术网

在python和sql中使用row作为变量

在python和sql中使用row作为变量,python,mysql,sql,string,python-3.x,Python,Mysql,Sql,String,Python 3.x,我正在尝试将一些值更新到数据库中。用户可以指定应更改的行。然而,来自用户的输入是一个字符串。当我试图用python将其解析到MySQL连接器中时,由于撇号的原因,它给出了一个错误。到目前为止,我掌握的代码是: import mysql.connector conn = mysql.connector conn = connector.connect(user=dbUser, password=dbPasswd, host=dbHost, database=dbName) cursor

我正在尝试将一些值更新到数据库中。用户可以指定应更改的行。然而,来自用户的输入是一个字符串。当我试图用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

我如何去掉撇号?因为我认为它们会导致问题。

列名不是参数。将列名
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))

但请记住,这并不像参数那样安全,因此请确保列名不是用户输入字符串或类似的内容

你不能那样做。在调用
游标之前,需要将列名放入字符串中。执行
。在
游标中转换变量时不能使用列名。请执行

类似这样的方法会奏效:

sql = "UPDATE Search SET {} = %s WHERE searchID = %s".format('maxPrice')

cursor.execute(sql, (300, 10,))

不能动态绑定对象(例如列)名称,只能绑定值。如果这是您试图实现的逻辑,那么您必须求助于字符串操作/格式化(伴随着SQL注入攻击的所有风险)。例如:


如上所述,您不能使用字段来准备它

也许最安全的方法是只允许预期的字段,例如

#!/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注入,但我想我别无选择…@JoostLuijben看到我的答案只允许有效字段
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