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
相关产品推荐
相关产品推荐

