gpt4 book ai didi

python - 查询在 phpmyadmin 上执行,但不在 python 脚本中执行

转载 作者:行者123 更新时间:2023-11-29 16:03:07 25 4
gpt4 key购买 nike

该语句的设置是这样的:当一条记录已经存在时,它不会添加一条记录,否则,它会添加一条记录。

我尝试更改查询,尽管我没有发现它有任何问题。我让脚本在 python 上运行,并打印它执行的查询。然后我将该查询粘贴到 phpmyadmin 中,它成功执行了。我还仔细检查了所有参数。

查询(空白参数):

INSERT INTO users (uname,pass) SELECT * FROM (SELECT '{}','{}') AS tmp WHERE NOT EXISTS(SELECT uname FROM users WHERE uname = '{}') LIMIT 1;

查询(填写参数):

INSERT INTO users (uname,pass) SELECT * FROM (SELECT 'john_doe','password') AS tmp WHERE NOT EXISTS(SELECT uname FROM users WHERE uname = 'john_doe') LIMIT 1;

Python脚本(重要部分)

    if action == "add_user":
username = form.getvalue('username')
password = form.getvalue('password')
query = """
INSERT INTO users (uname,pass) SELECT * FROM
(SELECT '{}','{}') AS tmp WHERE NOT EXISTS(SELECT uname FROM users WHERE uname = '{}') LIMIT 1;
""".format(username, password, username)
mycursor.execute(query)

我知道一些事情。

  1. 数据库连接没有问题。
  2. 参数不能为空(例如 username="john_doe"和 password="secret")
  3. 查询实际上在该特定表中执行。
  4. 该查询似乎添加了一条记录,然后直接删除它(因为 AUTO_INCRMENT 每次都会增加,即使 python 脚本执行并且没有添加任何内容)
  5. try except 不会执行任何操作,因为 mysql.connector.Error 不会报告任何错误(这很明显,因为查询实际上成功执行)

phpMyAdmin实际例子:(删除了 INSERT INTO 部分以便能够显示结果表)

第一次输入查询时(以上面的查询为例),它将生成一个表,其中两个值都是列名,两个值都是列值。
表输出的屏幕截图:http://prntscr.com/nkgaka

一旦输入该结果一次,下次尝试插入它时,它只会产生列名,没有值。这意味着它将不会插入任何内容,因为没有实际值,因此无需插入任何内容。
表输出的屏幕截图:http://prntscr.com/nkgbp3

非常感谢您的帮助。

最佳答案

如果您想确保表中的任何字段是唯一的,请将该字段设置为主键唯一键。在本例中,您希望 name 是唯一的。

CREATE UNIQUE INDEX name ON users(name)

完成此操作后,您只需INSERT。如果出现重复键错误,则该名称已存在。

为避免 SQL 注入(inject),请勿使用 """SELECT {}""".format。它将存在 SQL 注入(inject)漏洞。

也永远不要存储纯文本密码。至少是加盐哈希。已经有很多框架可以很好地做到这一点,因此您无需发明自己的框架。

关于python - 查询在 phpmyadmin 上执行,但不在 python 脚本中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55986763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com