XAMPP 8.0运行Python CGI脚本报mysql模块缺失错误
修复Windows10+XAMPP8.0环境下Python CGI报
No module named 'mysql'错误 问题复现场景
- 部署环境:Windows 10、XAMPP 8.0
- 实现逻辑:HTML表单提交POST数据到Python CGI脚本,脚本接收参数后写入MySQL的employee库register表
- 异常表现:提交表单后页面无输出(空白),查看Apache error.log 报错
ModuleNotFoundError: No module named 'mysql'
对应HTML表单代码
<body> <form method='post' action='dump.py' > Name:<input type='text' name='name' /><br/> Age:<input type='text' name='age' /><br/> Phone:<input type='text' name='phone' /><br/> Emailid:<input type='text' name='email' /><br/> <input type='submit' value='Save'> </form> </body>
对应Python CGI脚本代码
#!C:\Users\Development\AppData\Local\Programs\Python\Python310\python.exe import cgi import mysql.connector print("Content-type:text/html\r\n\r\n") form = cgi.FieldStorage() name = form.getvalue("name") age = form.getvalue("age") phone = form.getvalue("phone") email = form.getvalue("email") try: mysql_connection=mysql.connector.connect(host="localhost", user='root', password='', database='employee') mysql_handler=mysql_connection.cursor() mysql_query="insert into register (name,age,phone,emailid) values('{0}',{1},{2},'{3}')".format(name,age,phone,email) mysql_handler.execute(mysql_query) if(mysql_handler.rowcount >= 1): mysql_connection.commit() print("Record Inserted") mysql_connection.close() except: mysql_connection.rollback() print("Error occured")
根因
报错核心是脚本首行shebang指定的Python解释器(C:\Users\Development\AppData\Local\Programs\Python\Python310\python.exe)环境中,未安装MySQL官方Python驱动mysql-connector-python。多数情况下是装包时调用了其他版本的Python/pip,导致包装到了别的解释器目录下,当前脚本调用的解释器找不到对应模块。
修复步骤
- 打开CMD命令行,直接调用对应路径的Python解释器执行安装,避免装错环境:
C:\Users\Development\AppData\Local\Programs\Python\Python310\python.exe -m pip install mysql-connector-python
- 安装完成后执行校验命令,确认包已安装到目标解释器:
C:\Users\Development\AppData\Local\Programs\Python\Python310\python.exe -c "import mysql.connector; print('driver ok')"
命令输出driver ok即表示驱动安装正确。
- 重启XAMPP的Apache服务,重新提交表单测试即可。
额外优化建议
- 当前代码用字符串拼接生成SQL存在SQL注入风险,替换为参数化查询即可修复:
# 替换原有SQL拼接逻辑 mysql_query = "insert into register (name,age,phone,emailid) values(%s, %s, %s, %s)" mysql_handler.execute(mysql_query, (name, age, phone, email))
- 现有异常捕获逻辑存在隐患:如果数据库连接初始化失败,
mysql_connection对象未创建,直接调用rollback()会触发二次错误,建议拆分异常捕获逻辑,增加连接状态判断。
内容的提问来源于stack exchange,提问作者hithin chandran
相关产品推荐
相关产品推荐

