You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP下拉选择年份生成报表功能无输出问题排查求助

按年份筛选报表无返回数据问题修复

问题背景

需实现通过下拉菜单选择年份生成对应统计报表功能,未加筛选逻辑时可正常输出所有年份的统计报表,新增年份筛选逻辑后,选择年份提交无对应数据返回。

相关代码

表单部分代码

<?php
include('_header.php');

$conn = mysqli_connect("localhost","root","","ea");
$sql = "SELECT distinct YEAR(mohon_tarikh)
     AS  tahun
FROM tpermohonan
order by tahun";
$result = mysqli_query($conn,$sql);

?>
        
<tr bgcolor="#FFFFFF" align="center" valign="top">
    <td bordercolor="#0c52cb"><p>&nbsp;</p>
                
        <table bgcolor="#2F72B9" cellpadding="0" cellspacing="1" align="center" width="72%" >
            <tr bgcolor="#FFFFFF" >
            
                <form class ="" action ="" name="menufrmLaporanStatTransak"  method="post" target= "_blank">
                    <td width="12%">Pilih Tahun<font class="font18red">*</font>: </td>
                    <td width="9%"><select class = "" name = "y">
                        <?php while($rows = mysqli_fetch_array($result)){
                        echo '<option value = "'.$rows["tahun"].'">'.$rows["tahun"].'</option>';
                        }?></select></td>
                </form>
                
                    <td width="8%"><button type= "submit" name= "button" > Cari</button></td>
                    <td width="8%"><p align="right"><a href = "#" onclick = "window.print();"><img src="img/cetak.png" alt="cetak" width="40" height="40"><br>
                    </a><a href = "#" onclick = "window.print();">Cetak</a></td>
                    <td width="34%" align="right"><?php date_default_timezone_set("Asia/Kuala_Lumpur"); echo "Tarikh : " .date('d-m-Y H:i:s'); //Returns IST ?></td>
            </tr>
        </table>

报表查询渲染代码

<tr>
    <td width="33" rowspan="3"><div align="center"><strong>BIL</strong></div></td>
    <td width="550" rowspan="3"><div align="center"><strong>JAWATAN</strong></div></td>
  </tr>
  <tr>
    <td colspan="12"><div align="center"><strong>BILANGAN TRANSAKSI </strong></div></td>
    <td width="136" rowspan="2"><div align="center"><strong>JUMLAH</strong></div></td>
  </tr>
  <tr>
    <td width="82"><div align="center"><strong>JANUARI</strong></div></td>
    <td width="88"><div align="center"><strong>FEBRUARI</strong></div></td>
    <td width="50"><div align="center"><strong>MAC</strong></div></td>
    <td width="60"><div align="center"><strong>APRIL</strong></div></td>
    <td width="51"><div align="center"><strong>MEI</strong></div></td>
    <td width="41"><div align="center"><strong>JUN</strong></div></td>
    <td width="57"><div align="center"><strong>JULAI</strong></div></td>
    <td width="60"><div align="center"><strong>OGOS</strong></div></td>
    <td width="119"><div align="center"><strong>SEPTEMBER</strong></div></td>
    <td width="100"><div align="center"><strong>OCTOBER</strong></div></td>
    <td width="117"><div align="center"><strong>NOVEMBER</strong></div></td>
    <td width="106"><div align="center"><strong>DISEMBER</strong></div></td>    
 </tr>
    
    
