【问题标题】:PHP table creation with 1 array manipulating through array indexes通过数组索引操作 1 个数组的 PHP 表创建
【发布时间】:2013-10-05 08:47:51
【问题描述】:

我有这个数据库:

+----+------------+------------+------------+------ ----+----------+------+------+---------- +------------+ |编号 |保留者 |日期 |时间开始 |持续时间 |结束时间 |成本 |详情 |状态 |添加日期 | +----+------------+------------+------------+------ ----+----------+------+------+---------- +------------+ | 1 |能量 | 2013 年 9 月 29 日 |上午 9 点至 10 点 | 3 |晚上 11 点至 12 点 | 1500 |篮球服! |待定 | 0000-00-00 | | 2 |芒卡诺| 2013 年 9 月 30 日 |上午 9 点至 10 点 | 8 |下午 5 点至 6 点 | 4000 |萨邦德雷! |批准| 0000-00-00 | +----+------------+------------+------------+------ ----+----------+------+------+---------- +------------+

我在我的桌子上使用它:

如您所见,上午 9 点到 10 点的时段是由 enerva 预留的;该小时的持续时间为 3,即“3 小时”,因此结束时间为晚上 11 点至 12 点。但是,在我的表格中,我无法在上午 10 点到 11 点和晚上 11 点到 12 点合并'Not Available, taken by: enerva' 字符串。

这是我的代码:

<?php 
if (isset($_GET['checkdate'])) {
    $date = urldecode($_GET['date']);
    echo "<br/><br/><h3>Reservations</h3>";
    echo $date;
    $timearray =  array("8-9am","9-10am","10-11am","11-12pm","12-1pm","1-2pm","2-3pm","3-4pm","4-5pm","5-6pm","6-7pm","7-8pm","8-9pm","9-10pm","10-11pm");
    $tablecolor = 1;
    echo "<table style='width: 90%;'>";
    echo "<tr>";
        echo "<th>";
            echo "Time";
        echo "</th>";
        echo "<th>";
            echo "Status";
        echo "</th>";

    echo "</tr>";
    foreach ($timearray as $timearrays) {
        if($tablecolor %2 == 0) {
            echo "<tr>";
        }
        else {
            echo "<tr style='background-color: rgb(0,100,255); background: rgb(0,100,255);'>";
        }

            echo "<th>";
            echo "<h3>$timearrays</h3>";
            echo "</th>";
            echo "<td>";
            $sql = "SELECT * FROM reservation WHERE date = '$date' AND timestart = '$timearrays'";
            $result = mysql_query($sql);
            if(mysql_num_rows($result) == 0){
                echo "<a href='#'><h3 style='color: rgb(255,0,0);'>Reserve</h3></a>";
            }
            else {
                while($row = mysql_fetch_array($result)) {
                    $reservedby = $row['reservedby'];
            }
                echo "<h3>Not Available, taken by: $reservedby.</h3>";
            }
            echo "</td>";
        echo "</tr>";
        $tablecolor++;
    }
    echo "</table>";
}
?>

我猜我必须在持续时间内使用一个计数器,并在循环的每次迭代中将其递减到零。虽然计数器不为零,但表格将显示'not available, reserved by: enerva' 字符串;一旦达到零,它将显示'reserve' 链接。但我找不到办法。

有什么方法,或者其他方法吗?我是否应该查看indexof 数组并找出 starttime 和 endtime 的 2 个索引之间的差异?

【问题讨论】:

  • 我可以建议您为datetimestartdurationendtime 列使用时间数据类型吗?确实,前两者可能应该合并到一个列中;后两者都保留是多余的。
  • 一个大问题:是否可以同时进行不同的预订?
  • 您当然需要在这里进行一些重构。作为@eggyal所说的补充,每小时查询一次数据库效率非常低。一次查询并保存到数组(实际上可以用作哈希表)所有需要的数据库行,然后在创建 期间检查数组是否包含适当的条目。
  • 你是什么意思?我讨厌在编程中操纵日期和时间。这就是为什么我在时间开始和结束时间使用变量。
  • "您好。我很难按自己的方式做事。我讨厌按照别人推荐的方式做事。请帮忙。" ?

标签: php mysql arrays html-table


