在做一个物联网设备连接并通过认证后,更改状态为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();
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']);
}
反正我到现在也没搞懂这是为啥,但是总感觉是哪里有问题。。。