<?php 
    if(isset($_POST['y']))
    {   
        $conn = mysqli_connect("localhost","root","","ea");
        $thn = $_POST['y'];
        $sql = ("SELECT 
          ROW_NUMBER() OVER(ORDER BY t.jawatan_nama) Bil,
          t.jawatan_nama Jawatan,
          COUNT(IF(month_id = 1, 1, NULL)) Jan,
          COUNT(IF(month_id = 2, 1, NULL)) Feb,
          COUNT(IF(month_id = 3, 1, NULL)) March,
          COUNT(IF(month_id = 4, 1, NULL)) April,
          COUNT(IF(month_id = 5, 1, NULL)) May,
          COUNT(IF(month_id = 6, 1, NULL)) June,
          COUNT(IF(month_id = 7, 1, NULL)) July,

          COUNT(IF(month_id = 8, 1, NULL)) August,
          COUNT(IF(month_id = 9, 1, NULL)) Sep,
          COUNT(IF(month_id = 10, 1, NULL)) Oct,
          COUNT(IF(month_id = 11, 1, NULL)) Nov,
          COUNT(IF(month_id = 12, 1, NULL)) Dis,
          COUNT(*) Total
    FROM
    (
        SELECT 
        t1.jawatan_nama,
        MONTH(t3.mohon_tarikh) month_id
        FROM kod_jawatan t1 
            INNER JOIN tmohonjaw t2 ON t1.jawatan_id = t2.jawatan_id
            INNER JOIN tpermohonan t3 ON t3.mohon_id = t2.mohon_id
        WHERE t3.mohon_tarikh = '{$thn}'
    ) t
    GROUP BY t.jawatan_nama");
    $result=mysqli_query($conn,$sql);
    $count=mysqli_num_rows($result);
    echo "$count rekod dijumpai<br/>";
    while($row=mysqli_fetch_assoc($result)){
    
        ?>

            <tr>
              <td width="33"><div align="center"><?php echo $row['Bil']?></td>
                <td width="550"><?php echo $row['Jawatan']?></td>
                <td width="82"><div align="center"><?php echo $row['Jan']?></div></td>
                <td width="88"><div align="center"><?php echo $row['Feb']?></div></td>
                <td width="50"><div align="center"><?php echo $row['March']?></div></td>
                <td width="60"><div align="center"><?php echo $row['April']?></div></td>
                <td width="51"><div align="center"><?php echo $row['May']?></div></td>
                <td width="41"><div align="center"><?php echo $row['June']?></div></td>
                <td width="57"><div align="center"><?php echo $row['July']?></div></td>
                <td width="60"><div align="center"><?php echo $row['August']?></div></td>
                <td width="119"><div align="center"><?php echo $row['Sep']?></div></td>
                <td width="100"><div align="center"><?php echo $row['Oct']?></div></td>
                <td width="117"><div align="center"><?php echo $row['Nov']?></div></td>
                <td width="106"><div align="center"><?php echo $row['Dis']?></div></td>
                <td width="136"><div align="center"><?php echo $row['Total']?></div></td>
            </tr>
            
      
        <?php }
}
    ?>

问题原因

  • 表单结构错误:提交按钮放在</form>标签外部,点击按钮无法触发表单提交,$_POST['y']无传值,筛选逻辑不会执行
  • 筛选条件逻辑错误:WHERE t3.mohon_tarikh = '{$thn}'是将完整日期格式的mohon_tarikh与年份数值直接对比,无法匹配到任何符合条件的记录
  • 表单设置了target="_blank",提交后结果会在新标签页打开,原页面不会刷新展示数据

修复方案

1. 调整表单结构

将</form>移动到提交按钮所在的td之后,确保提交按钮在表单范围内:

<form class ="" action ="" name="menufrmLaporanStatTransak"  method="post">
    <td width="12%">Pilih Tahun<font class="font18red">*</font>: </td>
    <td width="9%"><select class = "" name = "y">
        <?php while($rows = mysqli_fetch_array($result)){
        echo '<option value = "'.$rows["tahun"].'">'.$rows["tahun"].'</option>';
        }?></select></td>
    <td width="8%"><button type= "submit" name= "button" > Cari</button></td>
</form>

2. 修正年份筛选条件

将子查询中的WHERE条件修改为提取日期的年份进行匹配:

WHERE YEAR(t3.mohon_tarikh) = '{$thn}'

可选优化

如果不需要在新标签页打开报表,删除form标签的target="_blank"属性即可。

内容的提问来源于stack exchange,提问作者NAS BS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:54:08