添加图片分类时图片未移动到指定目录,PHP代码哪里存在问题?
问题根因及修复方案
核心错误:文件移动逻辑位置错误
你代码中的move_uploaded_file文件移动逻辑被完全包裹在if ($check > 0)的判断分支内,这个$check是分类名校验的计数返回值:
- 当你新增分类时,分类名不存在,
$check值为0,整个判断分支不会执行,文件移动代码完全不会运行 - 但下方数据库操作逻辑只判断
$msg是否为空,只要没有分类重复的报错,就会直接把文件名写入数据库,这就是你遇到“数据库写成功但文件没移动”的直接原因
其他可能的问题
- 文件夹权限不足:确认web服务运行用户(如www-data、apache)对
image目录有写入权限,Linux环境可临时设置权限为755测试 - 路径配置错误:建议使用绝对路径定位目录,避免相对路径匹配错误,可修改路径定义为
$folder = __DIR__ . "/image/" . $filename; - 前端表单配置错误:确认上传表单添加了
enctype="multipart/form-data"属性,未配置该属性的表单无法正常提交文件 - 更新逻辑缺失字段:现有更新分类的SQL语句没有同步更新
filename字段,修改分类上传新图时新文件名不会写入数据库
核心代码修复示例
把文件移动逻辑从if ($check > 0)分支中移出,调整后对应代码段如下:
if (isset($_POST['submit'])) { $filename = $_FILES["uploadfile"]["name"]; $tempname = $_FILES["uploadfile"]["tmp_name"]; $folder = "image/" . $filename; $categories = get_safe_value($link, $_POST['categories']); $res = mysqli_query($link, "select * from categories where categories='$categories'"); $check = mysqli_num_rows($res); if ($check > 0) { if (isset($_GET['id']) && $_GET['id'] != '') { $getData = mysqli_fetch_assoc($res); if ($id != $getData['id']) { $msg = "Categories already exist"; } } else { $msg = "Categories already exist"; } } // 把文件移动逻辑移到分类校验分支外 if ($msg == '') { if (move_uploaded_file($tempname, $folder)) { // 有上传文件才更新文件名 if(!empty($filename)){ if (isset($_GET['id']) && $_GET['id'] != '') { mysqli_query($link, "update categories set categories='$categories',filename='$filename' where id='$id'"); } else { mysqli_query($link, "insert into categories(categories,filename,status) values('$categories','$filename','1')"); } }else{ // 无上传文件只更新分类名 mysqli_query($link, "update categories set categories='$categories' where id='$id'"); } header('location:categories.php'); die(); } else { $msg = "Failed to upload image"; } } }
内容的提问来源于stack exchange,提问作者guna
相关产品推荐
相关产品推荐

