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

点击编辑图标后PHP数据无法回显至HTML表单的问题排查

问题分析与解决方案

首先咱们拆解下你遇到的问题:

  • 点击编辑后跳转到evidencija.inc.php?edit=3页面空白,是因为这个文件只执行了查询逻辑,没有输出任何HTML内容;
  • 提示$id未声明,是因为你的表单页面(应该是evidencija.php)里直接调用izmijeniEvidenciju($conn, $id)时,$id根本没被定义——这个变量只在evidencija.inc.php的GET判断里存在,没法直接传到表单页面。

核心问题梳理

你搞反了页面职责:evidencija.inc.php应该是**处理逻辑(比如数据库更新)**的后台文件,不是用来展示表单的;展示表单的应该是前端页面(比如evidencija.php),并且这个页面需要自己从URL里获取edit参数来拿到$id。


解决方案步骤

1. 修正编辑链接的跳转目标

原来的编辑图标链接应该指向表单页面,而不是inc.php文件:
把链接从:
http://localhost/robinzonlucica/public/includes/evidencija.inc.php?edit=3
改成:
http://localhost/robinzonlucica/public/evidencija.php?edit=3

2. 修改表单页面(evidencija.php)的代码

在调用查询函数前,先从URL里获取$id,并且处理$id不存在的情况(比如新增表单):

<?php 
include_once 'header.php'; 
require_once 'includes/funkcije.inc.php'; 
require_once 'includes/dbh.inc.php'; 

// 新增:从URL获取编辑ID,没有的话设为null(用于新增场景)
$id = isset($_GET["edit"]) ? $_GET["edit"] : null;
?> 
<section class="evidencija"> 
  <?php if(isset($_SESSION["username"])) { 
    // 只有当$id存在时,才调用查询函数获取数据
    $editrow = $id ? izmijeniEvidenciju($conn, $id) : null;

    echo '<h2 class ="center-align evidencijanaslov">Evidencija</h2> 
    <div class="row"> 
    <form action="http://localhost/robinzonlucica/public/includes/evidencija.inc.php" class="col s12 registerforma" method="post"> 
    <!-- 新增隐藏字段,把ID传给后台处理更新 -->
    <input type="hidden" name="edit_id" value="'.($id ?? '').'">
    <div class="row"> 
    <div class="input-field col s6"> 
    <input id="ime" type="text" class="validate" name="ime" value="'.($editrow['evidencijaTuristIme'] ?? '').'"> 
    <label for="last_name">Ime Turista</label> 
    </div> 
    </div> 
    <div class="row"> 
    <div class="input-field col s6"> 
    <input id="ime" type="text" class="validate" name="prezime" value="'.($editrow['evidencijaTuristPrezime'] ?? '').'"> 
    <label for="last_name">Prezime turista</label> 
    </div> 
    </div> 
    <div class="row"> 
    <div class="input-field col s6"> 
    <input id="ime" type="text" class="validate" name="oib" value="'.($editrow['evidencijaTuristOIB'] ?? '').'"> 
    <label for="last_name">OIB Turista</label> 
    </div> 
    </div> 
    <div class="row"> 
    <div class="input-field col s6"> 
    <input type="text" name="datum" id="datum" class="datepicker" value="'.($editrow['evidencijaTuristDatumOdlaska'] ?? '').'"> 
    <label for="datum">Datum odlaska</label> 
    </div> 
    </div> 
    <button class="btn waves-effect waves-light gumbsalji" type="submit" name="submit">Upiši</button> 
    </div> 
    </form>'; 
  } else { 
    echo '<h1>Prijavite se kako bi vidjeli evidenciju</h1>'; 
  }
?>

这里用了??空合并运算符,避免当$editrow为null时报错,同时新增了隐藏字段edit_id,方便后台更新时拿到要修改的ID。

3. 调整evidencija.inc.php的逻辑,处理表单更新

把原来的查询逻辑改成处理表单POST提交的更新逻辑,同时兼容旧的跳转:

<?php
// 处理表单提交的更新请求
if(isset($_POST["submit"]) && isset($_POST["edit_id"])){ 
  $id = $_POST["edit_id"];
  $ime = $_POST["ime"];
  $prezime = $_POST["prezime"];
  $oib = $_POST["oib"];
  $datum = $_POST["datum"];

  require_once $_SERVER['DOCUMENT_ROOT'].'/robinzonlucica/public/includes/dbh.inc.php'; 
  require_once $_SERVER['DOCUMENT_ROOT'].'/robinzonlucica/public/includes/funkcije.inc.php'; 

  // 调用更新函数(需要新增这个函数)
  azurirajEvidenciju($conn, $id, $ime, $prezime, $oib, $datum);
}

// 兼容旧的跳转:如果有人直接访问这个文件带edit参数,跳转到表单页面
if(isset($_GET["edit"])){ 
  header("location: http://localhost/robinzonlucica/public/evidencija.php?edit=".$_GET["edit"]); 
  exit(); 
}
?>

4. 新增更新函数到funkcije.inc.php

在funkcije.inc.php里添加处理数据库更新的函数:

function azurirajEvidenciju($conn, $id, $ime, $prezime, $oib, $datum) { 
  $sql = "UPDATE evidencija SET evidencijaTuristIme = ?, evidencijaTuristPrezime = ?, evidencijaTuristOIB = ?, evidencijaTuristDatumOdlaska = ? WHERE evidencijaId = ?;"; 
  $stmt = mysqli_stmt_init($conn); 
  
  if(!mysqli_stmt_prepare($stmt, $sql)){ 
    header("location: http://localhost/robinzonlucica/public/evidencija.php?error=stmtgreska"); 
    exit(); 
  } 
  
  mysqli_stmt_bind_param($stmt, "sssss", $ime, $prezime, $oib, $datum, $id); 
  mysqli_stmt_execute($stmt); 
  mysqli_stmt_close($stmt);

  // 更新成功后跳转回表单页面,带成功提示
  header("location: http://localhost/robinzonlucica/public/evidencija.php?success=updated"); 
  exit(); 
}

为什么之前硬编码$id能正常工作?

当你手动给$id赋值时,表单页面里的izmijeniEvidenciju函数能拿到有效的ID,顺利查询到数据库数据并填充表单;而之前的逻辑里,$id只在inc.php里存在,表单页面根本没获取这个变量,所以报错。

内容的提问来源于stack exchange,提问作者Marin Spudić

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:49:26