如何通过HTML按钮导入SQL/CSV数据库文件?上传失效问题排查
SQL文件导入失败的问题修复方案
原代码存在的核心问题
- 表单未添加
enctype="multipart/form-data"属性,导致服务器无法接收上传的文件 - 使用
$_POST['data']获取上传文件,文件上传数据应从$_FILES变量读取,$_POST仅能获取文件名,无法访问实际文件内容 - 缺少文件上传合法性校验(如上传错误、文件类型检查)
- 错误信息输出不完整,无法定位SQL执行失败的具体原因
- 未清理
mysqli_multi_query产生的结果集,可能导致后续数据库操作异常
修正后的完整代码
<?php require "../database.php"; if(isset($_POST['submit'])) { // 检查文件是否上传成功 if ($_FILES['data']['error'] !== UPLOAD_ERR_OK) { echo "文件上传错误,错误码:" . $_FILES['data']['error']; exit; } // 验证文件类型为SQL $file_ext = pathinfo($_FILES['data']['name'], PATHINFO_EXTENSION); if (strtolower($file_ext) !== 'sql') { echo "仅支持上传SQL格式文件"; exit; } $tmp_file = $_FILES['data']['tmp_name']; // 读取SQL文件内容 $sql = file_get_contents($tmp_file); if ($sql === false) { echo "无法读取上传的文件"; exit; } // 执行SQL语句 if (mysqli_multi_query($conn, $sql)) { // 清理所有结果集,避免残留导致后续错误 do { // 获取当前结果集(如果有) if ($result = mysqli_store_result($conn)) { mysqli_free_result($result); } } while (mysqli_next_result($conn)); echo "SQL文件导入成功"; } else { echo "导入SQL文件失败:" . mysqli_error($conn); } mysqli_close($conn); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Import Database</title> </head> <body> <?php include '../navigation.php';?> <div class="container-lg"> <!-- 新增enctype属性,支持文件上传 --> <form action="import.php" method="post" enctype="multipart/form-data"> <input type="file" class="form-control mt-5" name="data"> <button type="submit" class="btn btn-success" name="submit">Import Database</button> </form> </div> </body> </html>
关键修改说明
- 表单属性补充:在
<form>标签中添加enctype="multipart/form-data",这是文件上传表单的必填属性,确保服务器能正确解析上传的文件数据。 - 文件获取方式修正:通过
$_FILES['data']['tmp_name']获取上传文件的临时存储路径,这是服务器端访问上传文件的唯一有效路径。 - 上传校验增强:增加了上传错误检查、文件格式验证,避免非法文件或上传失败的情况继续执行后续逻辑。
- 错误信息完善:使用
mysqli_error($conn)输出具体的MySQL错误信息,方便快速定位SQL语句执行失败的原因。 - 结果集清理:通过循环调用
mysqli_next_result($conn)和mysqli_free_result($result),清理mysqli_multi_query产生的所有结果集,防止残留结果影响后续数据库操作。
内容的提问来源于stack exchange,提问作者REYES MARK M.
相关产品推荐
相关产品推荐

