如何将表单中的$row['id']传递至toggle.php并用于设备状态更新?
解决你的智能家居设备开关控制问题
我来帮你搞定这个问题!你的核心问题出在toggle.php里的取值逻辑上——你在那里用了$row['id'],但这个变量只存在于渲染设备表单的页面(比如你展示设备列表的页面),到了toggle.php,你得从POST请求里直接拿表单提交的id值,也就是$_POST['id']。
另外,你的代码现在有严重的SQL注入风险,直接把用户提交的参数拼进SQL语句太不安全了,必须用预处理语句来修复这个问题。
修正后的toggle.php代码
<?php include('devices.php'); // 先验证提交的ID是否合法(设备ID一般是整数) if(isset($_POST['id']) && is_numeric($_POST['id'])){ $deviceId = (int)$_POST['id']; if(isset($_POST["on"])){ // 使用预处理语句,彻底避免SQL注入 $stmt = $mysqli->prepare("UPDATE devices SET status = 'On' WHERE id = ?"); $stmt->bind_param("i", $deviceId); $stmt->execute(); $stmt->close(); } elseif(isset($_POST["off"])){ $stmt = $mysqli->prepare("UPDATE devices SET status = 'Off' WHERE id = ?"); $stmt->bind_param("i", $deviceId); $stmt->execute(); $stmt->close(); } } // 处理完后可以跳回设备列表页面,比如: // header("Location: your_device_list.php"); // exit; ?>
关键说明
- 表单本身没问题:你写的隐藏字段
<input type="hidden" name="id" value="<?php echo $row['id'];?>">已经正确把设备ID传递给toggle.php了,不用改表单代码。 - 为什么用
(int)$_POST['id']:强制把参数转为整数,确保传入的是合法的设备ID,避免非数字值导致数据库出错。 - 预处理语句的重要性:把SQL逻辑和用户输入的数据分开,彻底杜绝SQL注入攻击,这是操作数据库的标准安全做法。
内容的提问来源于stack exchange,提问作者Redhawk
相关产品推荐
相关产品推荐

