该语句是经过设置的,以便当一条记录已经存在时,它不会添加记录,否则,它会添加一条记录。
我尝试更改查询,即使我没有发现任何问题。 我让脚本在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)
我知道几件事。
phpMyAdmin的实际示例: (为了显示结果表而删除了INSERT INTO部分)
第一次输入查询(例如,在查询上方)时,将生成一个表,其中两个值都作为列名作为列值。
表输出的屏幕截图:http://prntscr.com/nkgaka
一旦输入该结果,下一次您将尝试插入它时,它将仅导致仅列名,而没有值。这意味着它将不插入任何内容,因为没有插入内容,因为没有实际值。
表输出的屏幕截图:http://prntscr.com/nkgbp3
非常感谢您的帮助。
答案 0 :(得分:0)
如果要确保表中的任何字段都是唯一的,请将该字段设置为PRIMARY KEY
或UNIQUE KEY
。在这种情况下,您希望name
是唯一的。
CREATE UNIQUE INDEX name ON users(name)
使用此功能,您只需INSERT
。如果发生重复的密钥错误,则名称已经存在。
为避免SQL注入,请勿使用"""SELECT {}""".format
。它将容易受到SQL注入的攻击。</ p>
也永远不要存储纯文本密码。盐渍的哈希至少。已经有很多框架可以很好地做到这一点,因此您无需发明自己的框架。