Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 MYSQL问题_Mysql_Python 3.x - Fatal编程技术网

Python MYSQL问题

Python MYSQL问题,mysql,python-3.x,Mysql,Python 3.x,我一直在尝试为我工作的小企业创建一个进出系统的时钟 目前,我无法让它与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 ..

我一直在尝试为我工作的小企业创建一个进出系统的时钟

目前,我无法让它与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
---------------------------------------------------------------------------
编程错误回溯(最近一次调用上次)
在()
---->1游标。执行(idcheck,)
C:\Users\ellio\Anaconda3\lib\site packages\mysql\connector\cursor.py in execute(self、operation、params、multi)
505自执行=stmt
506尝试:
-->507 self.\u handle\u result(self.\u connection.cmd\u query(stmt))
508错误除外。接口错误:
509如果自身连接有下一个结果:#pylint:disable=W0212
cmd_查询中的C:\Users\ellio\Anaconda3\lib\site packages\mysql\connector\connection.py(self,query)
720如果不是isinstance(查询,字节):
721 query=query.encode('utf-8')
-->722 result=self.\u handle\u result(self.\u send\u cmd(ServerCmd.QUERY,QUERY))
723
724如果自己有下一个结果:
C:\Users\ellio\Anaconda3\lib\site packages\mysql\connector\connection.py in\u handle\u result(self,packet)
638返回自我处理(数据包)
639 elif数据包[4]==255:
-->640引发错误。获取异常(数据包)
641
我们有一个文本结果集
编程错误:1064(42000):您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以获取第1行“%s”附近要使用的正确语法
这是错误总数


谢谢

您的问题是字符串格式不正确

尝试运行以下命令:

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" % staffid
cursor.execute(idcheck)

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

在构建查询时,有两种方法可以做到这一点——要么构建包含整个查询的字符串,要么构建包含要添加的值的占位符的查询字符串(也称为参数化查询)。第一个是危险的,因为除非你非常小心,否则它允许。参数化查询是保证安全的方法

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

建议的(并被接受的)答案通过删除参数化和构建简单、不安全的字符串来实现。这很危险-用户可以输入1或1=1,它将返回整个表(因为您的查询现在显示…WHERE staff_id=1或1=1,这总是正确的),或者更糟糕的是,1;放下桌上的工作人员——那你在执行什么

# broken original
idcheck = ("SELECT staff_name, staff_id FROM Staff WHERE staff_id = %s")
cursor.execute(idcheck,(staffid))

注意安全

你到底遇到了什么问题?添加你得到的输出(错误)谢谢你@avihoomaka解决了这个问题。在网上查了不少,但有太多的变体似乎不起作用。
# 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,))