0

我正在开发一个预订系统。我的网站目前的工作方式是用户登录并选择约会。我需要帮助来显示他们在下一页上预订的约会。此外,当他们预订约会时,其他用户应该不再可以使用它。

<?php
{
    mysql_connect("localhost" , "" , "") or die (mysql_error());
    mysql_select_db("") or die(mysql_error());


    $pid=intval($_SESSION["Patient_id"]); $query = "SELECT t1.*, t2.Doctor_name, t2.Doctor_room FROM Appointment AS t1 INNER JOIN Doctor AS t2 ON t1.Doctor_id=t2.Doctor_id";

    //executes query on the database
    $result = mysql_query ($query) or die ("didn't query");

    //this selects the results as rows
    $num = mysql_num_rows ($result);    


    while($row=mysql_fetch_assoc($result))
    {
        $_SESSION['Appointment_date'] = $row['Appointment_date'];
        $_SESSION['Appointment_time'] = $row['Appointment_time'];
        $_SESSION['Doctor_name'] = $row['Doctor_name'];
        $_SESSION['Doctor_room'] = $row['Doctor_room'];
    }
}
?>  

        <strong>Dates available</strong>            
        <select id="Availability" name="Availability">                      
        <option value="0">--Select date--</option>
        <option value="3"><?php echo $_SESSION['Appointment_date'];?></option>
        </select>

        <br />
        <br />

        <strong>Times available</strong>            
        <select id="Availability" name="Availability">                      
        <option value="0">--Select time--</option>
        <option value="3"><?php echo $_SESSION['Appointment_time'];?></option>>
        </select>

        <br />
        <br />

            <strong>Doctor Name</strong>            
        <select id="Availability" name="Availability">                      
        <option value="0">--Name--</option>
        <option value="2"><?php echo $_SESSION['Doctor_name'];?></option>>
        </select>

        <br />
        <br />

            <strong>Doctor Room</strong>            
        <select id="Availability" name="Availability">                      
        <option value="0">--Room--</option>
        <option value="2"><?php echo $_SESSION['Doctor_room'];?></option>>
        </select> 

上面的代码允许用户根据可用的内容进行约会。此表称为约会表。当用户单击下一步时,我需要将此信息显示给用户,以便显示他们的约会,并且约会不应再对其他用户可用

谢谢!

4

1 回答 1

3

首先,您拥有的代码不像您希望的那样工作。从这些是下拉列表的事实来看,您可能需要多个选项。但是您输入的只是一个选项:查询提供的最后一行。您的 while 循环只是用下一行覆盖每一行的信息,直到它退出。

你有什么理由为这些使用 $_SESSION 吗?为什么不直接使用新变量?如果您使用 $_SESSION,您将使用服务器的空间来保存用户在您网站上的整个时间的信息,然后再过多久,您的垃圾收集器就会来获取它。如果您只想要一页的信息,您应该使用不会保持保存和占用空间的普通变量。(不是几行文本占用那么多空间,而是事情的原理......)如果您试图通过保存到 SESSION 变量来避免执行多个数据库调用,您应该检查是否设置了这些变量第一的。

其次,您将日期和时间拆分为单独的选择器意味着用户将能够选择实际不可用的日期和时间选项。例如,如果您有周二 10:00 和周三 4:00 可用,那么根据您的预期设计,您的用户将能够选择周二 10:00、周二 4:00、周三 10:00 或周三 4:00 . 现在我想起来,实际上不同的医生和房间也是如此。除非您打算同时在房间 A 和房间 B 预订 X 医生。除非您打算使用 javascript 和/或 ajax,或者重新加载页面并进行新的数据库搜索,以在用户选择它们时更改可用选择,否则您实际上只能有一个下拉列表。例如,您可能希望他们选择一个日期,然后让页面自动更新可用的时间和医生,对吗?但这是一个完全更复杂的问题和答案,所以我现在不理会它。

第三,正如其他人已经评论的那样,确保你摆脱了 mysql_* 的东西并用现代方法替换它。我可以根据经验证明它可能导致数据库连接未按预期关闭的问题。我将它留在下面的示例中,因为您有三个升级选项,它们看起来都不同,所以最好不要在这里混淆这个问题。

最后,要回答您的问题,您需要将 html 放入表单中,并将提交按钮放入表单中,以便他们发送。在表单标签中,您将“action”作为预期登录页面的 url,将“method”作为 post。然后,当登录页面加载时,根据表单中元素的名称和选项的值,表单中选择的信息将位于 $_POST 变量中。这意味着您必须为每个元素分配不同的名称,并且必须为每个选项的“值”分配正确的值。顺便说一句,您永远不能在同一页面上拥有相同的“id”元素。

