gpt4 book ai didi

mysql - Python MYSQL 问题

转载 作者:行者123 更新时间:2023-11-29 19:22:21 26 4
gpt4 key购买 nike

我一直在尝试为我工作的小型企业创建一个上下类打卡系统。

目前我无法让它与 MySQL 服务器通信。我可能正在做一些非常愚蠢的错误。

我遇到问题的部分是:

cnx = mysql.connector.connect( host=localhost, user="time_clock", passwd="kayak100", db="Staff_time_clock")
cursor = cnx.cursor()
staffid = input('Please enter your Staff ID now ...')
idcheck = ("SELECT staff_name, staff_id FROM Staff WHERE staff_id = %s")
cursor.execute(idcheck,(staffid))

我对使用 MYSQL 还很陌生,并且已经学会了尝试做这个小程序。

编辑 - 是的,抱歉忘记添加我收到的错误代码。

---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
<ipython-input-49-b672a17a258e> in <module>()
----> 1 cursor.execute(idcheck,)

C:\Users\ellio\Anaconda3\lib\site-packages\mysql\connector\cursor.py in execute(self, operation, params, multi)
505 self._executed = stmt
506 try:
--> 507 self._handle_result(self._connection.cmd_query(stmt))
508 except errors.InterfaceError:
509 if self._connection._have_next_result: # pylint: disable=W0212

C:\Users\ellio\Anaconda3\lib\site-packages\mysql\connector\connection.py in cmd_query(self, query)
720 if not isinstance(query, bytes):
721 query = query.encode('utf-8')
--> 722 result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
723
724 if self._have_next_result:

C:\Users\ellio\Anaconda3\lib\site-packages\mysql\connector\connection.py in _handle_result(self, packet)
638 return self._handle_eof(packet)
639 elif packet[4] == 255:
--> 640 raise errors.get_exception(packet)
641
642 # We have a text result set

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 '%s' at line 1

这是错误的总数。

谢谢

最佳答案

这里是新用户,因此没有足够的代表对现有答案发表评论。我知道我要回复的问题(和答案)已经有四年了,但是这个页面是我之前在谷歌搜索时出现的,并且现有的答案包含一个相当危险的解决方案。

构建查询时,有两种方法可以实现 - 构建包含整个查询的字符串,或者构建包含要添加的值的占位符的查询字符串(也称为参数化查询)。第一个是危险的,因为除非你非常小心,否则它会允许 SQL injection attacks 。参数化查询是保证安全的方法。

问题始于一个损坏的参数化查询 - idcheck 是带有占位符的查询,.execute 中的 (staffid) 位是要插入的参数。这是正确的方法,但它被破坏了,因为 .execute 的第一个参数是一个字符串(因此它周围的括号是不必要的,但不是问题),第二个参数是一个元组 - 类似于 (thing1,thing2) - 但由于其中只有一个参数(单例),因此您需要使用 (staffid,) 的特殊语法以及奇怪放置的逗号。

建议的(和接受的)答案通过删除参数化并仅构建一个简单的、不安全的字符串来使事情正常进行。这很危险 - 用户可以输入1 OR 1=1,它将返回整个表(因为您的查询现在显示...WHERE Staff_id = 1 OR 1=1,这始终为真),或者更糟糕的是,1;DROP TABLE Staff - 那么你在执行什么?

# broken original
idcheck = ("SELECT staff_name, staff_id FROM Staff WHERE staff_id = %s")
cursor.execute(idcheck,(staffid))
# dangerous - allows SQL injection attacks
idcheck = "SELECT staff_name, staff_id FROM Staff WHERE staff_id = %s" % staffid
cursor.execute(idcheck)
# do it this way
idcheck = "SELECT staff_name, staff_id FROM Staff WHERE staff_id = %s"
cursor.execute(idcheck, (staffid,))

注意安全!

关于mysql - Python MYSQL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42369897/

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