PHP任务更新时图片丢失、数据库字段置空问题求助修复
问题排查与修复方案
问题根源
- 仅更新任务不修改图片时,
$ime变量未初始化,默认是空字符串,传入Zadatak::izmeni()后触发else分支,执行slika = NULL的SQL语句,直接清空数据库图片字段 - 页面未保留原有图片的信息,无法在不修改图片时维持原字段值
- 删除图片的逻辑未关联后端,导致后端无法区分"不修改图片"和"删除图片"两种操作
修复方案
步骤1:修改后端PHP逻辑,保留原有图片信息
在处理更新请求时,先获取任务原有图片路径,将$ime初始化为原有图片值,仅在上传新图或明确删除图片时修改该值:
else if (isset($_POST["button"])) { $zadatak = trim($_POST["zadatak"]); $naziv = trim($_POST["naziv"]); $kategorija = trim($_POST["kategorija"]); $opis = trim($_POST["opis"]); $izvrsen = trim($_POST["status"]); $obrisi = trim($_POST["obrisi"]); // 初始化$ime为原有图片路径 $podaci = Zadatak::vratiPodatke($zadatak, $konekcija); $ime = $podaci->slika; // 明确删除图片时,清空$ime并删除服务器文件 if ($obrisi != "") { $ime = ""; if ($podaci->slika != "") { unlink("../slike/".$podaci->slika); } } // 上传新图片时,覆盖$ime并替换服务器文件 if ($_FILES["real_file"]["name"] != "") { if ($podaci->slika != "") { unlink("../slike/".$podaci->slika); } $ime = time()."_".$_FILES["real_file"]["name"]; $target = "../slike/".$ime; move_uploaded_file($_FILES["real_file"]["tmp_name"], $target); } Zadatak::izmeni($zadatak, $naziv, $kategorija, $opis, $izvrsen, $ime, $konekcija); }
步骤2:调整更新函数,区分"保留图片"和"删除图片"操作
修改izmeni函数,仅在$slika明确为空时才将数据库字段设为NULL,否则保留/设置图片路径:
public static function izmeni($zadatak, $naziv, $kategorija, $opis, $izvrsen, $slika, mysqli $konekcija) { $datumZavrsetka = null; if ($izvrsen == "1") { $datumZavrsetka = date('Y-m-d H:i:s'); } if ($slika === "") { // 明确删除图片,设为NULL $dodaj = $konekcija->prepare("UPDATE zadatak SET naziv = ?, kategorija = ?, opis = ?, izvrsen = ?, datumZavrsetka = ?, slika = NULL WHERE zadatakID = ?"); $dodaj->bind_param("sisisi", $naziv, $kategorija, $opis, $izvrsen, $datumZavrsetka, $zadatak); } else { // 保留原有图片或设置新图片 $dodaj = $konekcija->prepare("UPDATE zadatak SET naziv = ?, kategorija = ?, opis = ?, izvrsen = ?, datumZavrsetka = ?, slika = ? WHERE zadatakID = ?"); $dodaj->bind_param("sisissi", $naziv, $kategorija, $opis, $izvrsen, $datumZavrsetka, $slika, $zadatak); } $dodaj->execute(); return $dodaj; }
步骤3:完善前端删除图片的标记逻辑
修改resetujFormu()函数,标记删除图片的操作,让后端能识别:
function resetujFormu() { $("#obrisi").val("1"); $("#slikawrapnad").hide(); $("#slikadiv").show(); }
步骤4:确保表单支持文件上传
给表单添加enctype="multipart/form-data"属性,保证文件上传功能正常:
<form id="formaizmena" method="post" enctype="multipart/form-data"> <!-- 现有表单内容 --> </form>
内容的提问来源于stack exchange,提问作者user21626341
相关产品推荐
相关产品推荐

