php - 根据常见日期循环遍历 MySQL 数据

标签 php mysql arrays date loops

我有一个任务,我整天都在绞尽脑汁,但无济于事。我有一个 MySQL 表,其设置如下:

CREATE TABLE `Shows` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `band` varchar(255) NOT NULL,
  `month` int(2) NOT NULL,
  `day` int(2) NOT NULL,
  `year` int(4) NOT NULL,
  `venue` varchar(255) NOT NULL DEFAULT '',
  `city` varchar(255) NOT NULL DEFAULT '',
  `state` varchar(2) NOT NULL DEFAULT '',
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
)

基本上,它是一个保存有关音乐会信息的表。月份和日期以不带前导零的数字形式存储(例如,2 月 3 日在月份列中表示为 2,在日列中表示为 3)。

我正在创建一个事件日历页面,显示有关即将举行的音乐会的信息。我想对其进行设置,使其在等于或晚于当前日期的每一天循环播放,这样之前的音乐会就不会出现在本应即将举行的事件中。

这是我目前的代码:

function displayUpcomingShows()
{   
    include "/path/to/config/file/that/contains/credentials";

    $con = mysql_connect($credentials);

    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("database", $con);  

    $dateQuery = mysql_query("SELECT * FROM Shows GROUP BY month, day, year") or die(mysql_error());
    $todayMonth = date(n);
    $todayDate = date(j);
    $todayYear = date(Y);


    while ($info = mysql_fetch_array($dateQuery))
    {
        if ($todayMonth <= $info['month'] && $todayDate <= $info['day'] && $todayYear <= $info['year'])
        {
            $showDate = date("F j, Y", mktime(0, 0, 0, $info['month'], $info['day'], $info['year']));
            echo "<b><li>$showDate</li></b>";
            $concertDetails = $info['band'] . " @ " . $info['venue'] . " in " . $info['city'] . ", " . $info['state'];
            echo "<li>$concertDetails</li>";
        }
    }
    mysql_close($con);
}

如果有 2 个不同的日期,此代码将完美运行。也就是说,如果插入到表中的行如下所示:

INSERT INTO `Shows` (`id`, `band`, `month`, `day`, `year`, `venue`, `city`, `state`, `timestamp`)
VALUES
(1,'Some Band',12,8,2011,'The Crocodile Cafe','Seattle','WA','2011-12-07 22:50:06'),
(2,'Some Other Band',12,15,2011,'Nectar Lounge','Seattle','WA','2011-12-07 15:17:39');

网页显示:

December 8, 2011
Some Band @ The Crocodile Cafe in Seattle, WA

December 15, 2011
Some Other Band @ Nectar Lounge in Seattle, WA

完美,正是我想要的。但是,如果我更改第一行以使节目也在 15 日,如下所示:

(1,'Some Band',12,15,2011,'The Crocodile Cafe','Seattle','WA','2011-12-07 22:50:06')

网页只打印第一个条目,根本不显示第二个条目(Some Other Band),如下所示:

December 15, 2011
Some Band @ The Crocodile Cafe in Seattle, WA

有人可以指出我正确的方向或解释我做错了什么吗?我还尝试构建我的查询,以便它只选择不同的日期,循环使用相同的 while 循环和上面代码中的 if 语句,然后在 if 语句中包含一个新查询,该查询从表中选择所有信息其中月、日和年匹配,然后使用另一个 while 循环打印该数据,但这会导致页面在调用该函数时立即停止加载。该代码如下所示:

function displayUpcomingShows()
{   
    (...same code as above up until here...)

    $dateQuery = mysql_query("SELECT DISTINCT month, day, year FROM Shows") or die(mysql_error());
    $todayMonth = date(n);
    $todayDate = date(j);
    $todayYear = date(Y);

    while ($info = mysql_fetch_array($dateQuery))
    {
        if ($todayMonth <= $info['month'] && $todayDate <= $info['day'] && $todayYear <= $info['year'])
        {
            $showDate = date("F j, Y", mktime(0, 0, 0, $info['month'], $info['day'], $info['year']));
            echo "<b><li>$showDate</li></b>";

            $detailsQuery = mysql_query("SELECT * FROM Shows WHERE month = $info['month'] AND day = $info['day'] AND year = $info['year']") or die(mysql_error());
            while ($concertInfo = mysql_fetch_array($detailsQuery)
            {
                    $concertDetails = $concerinfo['band'] . " @ " . $concertInfo['venue'] . " in " . $concertInfo['city'] . ", " . $concertInfo['state'];
                    echo "<li>$concertDetails</li>";
            }
        }
    }
    mysql_close($con);
}

抱歉,如果这特别冗长,但我想确保我尽可能详细。我在更流利地学习 PHP/MySQL 方面取得了不错的进步,但我想这就是我仍在努力的原因。

欢迎任何帮助。

最佳答案

像这样轻松更新您的查询:

mysql_query("SELECT * FROM Shows WHERE timestamp >= '".date('Y-m-d H:i:s').'") or die(mysql_error());

摆脱:

$todayMonth = 日期(n); $今天日期=日期(j); $今天年 = 日期(Y);

然后在你的 while 循环中一起去掉 IF 语句

因此您的代码将如下所示:

function displayUpcomingShows()
{   
    include "/path/to/config/file/that/contains/credentials";

    $con = mysql_connect($credentials);

    if (!$con)
    {
        die('Could not connect: ' . mysql_error());
    }

    mysql_select_db("database", $con);  

    $dateQuery = mysql_query("SELECT * FROM Shows WHERE timestamp >= '".date('Y-m-d H:i:s')."'") or die(mysql_error());


    while ($info = mysql_fetch_array($dateQuery))
    {
        $showDate = date("F j, Y", mktime(0, 0, 0, $info['month'], $info['day'], $info['year']));
        echo "<b><li>$showDate</li></b>";
        $concertDetails = $info['band'] . " @ " . $info['venue'] . " in " . $info['city'] . ", " . $info['state'];
        echo "<li>$concertDetails</li>";
    }
    mysql_close($con);
}

关于php - 根据常见日期循环遍历 MySQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8424162/

相关文章:

php - 如何使用 PHP 中的 SpreadsheetReader 读取 Excel 电子表格的每一行?

Mysql 每日汇总

python - 从 numpy 图像中提取彩色线

javascript - 我确定代码是正确的但不起作用? JavaScript、Croppie JS、PHP、jQuery

php - 如何从 mysql 连接结果中删除匹配行并显示不匹配行?

php - 与我的 PHP 网站一起实现 node.js 和 socket.io

css - Liquid 和 Jekyll - 在数组中出现字符时添加 CSS 类

PHP ffmpeg 输出位置

mysql - 创建表时未知列数据类型

python - 列表和数组在存储值时有何不同?