我有一个任务,我整天都在绞尽脑汁,但无济于事。我有一个 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/