내 PHP 캘린더 코드에서 하루에 여러 이벤트를 표시하는 방법
P粉950128819
P粉950128819 2023-09-06 10:03:16
0
1
633

내 달력은 작성된 대로 잘 작동하지만 같은 날에 다른 일정을 추가하면 데이터베이스에 기록된 첫 번째 일정만 표시됩니다. 같은 날 여러 이벤트를 표시할 수 있어야 합니다.

데이터베이스에서 정보를 추출하기 위해 코드에서 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&amp;year=$prev_year' title='Previous Month'>&nbsp;<big>&laquo;&laquo;</big>&nbsp;Prev</a></td>\n";
echo "<td align='center'><a class='mcaldate2' href='#' title='Current Month'>&nbsp;".date("F Y",strtotime($cYear."-".$cMonth."-01"))."&nbsp;</a></td>\n";
echo "<td align='right'><a class='caldate3' href='".$_SERVER['PHP_SELF']."?month=$next_month&amp;year=$next_year' title='Next Month'>Next&nbsp;<big>&raquo;&raquo;</big>&nbsp;</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";
?>

P粉950128819
P粉950128819

모든 응답(1)
P粉561438407

SQL 쿼리가 정확하고 $events 유효한 결과를 반환하는 경우 다음을 사용하세요.

으아악

php 문서에 따르면 mysqli_fetch_assoc 함수는 결과 집합에서 데이터 행을 가져와서 연관 배열로 반환합니다. 이 함수에 대한 각 후속 호출은 결과 집합의 다음 행(또는 더 이상 행이 없는 경우 null)을 반환하므로 while()while() 루프를 사용하여 결과 집합을 반복해야 합니다. (비록 결과가 있지만...이렇게 하면).

코드를 더욱 개선하려면 먼저 mysqli_num_rowsmysqli_num_rows 내장 함수를 사용하여 결과가 있는지 확인할 수 있습니다. 특정 달력 날짜에 이벤트가 없으면 결과를 반복할 필요가 없으므로 건너뛸 수 있습니다.

코드는 다음과 같습니다:

으아악

참고 - 일반적인 모범 사례 목적과 일관성을 위해 $events 变量更改为 $results 변수를 $results

로 변경했지만 기술적으로는 필요하지 않습니다.

AlsoORDER BY - SQL(Documentation)에서 ORDER BY
절을 사용하여 결과 집합에서 이벤트를 시간순으로 정렬하는 것을 고려해 보세요. 또한 - SQL 쿼리에 더 안전한 Prepared 문

을 사용하는 것이 좋습니다. 🎜
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