如何实现数据库中device_mode值0与1互转?PHP代码遇问题
解决device_mode字段0和1互转的问题
你之前的写法错误在于$device_mode变量未被赋值就直接判断,自然无法得到正确结果。下面提供两种可靠的解决方式:
方法一:直接用SQL语句翻转值(推荐)
不需要提前查询当前字段值,直接通过SQL逻辑一步完成翻转,效率更高且代码更简洁:
function test(){ include_once 'api/db.php'; include_once 'api/users.php'; $devices_dep = "devices"; $database = new Database(); $db = $database->getConnection(); // 强制转为整数,降低SQL注入风险 $id = (int)$_GET['id']; // 利用1减当前值实现0和1互转,也可用device_mode = NOT device_mode(适用于布尔型字段) $sqlQuery = "UPDATE $devices_dep SET device_mode = 1 - device_mode WHERE id = $id"; $db->query($sqlQuery); }
原理:因为字段值只有0和1两种可能,1 - 0 = 1、1 - 1 = 0,刚好实现互转需求。
方法二:先查询当前值再更新
如果需要先获取当前值再处理,可先执行查询拿到字段值,再翻转后更新:
function test(){ include_once 'api/db.php'; include_once 'api/users.php'; $devices_dep = "devices"; $database = new Database(); $db = $database->getConnection(); $id = (int)$_GET['id']; // 先查询当前device_mode的值 $stmt = $db->prepare("SELECT device_mode FROM $devices_dep WHERE id = ?"); $stmt->execute([$id]); $device = $stmt->fetch(PDO::FETCH_ASSOC); // 若使用mysqli,写法类似 if ($device) { // 翻转字段值 $device_mode = $device['device_mode'] == 1 ? 0 : 1; // 执行更新 $updateStmt = $db->prepare("UPDATE $devices_dep SET device_mode = ? WHERE id = ?"); $updateStmt->execute([$device_mode, $id]); } }
重要提醒
原代码直接将$id拼接进SQL存在SQL注入风险,建议优先使用预处理语句(如方法二中的prepare+execute写法),即使是方法一,也推荐改用预处理进一步提升安全性。
内容的提问来源于stack exchange,提问作者RenRe
相关产品推荐
相关产品推荐

