如何在MySQL表中存储营业时间?

4

我正在开发一个涉及当地餐厅的网站,其中一件事情是将餐厅营业时间存储在mysql中。

从HTML到PHP传递的数据如下所示。

// Eg: from Monday to Saturday 8am to 10pm
$_POST['from'], $_POST['to'], $_POST['opening_time'], $_POST['closing_time']

我的sql表结构大致如下。
CREATE TABLE business_hours (
  id integer NOT NULL PRIMARY KEY,
  restaurant_id integer NOT NULL,
  day integer NOT NULL,
  open_time time,
  close_time time
)

我的问题是用户提供了以上格式的两个日期,包括开放和关闭时间。现在我需要在business_hours表中插入这两天之间所有记录。

例如:如果一周的开放和关闭时间为星期一星期五

那么我需要将这些营业时间存储在我的表中,如下所示:

Monday,9am,11pm
Tuesday,9am,11pm
Wednesday,9am,11pm
Thursday,9am,11pm
Friday,9am,11pm

请问有人能告诉我如何做到这一点吗?

任何想法都将不胜感激。

谢谢。


将move day、open_time和close_time移动到一个名为hours_of_operation(或其他名称)的单独表中。在第二个表中添加另一列restaurant_id,该列将匹配第一个表中的值。然后,您可以在第二个表中为每个餐厅添加多个条目,并且restaurant_id将是两者之间的链接(关系)。搜索“关系数据库一对多”以获取有关此概念的更多信息。 - CrayonViolent
@CrayonViolent,你能告诉我为什么我需要在这里使用两个表格,以及为什么我的“business_hours”表格不能有属于同一餐厅的多个条目吗? - TNK
如果数据是这样的,你如何知道所有记录的年份、月份和日期是什么? - Alive to die - Anant
@anantkumarsingh,其实并不需要知道是哪个月和年份。因为用户可以每周更新他们的可用性。 - TNK
一个查找表会有所帮助,例如以Id和Day作为字段(1,星期一),(2,星期二),(3,星期三)...作为值。选择从某天到某天之间的日期,您将获得记录并尝试插入这些记录。 - HashSu
显示剩余3条评论
1个回答

2

经过大量的研究、试验和错误,我终于找到了适合我的方法。这些数据都是基于餐厅动态结构化标记的条目。

创建表的SQL语句:

CREATE TABLE tbl_businesshrs (
`id` int(11) NOT NULL,
`tbl_index_id` int(11) NOT NULL,
`DoW` varchar(128) NOT NULL,
`status` enum('Open','Closed') NOT NULL COMMENT '0 is Cosed',
`start_time` varchar(128) NOT NULL,
`end_time` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

tbl_index_id是餐厅表中餐厅的id,它是一个索引。DoW代表一周中的某一天。

我还包括了AJAX函数来更新营业时间表格当营业时间发生变化时。然后在餐厅设置php页面上,我包括了每一天的记录源查询,以便将存储在数据库中的值更新到选择字段中。

查询语句:

<?php 
$colname_rs_mondayshrs = "-1"; 
if (isset($_GET['restaurantid'])) { 
  $colname_rs_mondayshrs = $_GET['restaurantid']; 
} 
mysqli_select_db( $restaurant, $database_restaurant); 
$query_rs_mondayshrs = sprintf("SELECT * FROM tbl_businesshrs WHERE tbl_index_id = %s 
AND DoW='Monday'", GetSQLValueString($colname_rs_mondayshrs, "int")); 
$rs_mondayshrs = mysqli_query( $restaurant, $query_rs_mondayshrs) or 
die(mysqli_error($GLOBALS["___mysqli_ston"])); 
$row_rs_mondayshrs = mysqli_fetch_assoc($rs_mondayshrs); 
$totalRows_rs_mondayshrs = mysqli_num_rows($rs_mondayshrs);    

?> 

接下来是一周的每一天。然后, PHP stcrcmp 函数将比较数据库中开放和关闭的条目,并使用相关条目填充选择选项:

<select id="mondaystatus" onChange="update_mondaystatus()">
                      <option selected value="" <?php if (!(strcmp("", 
$row_rs_mondayshrs['status']))) {echo "selected=\"selected\"";} ?>>Open or Closed? 
</option>
                      <option value="Open" <?php if (!(strcmp("Open", 
$row_rs_mondayshrs['status']))) {echo "selected=\"selected\"";} ?>>Open</option>
                      <option value="Closed" <?php if (!(strcmp("Closed", 
$row_rs_mondayshrs['status']))) {echo "selected=\"selected\"";} ?>>Closed</option>
                    </select>

结果如下:

enter image description here

在数据库中的结果:

enter image description here

如果有兴趣或者能够帮助节省宝贵的时间,我可以添加AJAX功能。


2
你应该改进你的命名方式。tbl_index_id 对于一个列来说是非常奇怪的名称 ;) 它完全没有表明这是餐厅的关键字。干杯! - Damian Dziaduch
谢谢@DamianDziaduch。非常感谢 :-) - Iwan Ross
如何更新特定的小时?是通过搜索哪天记录已更改并更新列值还是删除所有行并插入新行来完成? - Biswas Khayargoli
@IwanRoss 你们餐厅有没有办法在同一天开放两个时间段?(例如,周五上午11点至下午2点和下午5点至晚上9点) - Mike Alvim
@MikeAlvim 我想不出实现你想要的目标的方法。 - Iwan Ross
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接