【解决方案1】:

试试这个

else {
    while($row = mysql_fetch_array($result)) {
        echo "<h3>Not Available, taken by: $row[reservedby].</h3>";
        echo "</td>";
        echo "</tr>";
    }            
}

【讨论】:

  • @Kay Singian 试试这个
【解决方案2】:

根据您对我的评论的回答,这本身不是问题,但您可能必须在不同的列上显示并发预订(在现有代码中处理有点棘手)或在同一个 &lt;td&gt;&lt;/td&gt; ,以&lt;br /&gt; 分隔。这就是我想要的,有时有点懒:)

对于您的具体问题,只需在带有增量计数器的 while 循环中使用数据库中的 duration 列:

$i = 1;
while ($i <= $row['duration']) {
  echo 'Not available';
  $i = $i+1;
}

有点过于简单了,但应该可以解决问题。

在您的并发预订问题上,实际上最好更改您的数据库(如果您不想以这种方式工作,则不要“重构”):因为您的所有时间段都是 1 小时长,只需在24 小时格式并将您的 sql 查询更改为 "SELECT * FROM reservation WHERE date = '$date' ORDER BY timestart;"。使用多维数组,您就可以将密钥与开始时间进行比较,并且仍然像您一样显示时间段。

编辑: 找到了一种更快的帮助方式。您只需要在数据库中以 24 小时格式输入开始和结束时间,下面的代码就可以工作。如前所述,我没有时间测试它,但我看不出它会在哪里失败。

<?php 
if (isset($_GET['checkdate'])) {
    $date = urldecode($_GET['date']);
    echo "<br/><br/><h3>Reservations</h3>";
    echo $date;
    $timearray =  array(8,9,10,11,12,13,14,15,16,17,18,19,20,21,22);
    $tablecolor = 1;
    echo "<table style='width: 90%;'>";
    echo "<tr>";
        echo "<th>";
            echo "Time";
        echo "</th>";
        echo "<th>";
            echo "Status";
        echo "</th>";

    echo "</tr>";
    foreach ($timearray as $timearrays) {
        if($tablecolor %2 == 0) {
            echo "<tr>";
        }
        else {
            echo "<tr style='background-color: rgb(0,100,255); background: rgb(0,100,255);'>";
        }

            echo "<th>";
            if ($timearrays == 8) {echo "<h3>8-9am</h3>";}
            //Develop your timeslots here to display as required
            echo "</th>";
            echo "<td>";
            $sql = "SELECT * FROM reservation WHERE date = '$date' AND timestart >= $timearrays AND endtime <= $timearrays;";
            $result = mysql_query($sql);
            if (mysql_num_rows($result) == 0) {
                echo "<a href='#'><h3 style='color: rgb(255,0,0);'>Reserve</h3></a>";
            } else {
                echo "<h3>Not Available, taken by: $reservedby.</h3>";
                while($row = mysql_fetch_array($result)) {
                    echo "<br />" . $row['reservedby'];
                }
            }
            echo "</td>";
        echo "</tr>";
        $tablecolor++;
    }
    echo "</table>";
}
?>

【讨论】:

  • 你的答案似乎是正确的,但我不太擅长它,因为它非常棘手。你可以给我一个工作的PHP系统吗?我会给你我的电子邮件。谢谢
  • 我将用更多代码编辑我的答案,但它未经测试。
  • 我还没试过你的代码。也许我会尽快实现它,我只需要更多地分析流程。我只需要澄清一件事。当我回答你的问题时,我很模糊,我误解了它。如果已经有人占用,则无法使用相同的时间和日期进行预订。但是,如果它在不同的时间但具有相同的日期,这是可能的。
  • 我还发现我的代码在网上发布时会很糟糕。如您所见,我有一个 foreach 循环,每次循环执行时,都会执行一个 mysql 查询。我认为对于程序员每次循环执行时执行查询都是一种不好的做法。也许将保存在数组中的单个查询要好得多,您有任何关于如何处理此类事情的链接/教程/指南吗?谢谢。我是编程新手,从去年四月才开始,所以在涉及数组和时间函数时我总是有问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-23
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2016-06-04
  • 2016-03-25
相关资源
最近更新 更多