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

PHP编辑表单提交时未重新上传图片如何保留原有图片?

问题原因

  • 逻辑顺序错误:你先执行了UPDATE更新操作,再判断图片是否为空,后续的查询结果完全没有用到,不会对已经执行的更新产生任何影响。
  • 未正确判断文件上传状态:没有上传新图片时,$_FILES['image']['name']为空,你直接拼接生成的$image是无效值,会覆盖数据库中原有的图片地址。
  • 预处理写法不规范:在prepare的SQL语句中直接拼接$the_post_id变量,存在SQL注入风险,参数绑定的用法也不符合规范。

修正后的代码

后台处理逻辑

<?php
if(isset($_REQUEST['edit_post_id'])){
    $the_post_id = $_REQUEST['edit_post_id'];
    // 修正预处理写法,用?占位符避免注入
    $posted = $db->prepare("SELECT * FROM posts WHERE post_id = ?");
    $posted->execute(array($the_post_id));
    $posted_p = $posted->fetch();
}

if(isset($_POST['edit_post'])){
    // 默认复用原有图片
    $post_image = $posted_p['post_image'];
    // 仅当有新文件成功上传时才更新图片
    if($_FILES['image']['error'] === UPLOAD_ERR_OK){
        $image = date('YmdHis') . $_FILES['image']['name'];
        move_uploaded_file($_FILES['image']['tmp_name'], './images/' . $image);
        $post_image = $image;
    }
    
    // 统一执行更新,所有变量都走参数绑定
    $edit_posts = $db->prepare("UPDATE posts SET post_image=?, post_contents=? WHERE post_id = ?");
    $edit_posts->execute(array(
        $post_image,
        $_POST['post_contents'],
        $the_post_id
    ));
    
    header('Location: index.php');
    exit();
}
?>

表单部分无需修改,保持原有逻辑即可

补充注意事项

  • 可以额外添加文件类型、大小校验,避免上传非法文件
  • 生成文件名时建议添加随机字符串,避免不同用户同时上传同名文件产生覆盖
  • 原有冗余的空图片判断逻辑已经移除,不需要再额外查询一次数据库拿旧图片,因为页面加载时已经查询过$posted_p存储了原有的图片信息

内容的提问来源于stack exchange,提问作者Nao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:15:03