基本上在我的网站上,每周的每一天都有复选框。如果用户检查它们,那么这些是在其用户帐户中保存(在字段中)的日期。
我如何保存这些日期?例如,如果某人检查周六和周三,另一个人在星期一和星期二保存,保存这些信息的好方法是什么?
有人建议将其保存为0001001这样的位字符串,1表示星期几检查标记,代表每天的7位。有什么想法吗?
表格如下所示:
user_id | days
10 | 0010010 (Wednesday and Saturday, week starts on Monday)
唯一的问题是如何从php输出此信息?
(我试图在mysql和php方面以最优的方式做到这一点)
答案 0 :(得分:2)
建议在MySQL中使用长度为7的位字段类型,以保持较低的存储要求(BIT(7)
)。
唯一的问题是如何从php输出此信息?
第一步是定义每个位到工作日名称的映射:
$days = array(
'Monday',
'Tuesday',
...
'Sunday'
);
然后,您首先需要从数据库中选择二进制值,例如作为十进制(整数)值:
SELECT days+0 FROM table;
在PHP中,您可以使用decbin
和substr
将其转换为固定宽度的二进制数字字符串:
$binary = substr('000000'.decbin($integer), -7);
或者可能更方便sprintf
:
$binary = sprintf('%07b', $integer);
由于每个字符都是0
或1
,您可以迭代它们并为所有设置日创建一个数组:
$array = array();
foreach (range(0, 7) as $day)
{
if (! $set = (int) $binary[$day])
continue;
$array[] = $days[$day];
}
生成的$array
现在包含用户选中的所有工作日名称。然后您可以输出它们:
$output = '(none)';
if (1 === $count = count($array)
{
$output = $array[0]; # one day
}
elseif ($count)
{
$last = array_pop($array); # last day
$output = implode(', ', $array) . ' and ' . $last;
}
这是数据库值的输出。希望这有用。
答案 1 :(得分:1)
我建议这样一个表:
id user_id day
1 1 1
2 1 4
3 2 1
4 3 7
答案 2 :(得分:1)
您可以将日期存储在序列化数组中,这样就可以在需要时轻松将其恢复。
$days = array('wednesday','saturday');
$store = serialize($days);
然后为$store
user_id
答案 3 :(得分:1)
我认为存储起来会更容易:
user_id | sun | mon | tues | wed |...
01 | 1 | 0 | 0 | 1 |
将日期列留作tinyint(1)。这样,在PHP中,你可以这样:
if($row['sun'] == 1)
Do sunday stuff