Mysqli_query适用于 if-elseif 语句的一部分,但不适用于另一部分



>我正在为我正在参加的课程制作一个事件列表页面。这是我第一次使用PHP工作。

我想根据从下拉列表中选择的类别显示筛选的事件列表。如果从 DDL 中选择"所有事件",我还想显示完整的事件列表。我有一个 if-elseif 语句,它将根据查询字符串中的类别值更改 sql 查询。

我看到的具体错误是选择"所有事件"时缺少事件列表。if-else 的 echo 语句确实有效,它显示$category、$month和$year的正确值。缺少的是包含事件列表的表。

注意:我已经测试了查询,并确认它可以提取所有事件的列表。我也尝试过使用空$category值进行此操作,没有更改。

这是确实有效的 IF 语句:

if(!empty($category)){
$catresult = mysqli_query($con,"
SELECT cal_events.event_id, 
cal_events.title, 
DATE_FORMAT(cal_dates.date, '%M %D %Y') AS formatted_date, 
MONTHNAME('$month') AS NameOfMonth
FROM cal_events 
LEFT JOIN cal_dates 
ON cal_events.event_id = cal_dates.event 
WHERE cal_events.categories = '$category' 
AND YEAR(date) = '$year' 
AND MONTH(date) = '$month' 
GROUP BY cal_dates.date, cal_events.title, cal_events.event_id");
echo "<h2>$category</h2>
<h3>Events for $monthName, $year</h3>
<br /><br />
<table align='center'>
<tr>
<th>Date</th>
<th>Event</th>
<th></th>
</tr>";
}

这是不起作用的 ELSEIF 语句:

elseif($category=='All'){

$catresult = mysqli_query($con,"
SELECT cal_events.event_id, 
cal_events.title, 
DATE_FORMAT(cal_dates.date, '%M %D %Y') AS formatted_date, 
MONTHNAME('$month') AS NameOfMonth
FROM cal_events 
LEFT JOIN cal_dates 
ON cal_events.event_id = cal_dates.event 
WHERE YEAR(date) = '$year' 
AND MONTH(date) = '$month' 
GROUP BY cal_dates.date, cal_events.title, cal_events.event_id");
echo "<h2>$category</h2>
<h3>Events for $monthName, $year</h3>
<br /><br />
<table align='center'>
<tr>
<th>Date</th>
<th>Event</th>
<th></th>
</tr>";
}

这是显示事件列表的 while 循环:

//Displays the list of events
while($row = mysqli_fetch_array($catresult))
{
echo "<tr>";
echo "<td>" . $row['formatted_date'] . "</td>";
echo "<td><a href='detail.php?id=".$row['event_id']."' target='_blank'>" . 
$row['title'] . "</a></td>";
echo "</tr>";
}
echo "</table>";

您的if/elseif逻辑并不相互排斥:

if(!empty($category)){
//...
}
elseif($category=='All'){
//...
}

如果$category'ALL'第一个if块仍将执行。 因此,在任何情况下,该elseif块都不会执行

您可以切换您的条件,甚至只是在第一个条件中添加额外的检查。 像这样:

if(!empty($category) && $category!='All'){

但关键是,你的ifelseif块必须是整个可能性集的完全不同的子集。 如果第一个块执行,则根据定义,第二个块不会执行。

这不是elseif的工作方式。如果第一个条件为真(它总是与category='all'一起(,那么第二个条件将永远不会被测试。

if(something){
// This runs if something is true.
}
elseif(something else){
// This runs only if the first if is false and the elseif is true 
}
else 
// This only runs if none of the preceding conditions equate to true. 
}

因此,请将语法调整为;

if(!empty($category) && $category !== "All"){
...
}
elseif($category == "All"){
...
}
else {
// no category set.
}

还有各种其他流可用于定义相同的行为,例如:

if(!empty($category) )
if($category == "All"){
... //category is All
}
else {
... //category is not All
}
}
else {
// category is empty.
}

如果要专门检查多个类别值,也可以尝试使用"切换语句"。


阅读 PHP elseif 手册

最新更新