You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP MySQL更新页面文件上传Undefined array警告问题求助

解决PHP文件上传Undefined array key警告的方案

问题根源

  1. 页面首次加载无上传数据:当用户通过GET请求打开edit.php页面时,$_FILES数组中不存在"file"键,直接访问$_FILES["file"]["name"]会触发未定义数组键的警告。
  2. 提交按钮判断不匹配:代码中用isset($_POST["submit"])判断表单提交,但实际表单的提交按钮name是"update",导致判断永远不成立,上传逻辑无法触发。
  3. 代码块闭合错误:原代码的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:20:22