You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现数据库中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:50:39