PHP在线注册系统的功能思想

时间:2014-01-29 15:31:04

标签: php jquery sql arrays time

对于在线注册系统中使用PHP编写函数的最佳方法有什么想法可能会占用对象;

为了清楚起见:
我想通过编写一个函数并比较两个变量来检查数据库中一个对象的可用性:

  1. 预订的开始时间;
  2. 他们的持续时间(完成时间);
  3. 所以当输入新的预订时,我会检查数据库;如果它没有通过该时期内对象的限制(通过与之前的预留比较),它会给出一条消息,然后我将其传递给JavaScript并启用“提交”按钮;但如果它通过我的JavaScript中的限制,我会建议一个可用于输入的开始时间的持续时间;

    在我目前的PHP函数中,我遇到了一些问题:

    • 首先我使用了很多变量和很多循环(如果变大,可能会导致系统变慢)并且代码看起来很乱!
    • 它无法识别串行或并发预留之间的区别,因此它对这些预留的行为相同。

    以下是我的功能片段:

    $reservation = new Reservation;
    $reservations = $reservation -> fetch_all();
    foreach ($reservations as $reservation) {
    for ($j = $res_code['res_code_st']; $j < $res_code['res_code_fi']; $j++) {
        for ($i = $reservation['res_code_st']; $i < $reservation['res_code_fi']; $i++) {
        if ($i == $j) {
            $count = $count + 1;
                $arr[] = $reservation['res_code_st'];
                            $arr[] = $reservation['res_code_fi'];
                            break 2;
    

    实际上我以这种格式存储时间; 例如12:30我存储1230或09:20我存储0920然后我检查任何项目的每一分钟与新预订的每一分钟(一切都发生在同一天:天没有问题!)并且如果它找到匹配,我将其视为该期间的新预订(其原因是并发和串行不同);

    我相信它应该很简单,但我有点困惑,我的思想现在不能用于更好的解决方案!

    感谢您的时间:)

    修改

    我尝试了@ kamil-maraz的建议方式,我认为它可以节省一些时间来降低复杂性,但我仍然无法弄清楚如何检查并发性。
    让我举一个例子:

    我试图在这个象征性的人物中展示出四种干扰的可能性,

    假设每一行都是跨时间的预约,第一行是新预订,接下来的四行已存储在数据库中;

    四种干扰如下:

    • 在新请求中间开始和结束的一个
    • 在新请求之前和之后开始的;
    • 完全在新预订中的一个;
    • 在新请求之后开始并在之后结束的一个;

                0-----------------0    
         0--------------------------------0
          0--------------0    
                           0----------0
                     0-----0
      
      $result = $db -> prepare('SELECT Count(reservation_id) FROM reservations WHERE (res_code_st < ? AND res_code_fi > ?) OR (res_code_st > ? AND res_code_fi < ?) OR (res_code_st < ? AND res_code_fi > ?) OR (res_code_st < ? AND res_code_fi > ?)');
      $result -> execute(array($res_code['res_code_st'], $res_code['res_code_st'], $res_code['res_code_st'], $res_code['res_code_fi'], $res_code['res_code_st'], $res_code['res_code_fi'], $res_code['res_code_fi'], $res_code['res_code_fi']));
      $row = $result -> fetch();
      

    这是在新请求的间隔给我的预订数量;但是这个案子呢:

    0--------------------------0
     0-----0
              0-----0
                       0------0
    

    虽然在区间中有4个保留无效(假设#object limit == 3),但由于每次保留不超过2个,所以它仍然有效(我所说的并发问题) )。

    任何想法我应该如何更改SQL函数来解决这个问题?

1 个答案:

答案 0 :(得分:1)

在我看来,它可以完全在数据库上完成。您正在获取所有结果,然后您对数据做了一些魔术。但是你可以通过数据库查询来完成它。

例如像这样的东西:

SELECT COUNT(id) FROM reservations WHERE date < ... AND date > ... AND ... etc

然后,在php中,您可以测试count ...

如果您想测试不同类型的预订,concurent等,您可以使用聚合表(Like somebedy used here,并且您也可以存储行类型的预订。