我的日历按照书面方式工作得很好,但是如果我在同一天添加另一个事件,它只会显示数据库中记录的第一个事件。我需要能够在同一天显示多个活动。
我尝试在代码中使用 for/next 循环和 while 循环从数据库中提取信息。任何一种都无法按照代码的编写方式工作。此链接将向您显示所写的工作日历:Grims World Blog 这是我的代码:
<?php
$cMonth = isset($_REQUEST["month"]) ? $cMonth = intval($_REQUEST["month"]) : $cMonth = date("m");
$cYear = isset($_REQUEST["year"]) ? $cYear = intval($_REQUEST["year"]) : $cYear = date("Y");
$prev_year = $cYear;
$prev_year2 = $cYear-1;
$next_year = $cYear;
$next_year2 = $cYear+1;
$prev_month = $cMonth-1;
$next_month = $cMonth+1;
if ($cMonth == 12 ) {
$next_month = 1;
$next_year = $next_year2;
} elseif ($cMonth == 1 ) {
$prev_month = 12;
$prev_year = $prev_year2;
}
$short_days = array('1'=>'Sun', '2'=>'Mon', '3'=>'Tue', '4'=>'Wed', '5'=>'Thu', '6'=>'Fri', '7'=>'Sat');
$day=date('d');
$endDate=date('t',mktime(0,0,0,$cMonth,$day,$cYear));
echo "<table width='100%' align='center' border='0' cellpadding='0' cellspacing='5'><tr bgcolor='white'>\n";
echo "<td align='left'><a class='caldate3' href='".$_SERVER['PHP_SELF']."?month=$prev_month&year=$prev_year' title='Previous Month'> <big>««</big> Prev</a></td>\n";
echo "<td align='center'><a class='mcaldate2' href='#' title='Current Month'> ".date("F Y",strtotime($cYear."-".$cMonth."-01"))." </a></td>\n";
echo "<td align='right'><a class='caldate3' href='".$_SERVER['PHP_SELF']."?month=$next_month&year=$next_year' title='Next Month'>Next <big>»»</big> </a></td></tr>\n";
echo "<tr><td colspan='3' height='5'></td>\n";
echo "</tr></table>\n";
echo "<table width='100%' align='center' border='0' cellpadding='0' cellspacing='0'><tr><td class='norm'>\n";
echo "<table width='100%' align='center' border='0' cellpadding='2' cellspacing='1'><tr bgcolor='#000' height='20'>\n";
foreach ($short_days as $key=>$val) {
echo "<td width='14%' align='center'><span style='font-size:14px; color:#ffff00;'><b>".$val."</b></span></td>\n";
}
echo "</tr><tr>\n";
$s=date('w', mktime (0,0,0,$cMonth,1,$cYear));
for ($ds=1; $ds<=$s; $ds++) {
echo "<td class='norm' height='20' align='center' valign='middle'></td>\n";
}
for ($d=1; $d<=$endDate; $d++) {
if (date('w',mktime (0,0,0,$cMonth,$d,$cYear)) == 0) {
echo "</tr><tr>\n";
}
$events = mysqli_query($connect, "SELECT * FROM `posts` WHERE SUBSTR(date,7,4)='$cYear' AND month='$cMonth' AND day='$d'");
$rows = mysqli_fetch_assoc($events);
$post_id = $rows['id'];
$post_title = $rows['title'];
$evday = $rows['day'];
if ($evday) {
echo "<td height='20' class='event' align='center' valign='middle'>\n";
} elseif ($d == $day && $cMonth == date('m')) {
echo "<td height='20' class='today' align='center' valign='middle'>\n";
} else {
echo "<td height='20' class='norm' align='center' valign='middle'>\n";
}
if ($d == $day && $cMonth == date('m') && $d <> $evday) {
$d = str_pad($d,2,'0',STR_PAD_LEFT);
echo "<span class='cal2'><a class='cal2' href='#' title='Today'>$d</a></span>\n";
} elseif ($d == $day && $cMonth == date('m') && $d == $evday) {
$d = str_pad($d,2,'0',STR_PAD_LEFT);
echo "<a class='cal2' href='post.php?id=$post_id' title='Today - $post_title'>$d</a>\n";
} elseif ($evday) {
$d = str_pad($d,2,'0',STR_PAD_LEFT);
echo "<a class='ecal' href='post.php?id=$post_id' title='$post_title'>$d</a>\n";
} else {
$d = str_pad($d,2,'0',STR_PAD_LEFT);
echo "<span class='noevt'>$d</span>\n";
}
echo "</td>\n";
if (date('w',mktime (0,0,0,$cMonth,$d,$cYear)) == 6) {
echo "</tr>";
}
}
echo "</table></td></tr><tr><td height='8'></td>\n";
echo "</tr></table>\n";
echo "</td></tr></table>\n";
?>
如果 SQL 查询正确并且
$events
返回有效结果,请使用:
while($row = mysqli_fetch_assoc($events))
{
# output events
echo '<pre>';
print_r($row);
echo '</pre>';
}
根据 php 文档,
mysqli_fetch_assoc
函数从结果集中获取一行数据并将其作为关联数组返回。对该函数的每次后续调用都将返回结果集中的下一行(如果没有更多行,则返回 null),因此我们需要使用 while()
循环来循环访问结果集。 (虽然有结果...这样做)。
要进一步改进代码,您可以首先使用
mysqli_num_rows
内置函数检查是否有任何结果。如果给定的日历日期没有任何事件,我们不需要循环结果,因此我们可以跳过它。
您的代码可能类似于:
$sql = "SELECT *
FROM posts
WHERE SUBSTR(date,7,4)='$cYear' AND month='$cMonth' AND day='$d'
";
$results = mysqli_query($connect, $sql);
if(mysqli_num_rows($results)) // only if there are results
{
while($row = mysqli_fetch_assoc($results))
{
$post_id = $row['id'];
$post_title = $row['title'];
// ...
# output
echo '<p>'.$post_title.'</p>';
}
}
注意 - 我已将您的
$events
变量更改为 $results
,只是为了一般最佳实践目的和一致性,但从技术上讲,这是没有必要的。
另外 - 考虑在 SQL(
文档)中使用
ORDER BY
子句,以便在结果集中按时间顺序对事件进行排序。