Maison > Questions et réponses > le corps du texte
Mon calendrier fonctionne correctement tel qu'écrit, mais si j'ajoute un autre événement le même jour, il n'affiche que le premier événement enregistré dans la base de données. Je dois pouvoir afficher plusieurs événements le même jour.
J'ai essayé d'utiliser les boucles for/next et while dans mon code pour extraire des informations de la base de données. Rien de tout cela ne fonctionne de la façon dont le code est écrit. Ce lien vous montrera le calendrier de travail tel qu'écrit : Grims World Blog Voici mon code :
<?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"; ?>
P粉5614384072023-09-07 00:12:02
Si la requête SQL est correcte et $events
renvoie des résultats valides, utilisez :
while($row = mysqli_fetch_assoc($events)) { # output events echo '<pre>'; print_r($row); echo '</pre>'; }
Selon la documentation php, la fonction < code>mysqli_fetch_assoc récupère une ligne de données de l'ensemble de résultats et la renvoie sous forme de tableau associatif. Chaque appel ultérieur à cette fonction renverra la ligne suivante dans l'ensemble de résultats (ou null s'il n'y a plus de lignes), nous devons donc utiliser une boucle while()
while()
pour parcourir l'ensemble de résultats. (Bien qu'il y ait des conséquences... faire cela).
Pour améliorer davantage le code, vous pouvez d'abord vérifier s'il y a des résultats en utilisant la fonction intégrée mysqli_num_rows
mysqli_num_rows
. Nous n'avons pas besoin de parcourir les résultats s'il n'y a aucun événement pour une date calendaire donnée, nous pouvons donc l'ignorer.
Votre code pourrait ressembler à :
$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>'; } }
REMARQUE - J'ai modifié votre variable $events
变量更改为 $results
en $results
AussiORDER BY
- Pensez à utiliser la clause ORDER BY dans SQL (Documentation
) pour trier les événements par ordre chronologique dans l'ensemble de résultats.
Aussi - Pensez à utiliser des < /a>Prepared Statements