如何通过HTML表单上传CSV文件并使用mysqli_query实现MySQL数据导入?
如何通过HTML表单上传CSV文件并使用mysqli_query实现MySQL数据导入?
我明白你的困扰——你已经找到了关于LOAD DATA LOCAL INFILE的资料,但卡在了HTML表单和PHP上传逻辑的衔接上,现有代码没效果还没报错。咱们一步步拆解问题,先看看你代码里的关键漏洞:
你的代码存在的核心问题
- 提交按钮缺少
name属性:你的<input type="submit">没有设置name="submit",导致isset($_POST['submit'])永远为false,导入逻辑根本没被触发! - 错误使用文件名而非服务器临时路径:你用了
$_FILES["fileupload"]["name"],这只是用户本地的文件名,服务器上实际存储上传文件的临时路径是$_FILES["fileupload"]["tmp_name"],LOAD DATA需要读取服务器能访问的真实文件路径。 - SQL语句语法错误:直接把变量拼进SQL时没给文件名加引号,会导致MySQL语法报错,还存在注入风险(哪怕是自己用,规范写法也很重要)。
- 缺少错误检查机制:既没判断文件是否上传成功,也没捕获MySQL执行的错误,导致你看不到问题出在哪。
解决你的两个核心疑问
1. 如何正确获取$_FILES?
文件上传后,PHP会把上传信息存在$_FILES超全局变量里,你需要关注这几个关键字段:
$_FILES["fileupload"]["tmp_name"]:服务器上临时存储文件的真实路径(这是给LOAD DATA用的核心值)$_FILES["fileupload"]["error"]:上传错误码,UPLOAD_ERR_OK表示上传完全成功$_FILES["fileupload"]["name"]:用户本地的文件名(仅用来做提示,不能直接给MySQL用)
2. 如何触发$import_csv逻辑?
只要给提交按钮加上name="submit",当用户点击上传时,表单提交后$_POST['submit']就会存在,你的导入代码块就会自动执行。
修改后的完整可运行代码
<?php // 仅在表单提交时执行导入逻辑 if( isset($_POST['submit']) ) { // 建立数据库连接(建议把连接逻辑抽离,避免重复连接) $connect = mysqli_connect("DB_HOST","DB_USER","DB_PASSWORD","DB_NAME"); // 检查连接是否成功 if (!$connect) { die("数据库连接失败: " . mysqli_connect_error()); } // 检查文件是否上传成功 if ($_FILES["fileupload"]["error"] !== UPLOAD_ERR_OK) { die("文件上传出错: 错误码 " . $_FILES["fileupload"]["error"]); } // 获取服务器临时文件路径,并转义避免SQL语法问题 $temp_file = $_FILES["fileupload"]["tmp_name"]; $escaped_temp_file = mysqli_real_escape_string($connect, $temp_file); // 构造并执行LOAD DATA语句 $import_sql = "LOAD DATA LOCAL INFILE '$escaped_temp_file' INTO TABLE table_name FIELDS TERMINATED BY ',' IGNORE 1 LINES"; $import_csv = mysqli_query($connect, $import_sql); // 反馈执行结果 if ($import_csv) { echo "数据导入成功!"; } else { echo "导入失败: " . mysqli_error($connect); } // 关闭数据库连接 mysqli_close($connect); } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="fileupload" accept=".csv" required> <!-- 给提交按钮添加name属性,触发PHP逻辑 --> <input type="submit" name="submit" value="Upload"> </form>
额外注意事项
- 确保MySQL允许
LOCAL INFILE:部分环境默认禁用该功能,你可以在连接时添加开启参数:$connect = mysqli_init(); mysqli_options($connect, MYSQLI_OPT_LOCAL_INFILE, true); mysqli_real_connect($connect, "DB_HOST","DB_USER","DB_PASSWORD","DB_NAME"); - 临时文件权限:如果遇到权限问题,可以把上传文件移动到服务器明确目录(比如
./uploads/),再用该路径执行LOAD DATA,记得给目录设置可读权限。
备注:内容来源于stack exchange,提问作者user5853892
相关产品推荐
相关产品推荐