这是一个结合了我刚才提到的大部分内容的示例,尽管下拉菜单不会真正按照您需要的方式工作——我按顺序保留了其中三个,以便您可以看到 POST 是如何工作的,但实际上您只需要一个下拉菜单。

//on your current page 
//.... database stuff .....
$dates_and_times = array();
$doctors = array();
$rooms = array();
while($row=mysql_fetch_assoc($result))
{
    $dates_and_times[] = $row['Appointment_date'].' '.$row['Appointment_time'];
    $doctors[] = $row['Doctor_name'];
    $rooms[] = $row['Doctor_room'];

    //with SESSION, this would have been:
    //(note the extra brackets [] to create arrays)
    //$_SESSION['Appointment_date_and_time'][] = $row['Appointment_date'].' '.$row['Appointment_time'];
    //$_SESSION['Doctor_name'][] = $row['Doctor_name'];
    //$_SESSION['Doctor_room'][] = $row['Doctor_room'];
}
?>
<form method="post" action="landing_page.php">
    <strong>Dates available</strong>            
    <select id="Date" name="Date">                      
    <option value="0">--Select date--</option>
    <?php  foreach ($dates_and_times as $app_date) { ?>
        <option value="<?php echo $app_date; ?>"><?php echo $app_date; ?></option>
    <?php } ?>
    </select>

    <br />
    <br />

        <strong>Doctor Name</strong>            
    <select id="Doctor" name="Doctor">                      
    <option value="0">--Name--</option>
    <?php  foreach ($doctors as $doc) { ?>
        <option value="<?php echo $doc; ?>"><?php echo $doc; ?></option>
    <?php } ?>
    </select>

    <br />
    <br />

        <strong>Doctor Room</strong>            
    <select id="Room" name="Room">                      
    <option value="0">--Room--</option>
    <?php  foreach ($rooms as $room) { ?>
        <option value="<?php echo $room; ?>"><?php echo $room; ?></option>
    <?php } ?>
    </select> 

    <input type="submit" name="Go" />
</form>


//on the landing page
//echo based on the name of the posted element
//$_POST has the values of all of the elements in the form that had a name
<strong> You selected an appointment with 
     <?php echo $_POST['Doctor']; ?>
     on 
     <?php echo $_POST['Date']; ?>
     in room
     <?php echo $_POST['Room']; ?>
</strong>

除了只显示信息之外,您还需要在登录页面上有一些东西来将用户的选择保存在数据库中。如果您不希望其他用户能够预订相同的预约时间,这意味着您的原始选择语句需要查看“已预约”表,并仅查找预约日期、时间、医生和房间t 已经显示在下拉列表中。您将需要考虑更改当前的 SELECT 以仅获取可用的约会,并且您将需要查看 INSERT 查询以使用 POST 信息保存选定的约会。

回答评论中的问题: 有很多不同的方法来设计你正在寻找的东西。我认为您将有一些用户正在寻找特定的医生,但其他用户正在寻找特定时间并且不在乎他们得到什么医生。这就是为什么,如果它是我的网站,我会根据天制作一个选择器。我会将“第二天”和“前一天”按钮以及日历选择器放在顶部。当他们选择一天后重新加载页面时,我会从数据库中获取仅当天的医生信息和时间。有了这些信息,我将创建一个大表,其中一个轴为医生,另一个轴为时间。我会为每个可用的预约时间在桌子上放置按钮,以便用户单击那个时间 x 医生来选择他们的预约,如果那个时候x医生不可用,显然没有按钮。然后,用户可以一目了然地看到什么时间有空,以及全天有哪些医生有空。

在我看来,处理页面重新加载的最好方法是将日期选择器放在它自己的同页发布表单中:

<form action="" method="get">

     //date selector here, named "Date"

</form>

然后我会检查 $_GET 变量是否选择了日期。如果是这样,我会将表格加载到第二个表单中。我会将 $_GET 日期放在隐藏的输入中,这样当他们从该表单中发布某些内容时,它就会被发送。

<form action="the_landing_page.php" method="post">
     <input type="hidden" name="Date" value="<?php echo $_GET['Date']; ?>" />

     //table here
     //submit button here

</form>

然后,用户从表中的选择将发布到 the_landing_page,就像在我的第一个示例中一样。现在你可以自己弄清楚细节。祝你好运。

于 2013-04-01T22:16:48.027 回答