选择器上的 PHP 逻辑问题

Posted

技术标签:

【中文标题】选择器上的 PHP 逻辑问题【英文标题】:PHP Logic Issue on Selector 【发布时间】:2018-12-08 12:09:25 【问题描述】:

我有一个活动预订系统,它显示了一个测试系统的可用位置,我真的被一些逻辑困住了。

event_information (A) 存储有关事件的详细信息

event_machine_time (B) 存储测试笔记本电脑的事件时间,因为机器只允许在每天的特定时间使用

*********************************************
* id * machine_name * start_time * end_time *
*********************************************
* 1  * LPN832       * 09:30:00   * 11:00:00 *
* 2  * LPN832       * 11:30:00   * 13:00:00 *
* 3  * LPN832       * 13:30:00   * 15:00:00 *
* 4  * MHY348       * 09:30:00   * 11:00:00 *
* 5  * MHY348       * 11:30:00   * 13:00:00 *
* 6  * MHY348       * 13:30:00   * 15:00:00 *
*********************************************

event_booking (C) 存储预订详细信息,包括此人是否已通过 c_confirmed 拒绝活动以及此人是否已通过 live 删除

***************************************************************************
* id * information_id * candidate_id * machine_name_id * live * confirmed *
* 3  * 2666           * 356          * 1               * 1    * 2         *
* 4  * 2666           * 456          * 1               * 1    * 0         *
***************************************************************************

So my statuses for confirmed are:
0 - Not confirmed
1 - Confirmed
2 - Declined

My statuses for live are:
1 - Live
0 - Deleted

这是我的代码:

$Machine_Query = "SELECT *,
        B.id AS m_id,
        C.id AS c_id,
        C.confirmed AS c_confirmed,
        C.live AS c_live
        FROM event_information A
        INNER JOIN event_machine_time B on (1=1)
        LEFT JOIN event_booking C on (B.id = C.machine_time_id and A.id = C.information_id )
        WHERE A.id = '$Event_Data_ID'
        ORDER BY B.machine_name ASC, B.start_time ASC";
        $Machine = $dbconn->query($Machine_Query);

对于我的下拉选择器,我使用以下内容:

<?php foreach ($Machine->fetchAll() as $Machine_Row)  
                //if($Machine_Row["confirmed"] == 2)   else 
                ?>
              <option value="<?php echo $Machine_Row["m_id"]; ?>" <?php if($Machine_Row["c_id"] != NULL && $Machine_Row["c_confirmed"] != "2" && $Machine_Row["c_live"] != "0")  echo "disabled";  ?>><?php echo $Machine_Row["machine_name"]." - ".date("g:ia", strtotime($Machine_Row["start_time"])); ?><?php if($Machine_Row["c_id"] != NULL && $Machine_Row["c_confirmed"] != "2" && $Machine_Row["c_live"] != "0")  echo " - Booked";  ?></option>
        <?php  // ?> 

这是使用上述示例的输出,其中一个用户正在等待确认(因此显示已预订)而另一个用户已拒绝 - 看看它如何显示一个额外的插槽,如果我更改实时状态,同样适用:

现在您可以看到我添加了一个脏修复程序,我已经评论过它确实解决了问题,但它确实应该存在于 SQL 中,因为如果不尝试在 SQL 上隔离,我就无法正确构建有效性检查器.

这让我发疯了,这很可能是我看它的角度,所以非常感谢新鲜的眼睛。

【问题讨论】:

WHERE A.id = '$Event_Data_ID'之后添加这行AND B.confirmed &lt;&gt; 2; 你的 SGBD 是什么? 我真的很惊讶这个问题得到了支持。我不知道问题是什么。 【参考方案1】:

您可以选择一个布尔值来了解何时禁用该选项(此处命名为booked):

(c.id IS NOT NULL AND C.confirmed != 2 AND C.live != 0) AS booked

我编辑了一点你的 PDO 查询:

$Machine = $dbconn->prepare(
    'SELECT
        *,
        B.id AS m_id,
        C.id AS c_id,
        C.confirmed AS c_confirmed,
        C.live AS c_live,
        (c.id IS NOT NULL AND C.confirmed != 2 AND C.live != 0) AS booked   
    FROM event_information A
        INNER JOIN event_machine_time B
            ON (1 = 1)
        LEFT JOIN event_booking C
            ON (B.id = C.machine_time_id AND A.id = C.information_id)
    WHERE A.id = :event_data_id
    ORDER BY B.machine_name ASC, B.start_time ASC'
);

$dbconn->execute([ 'event_data_id' => $Event_Data_ID ]);

这将在 html 中输出更短(使用三元运算符在单行中看起来会更好):

<?php
foreach ($Machine->fetchAll() as $Machine_Row)  
    ?>
    <option value="<?php echo $Machine_Row["m_id"]; ?>" <?php echo $Machine_Row['booked'] ? 'disabled' : ''; ?>>
        <?php echo $Machine_Row["machine_name"] . " - " . date("g:ia", strtotime($Machine_Row["start_time"])) . ($Machine_Row['booked'] ? ' - Booked' : ''); ?>
    </option>
    <?php

?> 

【讨论】:

以上是关于选择器上的 PHP 逻辑问题的主要内容,如果未能解决你的问题,请参考以下文章

打开日期选择器上的今天按钮

引导日期选择器上的棘手问题

保存字段日期选择器上的 JqGrid 错误

日期选择器上的自定义输入字段

覆盖链式选择器上的 Tailwind CSS @apply 指令

为啥 Android 原生 HTML5 日期选择器上的 Chrome 变得非常慢?