如何在点击按钮后用PHP更新MySQL表的x、y列值?
解决点击Update按钮无法获取x/y值并更新MySQL的问题
首先,咱们先梳理下你遇到的核心问题:Undefined index警告和无法获取输入框值更新数据库,这俩其实是关联的,下面一步步给你拆解修复:
1. 先解决Undefined index警告
你代码里直接写了:
$getx = $_GET['forx']; $gety = $_GET['fory'];
这里有两个明显问题:
- 你的表单用的是
method=post,但你却用$_GET去取值,应该对应使用$_POST - 不管表单有没有提交,你都直接去取这两个变量,当页面首次加载或者没触发Update提交时,这两个索引根本不存在,自然会抛出Undefined index警告
修复方式:改成条件判断后再安全取值,PHP7+可以用更简洁的空合并运算符:
$getx = $_POST['forx'] ?? ''; $gety = $_POST['fory'] ?? '';
如果是低版本PHP,就用三元运算符:
$getx = isset($_POST['forx']) ? $_POST['forx'] : ''; $gety = isset($_POST['fory']) ? $_POST['fory'] : '';
2. 修复表单结构,确保x/y值能被提交
你现在的代码里,图片点击的表单、x/y输入框的表单、Location下拉框是分散开的!这样点击Update按钮时,根本不会把x/y的输入值一起提交到后台,因为它们不在同一个表单域里。
要把所有需要一起提交的元素(x输入框、y输入框、Location下拉框、Update按钮)放在同一个<form>标签里,示例如下:
<?php if (isset($img) && mysqli_num_rows($img)) : ?> <?php while($row = mysqli_fetch_assoc($img)) { $filepath = $row['map_image_filepath']; $foo_x = $_POST['foo_x'] ?? ''; $foo_y = $_POST['foo_y'] ?? ''; if(file_exists($filepath)) { ?> <!-- 合并所有需要提交的元素到同一个表单 --> <form action='' method='post'> <!-- 图片点击区域(点击后会自动提交foo_x/foo_y) --> <input type='image' src='<?= $filepath ?>' name='foo' style='cursor:crosshair; border: 2px outset #000;' height='300px' width='400px'> <!-- x/y输入框:注意id要唯一,之前两个输入框用了同一个id是无效的 --> <div class='form-group form-inline' style='margin-top: 35px;'> <label class='form-inlineinput' for='inlineinput_x'> X </label> <input class='form-control form-control-sm' type='text' id='inlineinput_x' value='<?= $foo_x ?>' name='forx' size='10px'> </div> <div class='form-group form-inline'> <label class='form-inlineinput' for='inlineinput_y'> Y </label> <input class='form-control form-control-sm' type='text' id='inlineinput_y' value='<?= $foo_y ?>' name='fory' size='10px'> </div> <!-- Location下拉框和Update按钮 --> <select name='loctn' class='dropdown' style='margin: 10px 0;'> <option value=''>Choose Location</option> <?php // 先判断selectedbldg是否有效,避免SQL错误 if (!empty($selectedbldg)) { $lquery = mysqli_query($con, "SELECT location_ID, location_name, building_ID FROM location WHERE building_ID = {$selectedbldg}"); while ($row_loc = mysqli_fetch_assoc($lquery)) : ?> <option value='<?= $row_loc['location_ID'] ?>' <?= $row_loc['location_ID'] == $selectedloctn ? 'selected' : '' ?>> <?= $row_loc['location_name'] ?> </option> <?php endwhile; } ?> </select> <input type='submit' name='update_loc' class='btn btn-primary btn-xs' value='Update'> </form> <?php } else { echo "<img src='../img/no map.jpg' height='300' width='400'>"; } } ?>
3. 修正Update逻辑的触发条件与安全性
你之前的代码是当!empty($_POST['loctn'])时执行更新,但其实应该判断是否点击了Update按钮(比如isset($_POST['update_loc'])),同时要必须用预处理语句防止SQL注入(直接把变量拼进SQL里是非常危险的操作)。
修复后的Update逻辑:
$selectedloctn = null; $getx = $_POST['forx'] ?? ''; $gety = $_POST['fory'] ?? ''; // 当点击Update按钮,且所有必要参数都不为空时执行更新 if (isset($_POST['update_loc']) && !empty($_POST['loctn']) && !empty($getx) && !empty($gety)) { $selectedloctn = $_POST['loctn']; // 使用预处理语句,避免SQL注入 $stmt = $con->prepare("UPDATE location SET x=?, y=? WHERE location_ID = ?"); // 绑定参数:s=字符串,i=整数,根据你的数据库字段类型调整 $stmt->bind_param("ssi", $getx, $gety, $selectedloctn); $stmt->execute(); // 可选:添加更新反馈 if ($stmt->affected_rows > 0) { echo "<p style='color:green;'>坐标更新成功!</p>"; } else { echo "<p style='color:red;'>更新失败,请检查参数!</p>"; } $stmt->close(); }
4. 其他细节优化
- 数据库连接错误处理:可以加个判断,避免后续操作无意义:
$con = new mysqli("localhost", "root", "", "user_databases"); if ($con->connect_error) { die("数据库连接失败: " . $con->connect_error); }
- 图片点击后的坐标赋值:图片作为提交按钮时,会自动把点击坐标以
foo_x和foo_y的参数提交,这个逻辑是没问题的,只要在同一个表单里,输入框就能获取到对应值。
按照上面的步骤修改后,应该就能解决Undefined index警告,并且成功获取x/y值更新数据库了。
内容的提问来源于stack exchange,提问作者rookie_programmer
相关产品推荐
相关产品推荐

