用一个整型字段保存多个开关状态

来源:互联网 发布:人工智能 炒作 知乎 编辑:程序博客网 时间:2024/04/28 18:26

需求: 任务系统中有多个任务, 用户完成每个任务都可以领取奖励, 为防止同一个任务奖励被同一个用户多次领取,需要将领取过的标记一下

比较直接的数据库表设计看起来像这样: 用户ID,任务ID,是否领取
不过这里要说的是另外一种设计: 用户ID,领取状态(一个整型字段)
限制: 领取状态字段为32位整型时只能存储任务ID在[1-32)范围内的31个状态值, 64位时为[1-64)内的63个值
PHP代码示例:

error_reporting(E_ALL ^ E_NOTICE);$status = 0; //多个任务的领取状态$tid1 = 9; //任务ID$mask1 = $tid1 > 2 ? (2 << ($tid1 - 2)) : $tid1;$status |= $mask1; //标识指定任务的领取状态为已领取$tid2 = 1;$mask2 = $tid2 > 2 ? (2 << ($tid2 - 2)) : $tid2;$status |= $mask2;$tid3 = 12;echo "任务 {$tid1}: ", ($mask1 & $status ? '已' : '未'), "领取\n";echo "任务 {$tid2}: ", ($mask2 & $status ? '已' : '未'), "领取\n";echo "任务 {$tid3}: ", ($mask3 & $status ? '已' : '未'), "领取\n";//MySQL更新 UPDATE uinfo SET status = status | $mask WHERE uid=$uid
1 0
原创粉丝点击