点击编辑图标后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ć
相关产品推荐
相关产品推荐

