PHP CRUD Update功能异常:无报错但数据未修改求助
PHP CRUD系统更新功能异常排查与修复
我的PHP CRUD系统中,除Update(更新)功能外其余功能均正常。点击更新按钮后无报错,页面跳转至首页并提示“Ticket modifie”,但数据库工单数据未变更。相关代码如下:
前端表单代码
<?php session_start(); include 'connection.php'; ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Ticket Edit</title> </head> <body> <div class="container mt-5"> <?php include('msg.php'); ?> <div class="row"> <div class="col-md-12"> <div class="card"> <div class="card-header"> <h4>Ticket Edit <a href="homepage.php" class="btn btn-danger float-end">BACK</a> </h4> </div> <div class="card-body"> <?php if(isset($_GET['id'])) { $ticket_id = mysqli_real_escape_string($conn, $_GET['id']); $query = "SELECT * FROM tickets WHERE id='$ticket_id' "; $query_run = mysqli_query($conn, $query); if(mysqli_num_rows($query_run) > 0) { $ticket = mysqli_fetch_array($query_run); ?> <form action="crud.php" method="POST"> <input type="hidden" name="ticket_id" value="<?= $ticket['id']; ?>"> <div class="mb-3"> <label>Username</label> <input type="text" name="username" value="<?=$ticket['username'];?>" class="form-control"> </div> <div class="mb-3"> <label>Titre</label> <input type="text" name="titre" value="<?=$ticket['titre'];?>" class="form-control"> </div> <div class="mb-3"> <label>Probleme</label> <input type="text" name="probleme" value="<?=$ticket['probleme'];?>" class="form-control"> </div> <div class="mb-3"> <label>Etat</label> <input type="radio" name="ouvert" value="<?=$ticket['etat'];?>"><label for="">Ouvert</label><br> <input type="radio" name="ferme" value="<?=$ticket['etat'];?>"><label for="">Ferme</label><br> <input type="radio" name="resolu" value="<?=$ticket['etat'];?>"><label for="">Resolu</label><br> </div> <div class="mb-3"> <button type="submit" name="update" class="btn btn-primary"> Update Ticket </button> </div> </form> <?php } else { echo "<h4>No Such Id Found</h4>"; } } ?> </div> </div> </div> </div> </div> </body> </html>
更新处理代码(crud.php中)
if(isset($_POST['update'])){ $ticket_id = mysqli_real_escape_string($conn,$_POST['id']); $username=mysqli_real_escape_string($conn,$_POST['username']); $titre=mysqli_real_escape_string($conn,$_POST['titre']); $probleme=mysqli_real_escape_string($conn,$_POST['probleme']); $etat=mysqli_real_escape_string($conn,$_POST['etat']); $query="UPDATE tickets SET username='$username', titre='$titre' , probleme='$probleme', etat='$etat' WHERE id='$ticket_id' "; $query_run=mysqli_query($conn,$query); if($query_run){ $_SESSION['msg']="Ticket modifie"; header("location: homepage.php"); exit(0); }else{ $_SESSION['msg']="Ticket n'est pas modifie"; header("location: affichage.php"); exit(0); } } ?>
问题原因与修复方案
1. 隐藏字段名称不匹配
前端表单中隐藏字段的name是ticket_id,但后端处理代码中试图获取$_POST['id'],导致$ticket_id为空值。数据库执行UPDATE语句时,WHERE id=''匹配不到任何记录,所以数据没变更,但mysqli_query会返回true(语法无错误),因此跳转到首页并显示成功提示。
修复:
修改后端代码中的字段获取名称:
$ticket_id = mysqli_real_escape_string($conn,$_POST['ticket_id']);
2. 状态单选框配置错误
前端三个单选框使用了不同的name属性(ouvert、ferme、resolu),不属于同一组单选框,用户可同时选中多个,且后端无法通过$_POST['etat']获取值(无对应name的表单元素)。同时所有单选框的value都设为数据库旧值,用户选择后提交的还是原状态,无法更新。
修复:
统一单选框name为etat,设置对应value并根据当前状态默认选中:
<div class="mb-3"> <label>Etat</label> <input type="radio" name="etat" value="Ouvert" <?= $ticket['etat'] == 'Ouvert' ? 'checked' : '' ?>><label for="">Ouvert</label><br> <input type="radio" name="etat" value="Ferme" <?= $ticket['etat'] == 'Ferme' ? 'checked' : '' ?>><label for="">Ferme</label><br> <input type="radio" name="etat" value="Resolu" <?= $ticket['etat'] == 'Resolu' ? 'checked' : '' ?>><label for="">Resolu</label><br> </div>
3. 可选优化:添加更新有效性校验
为避免语法正确但无数据更新的误判,可检查受影响行数:
$query_run=mysqli_query($conn,$query); if($query_run && mysqli_affected_rows($conn) > 0){ $_SESSION['msg']="Ticket modifie"; header("location: homepage.php"); exit(0); }else{ $_SESSION['msg']="Ticket n'est pas modifie"; header("location: affichage.php"); exit(0); }
内容的提问来源于stack exchange,提问作者lamar
相关产品推荐
相关产品推荐

