Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php/mysql,需要关于存储此数据的方法的建议吗_Php_Mysql - Fatal编程技术网

php/mysql,需要关于存储此数据的方法的建议吗

php/mysql,需要关于存储此数据的方法的建议吗,php,mysql,Php,Mysql,基本上,在我的网站上,一周中的每一天都有复选框。如果用户检查这些日期,则这些日期将保存(在字段中)在其用户帐户中 我该如何保存这些日期?例如,如果有人检查星期六和星期三,另一个人保存星期一和星期二,保存此信息的好模式是什么 有人建议将其保存为一个位字符串,如0001001。在表示每天的7位中,1代表选中的一周中的几天。有什么想法吗 该表如下所示: user_id | days 10 | 0010010 (Wednesday and Saturday, week starts on Mo

基本上,在我的网站上,一周中的每一天都有复选框。如果用户检查这些日期,则这些日期将保存(在字段中)在其用户帐户中

我该如何保存这些日期?例如,如果有人检查星期六和星期三,另一个人保存星期一和星期二,保存此信息的好模式是什么

有人建议将其保存为一个位字符串,如0001001。在表示每天的7位中,1代表选中的一周中的几天。有什么想法吗

该表如下所示:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff
唯一的问题是如何从php输出这些信息


(我试图在mysql和php端以最理想的方式实现这一点)

我建议这样一个表:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff

我建议这样一张桌子:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff

您可以将日期存储在一个序列化数组中,这样,您可以在需要时轻松地将其取回

$days = array('wednesday','saturday');
$store = serialize($days);

然后存储
$store
对于该
用户id

您可以将日期存储在序列化数组中,这样,您就可以在需要时轻松地将其取回

$days = array('wednesday','saturday');
$store = serialize($days);

然后存储
$store
对于该
用户id

我认为这样存储会更容易:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff
并将日列保留为tinyint(1)'s。这样,在PHP中,您可以这样做:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff

我认为这样储存会更容易:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff
并将日列保留为tinyint(1)'s。这样,在PHP中,您可以这样做:

user_id | days
10      | 0010010 (Wednesday and Saturday, week starts on Monday)
   id user_id day
   1     1     1
   2     1     4
   3     2     1
   4     3     7
user_id | sun | mon | tues | wed |...
     01 |  1  |  0  |  0   |  1  |
if($row['sun'] == 1)
    Do sunday stuff

在MySQL中使用长度为7的位字段类型的建议听起来很公平,可以保持较低的存储需求(
bit(7)

唯一的问题是如何从php输出这些信息

第一步是定义每个位到工作日名称的映射:

$days = array(
   'Monday',
   'Tuesday',
   ...
   'Sunday'
);
然后,首先需要从数据库中选择二进制值,例如作为十进制(整数)值:

在PHP中,您可以使用和将其转换为固定宽度的二进制数字字符串:

或者可能更方便:

由于这些字符中的每一个都是
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;
}

这是数据库值的输出。希望这会有所帮助。

在MySQL中使用长度为7的位字段类型的建议听起来很公平,可以保持较低的存储要求(
bit(7)

唯一的问题是如何从php输出这些信息

第一步是定义每个位到工作日名称的映射:

$days = array(
   'Monday',
   'Tuesday',
   ...
   'Sunday'
);
然后,首先需要从数据库中选择二进制值,例如作为十进制(整数)值:

在PHP中,您可以使用和将其转换为固定宽度的二进制数字字符串:

或者可能更方便:

由于这些字符中的每一个都是
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;
}

这是数据库值的输出。希望这会有所帮助。

虽然一周中的天数是固定的,但扩展的可能性会让我对这个解决方案保持谨慎。为什么?如果你使用极小的整数,你只需要添加更多的列,它们不会对你的记忆造成很大的伤害,也不会让你的速度变慢。为什么?因为有无限的可能性,第三个星期二,圣诞节后的第一个星期一。我生日后的星期天……啊,是的,很好。我会记住这一点,谢谢你的反馈。虽然一周中的几天是固定的,但扩展的潜力会让我对这个解决方案保持谨慎。为什么?如果你使用极小的整数,你只需要添加更多的列,它们不会对你的记忆造成很大的伤害,也不会让你的速度变慢。为什么?因为有无限的可能性,第三个星期二,圣诞节后的第一个星期一。我生日后的星期天……啊,是的,很好。我会记住这一点,感谢您的反馈。此表在两列上都需要一个唯一的键,以防止每个用户的数据包含重复的天数。该表需要在两列上都有一个唯一的键,以防止每个用户的数据包含重复的天数。而且查询的成本也会很高。