workerman/mysql 更新字段值为0时,入库后变成1

追梦随想

问题描述

在做一个物联网设备连接并通过认证后,更改状态为1,关闭连接后更改状态为0,但实际上0无法写入数据表,写进去的一直是1,好崩溃。。。

最开始我用的enum类型,并且设置默认值为0,代表设备默认离线

`state` enum('0','1') NOT NULL DEFAULT '0' COMMENT '状态:0离线、1在线',

可是试了很多遍,关闭连接后还是1,但是如果同时更新其他字段时,别的字段没事,当然同样不能为0。
我以为是默认值的事,后来把默认值去掉,测试还是如此。
再后来当设备断开连接时,我更新其他数据类型为 varchar 的字段,值为0,这时候才发现,数据库里面居然是1,这是啥情况啊,不给用0了吗?

程序代码或配置

        self::$db->update('devices')->cols([
            'state' => '0',
            'location' => '0'
        ])->where([
            'device_id' => $_SESSION['client_id']
        ])->query();

操作系统环境及workerman/webman等具体版本

windows10
mysql8

后续

在网上查到mysql8有保存0的问题,试了解决办法也不行
干脆卸载重新安装了5.7的,但是试了也是不行,真的是撞见鬼了。。。
后来用on/off来代替值,可是还是有这样的问题,似乎并不更新这个字段,难道这个state字段在搞特殊?
最后,无奈,用最原始的方法测试,没想到解决了。。。

    /**
    * 当用户断开连接时触发
    * @param int $client_id 连接id
    */
    public static function onClose($client_id)
    {
        //设备下线
        if (!isset($_SESSION['client_id'])) return;
        echo '设备下线' . "\r\n";
//         self::$db->update('devices')->cols([
//             'state' => 'off'
//         ])->where([
//             'device_id' => $_SESSION['client_id']
//         ])->query();
        self::$db->query("UPDATE `devices` SET `state` = '0' WHERE device_id = '{$_SESSION['client_id']}'");
        unset($_SESSION['client_id']);
    }

反正我到现在也没搞懂这是为啥,但是总感觉是哪里有问题。。。

493 0 0
0个回答

🔝