使用PHP&创建考勤表MySQL的

时间:2016-12-18 12:42:57

标签: php mysql codeigniter

我正在尝试在一个月内创建一个考勤表。请检查

我有这个查询

select d.Nik,d.tanggal_absensi,d.kodekehadiran,c.NamaSiswa,d.tanggal_absensi,day(d.tanggal_absensi) tanggal from absensi d left join mastersiswa c on d.NIK = c.NIK left join siswa_kelas z on d.Nik = z.NIK left join kelas a on a.ID = z.Kelas where a.ID = '1' and month(d.tanggal_absensi) = '12' GROUP BY d.Nik,d.tanggal_absensi,d.kodekehadiran,c.NamaSiswa,a.Kelas,d.tanggal_absensi,day(d.tanggal_absensi)

我的查询得到了这个结果

    Nik   tanggal_absensi   kodekehadiran NamaSiswa   tanggal_absensi tanggal
    1111       2016­12­18         H           Nama A       2016­-12-­18    18
    1111       2016­12­19         I           Nama A       2016­-12-­19    19
    123456     2016­12­18         H         ADI SURIONO    2016-­12-­18    18
    123456    2016­12­19         H         ADI SURIONO    2016-­12-­19    19

这是我的HTML& PHP

 <table width="100%" class="table table-bordered table-striped">
                        <thead>
                            <tr align="center">
                            <th width="6%">No</th>
                            <th width="19%">Nama</th>
                            <?php for($x=1;$x<=31;$x++){ ?><th><?php echo $x;?></th> <? } ?>
                          </tr>
                        </thead>
                        <tbody>
                        <?
                        $no = 0;
                        foreach($absensi as $tampil){
                            $no++;
                        ?>
                            <tr>
                            <td><?=$no?></td>
                            <td><?=$tampil->NamaSiswa;?></td>

                            <?php for($x=1;$x<=31;$x++){ ?>
                                <td>
                                    <?php if($tampil->tanggal == $x){echo $tampil->kodekehadiran;} ?>
                                </td>
                            <?php } ?>    
                            </tr>
                            <?php } ?>
                        </tbody>
                    </table>    

我在我的网站上得到了这个结果。

enter image description here

我如何实现?

No  Nama     1 - 2 - 3 - 4 - 5 - 18  19 - 20 - 21 - 22
1   NAMA A   -   -   -   -   -   H   I     -   -    -
2   Nama B   -   -   -   -   -   I   H     -   -    -   

所以,我不知道如何list all day in a month所以,我使用for与php创建它。对不起,我的英语不好。

1 个答案:

答案 0 :(得分:1)

你可以做到,但你需要重构一部分代码/逻辑:

您拥有的数据:

<?php
// Data from DB
$data[] = ['Nik' => '111', 'tanggal_absensi' => '2016­12­18', 'kodekehadiran' => 'H', 'NamaSiswa' => 'Nama A']
$data[] = ['Nik' => '111', 'tanggal_absensi' => '2016­12­19', 'kodekehadiran' => 'I', 'NamaSiswa' => 'Nama A']
?>

您需要什么 - 多级数据阵列

<?php
$dataCalculated[111] = [
  '2016­12­18' => ['Nik' => '111', 'tanggal_absensi' => '2016­12­18', 'kodekehadiran' => 'H', 'NamaSiswa' => 'Nama A'],
  '2016­12­19' => ['Nik' => '111', 'tanggal_absensi' => '2016­12­19', 'kodekehadiran' => 'I', 'NamaSiswa' => 'Nama A']
];
?>
  

怎么做?循环每个$数据并创建另一个$ dataCalculated   这将包括您的代码的逻辑。这里:按用户排序(Nik),   并在日期之后。正如您所看到的,这是第一列和   表格的标题:)

<?php
$dataCalculated = [];
foreach( $data as $row ) {
  // We create the first array level, if this is the first time
  if( !isset($dataCalculated[ $row['Nik'] ]) ) {
    $dataCalculated[ $row['Nik'] ] = [];
  }
  // We fill the row data
  $dataCalculated[ $row['Nik'] ][ $row['tanggal_absensi'] ] = $row;
}
?>

重构您的HTML / PHP视图代码:

之后,您可以在HTML文件上迭代这个新数组。

<?php for($x=1 ; $x<=31 ; $x++): ?>
  <td>
  <?php if( isset($dataCalculated[ $tampil->Nik ][ date('Y-m-d', mktime(0, 0, 0, '12', $x, '2016')) ]) ): ?>
    <?php echo $dataCalculated[ $tampil->Nik ][ date('Y-m-d', mktime(0, 0, 0, '12', $x, '2016')) ]['kodekehadiran']; ?>
  <?php endif; ?>
  </td>
<?php endfor; ?>
  

小心,我手动输入了一些数据(mktime - &gt;月和年)

上次更改 - &gt;重复行

当然,有些线路现在没用。你只需要用户一行。

  • 如果用户已经显示(需要$previousNik变量和支票),您可以跳过该行。
  • 您还可以使用所有用户列表创建另一个数组

例如:

<?php
$dataCalculated = [];
$dataUsers = [];

foreach( $data as $row ) {
  // We create the first array level, if this is the first time
  if( !isset($dataCalculated[ $row['Nik'] ]) ) {
    $dataCalculated[ $row['Nik'] ] = [];
  }
  // We fill the row data
  $dataCalculated[ $row['Nik'] ][ $row['tanggal_absensi'] ] = $row;
  $dataUsers[ $row['Nik'] ] = ['Nik' => $row['Nik'], 'NamaSiswa' => $row['NamaSiswa']];
}
?>

并在代码中使用它:)(变量$dataUsers

玩得开心!