Mysqli_query在if-elseif语句的一部分中起作用,但在另一部分中起作用

时间:2017-07-25 19:28:58

标签: php mysqli

我正在为我正在上课的活动列表页面工作。这是我第一次使用PHP之一。

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

我看到的具体错误是,所有活动'被选中。 if-else DOES的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>";

2 个答案:

答案 0 :(得分:2)

您的if/elseif逻辑不是互斥的:

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

如果$category值为'ALL',则第一个 if块仍将执行。因此,elseif阻止永远不会执行。

您可以切换条件,甚至只需在第一个条件中添加额外的支票。类似的东西:

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

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

答案 1 :(得分:0)

这不是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.
}

如果您想要专门检查多个类别值,也可以尝试使用Switch Statements

Read the PHP elseif manual