PHP MySQL更新页面文件上传Undefined array警告问题求助
解决PHP文件上传Undefined array key警告的方案
问题根源
- 页面首次加载无上传数据:当用户通过GET请求打开edit.php页面时,
$_FILES数组中不存在"file"键,直接访问$_FILES["file"]["name"]会触发未定义数组键的警告。 - 提交按钮判断不匹配:代码中用
isset($_POST["submit"])判断表单提交,但实际表单的提交按钮name是"update",导致判断永远不成立,上传逻辑无法触发。 - 代码块闭合错误:原代码的if语句闭合位置错误,上传逻辑代码未被正确包裹在条件判断内,逻辑执行混乱。
修复步骤
步骤1:将上传逻辑移至表单提交判断内
仅当用户点击"Запис"按钮(即$_POST['update']存在)时,才处理文件上传,避免页面首次加载时执行上传代码。
步骤2:提前检查$_FILES["file"]存在性
在访问$_FILES["file"]的任何键之前,用isset()或empty()判断该数组项是否存在。
步骤3:修正代码块闭合与判断条件
将判断条件改为isset($_POST['update']),并正确闭合if语句的花括号,确保逻辑块被正确包裹。
步骤4:处理未上传文件的情况
若用户未选择新文件,保留数据库中原有的file_name值,避免更新为空。
修改后的核心代码片段
// include database connection file include_once("config.php"); //тук стартирам за фаил ъплоад // Include the database configuration file include 'db.php'; // Check if form is submitted for user update, then redirect to homepage after update if(isset($_POST['update'])) { $id = $_POST['id']; $toolnr=$_POST['toolnr']; $status=$_POST['status']; $toolname=$_POST['toolname']; $serial=$_POST['serial']; $usedat=$_POST['usedat']; $owner=$_POST['owner']; $calibrated=$_POST['calibrated']; $nextcalibration=$_POST['nextcalibration']; $vendors=$_POST['vendors']; // 初始化文件名为数据库原有值 $fileName = ''; $result = mysqli_query($mysqli, "SELECT file_name FROM tools WHERE id='$id'"); $user_data = mysqli_fetch_array($result); $fileName = $user_data['file_name']; // 处理文件上传逻辑 if(isset($_FILES["file"]) && !empty($_FILES["file"]["name"])){ $targetDir = "uploads/"; $fileName = basename($_FILES["file"]["name"]); $targetFilePath = $targetDir . $fileName; $fileType = pathinfo($targetFilePath,PATHINFO_EXTENSION); $allowTypes = array('jpg','png','jpeg','gif','pdf','doc','xlsx'); if(in_array($fileType, $allowTypes)){ move_uploaded_file($_FILES["file"]["tmp_name"], $targetFilePath); } } // 更新数据库数据 $result = mysqli_query($mysqli, "UPDATE tools SET toolnr='$toolnr',status='$status',toolname='$toolname',serial='$serial',usedat='$usedat',owner='$owner',calibrated='$calibrated',nextcalibration='$nextcalibration', vendors='$vendors', file_name = '$fileName' WHERE id='$id'"); header("Location: index.php"); } // 以下原有代码保持不变...
额外建议
- 防范SQL注入:当前代码直接将用户输入拼接进SQL语句,存在严重安全风险,建议使用预处理语句:
$stmt = $mysqli->prepare("UPDATE tools SET toolnr=?, status=?, toolname=?, serial=?, usedat=?, owner=?, calibrated=?, nextcalibration=?, vendors=?, file_name=? WHERE id=?"); $stmt->bind_param("ssssssssssi", $toolnr, $status, $toolname, $serial, $usedat, $owner, $calibrated, $nextcalibration, $vendors, $fileName, $id); $stmt->execute(); $stmt->close();
- 增强上传安全:添加文件大小限制,确保
uploads/目录权限正确,避免目录内脚本被执行。
内容的提问来源于stack exchange,提问作者user15969669
相关产品推荐
相关产品推荐

