Я думаю, что вы после чего-то вроде этого.Вы можете сделать это в SQL, но так как вы запросили решение php, вот оно.
Я удалил запрос и переформатировал некоторые html, чтобы получить некоторое вертикальное пространство.Я также использовал шаблон кнопки, который вы можете настроить по своему усмотрению.Я использовал массив для месяцев и перебирал его, а затем снова зацикливался в столбцах таблицы html.Массив не обязателен, но я предпочитаю делать свои вычисления вне моего представления / шаблона.Кроме того, это облегчает понимание / чтение.
<?php
$sqlFees = <<<SQL
...
SQL;
$resultFees = mysqli_query($con, $sqlFees);
$buttonTemplate = '<button data-studentid="%s">Pay</button>';
?>
<table border="1" cellpadding="8" style="border-collapse: collapse;">
<thead>
<th>Name</th><th>Subject</th>
<th>Jan</th><th>Feb</th><th>Mar</th><th>Apr</th><th>May</th>
<th>Jun</th><th>Jul</th><th>Aug</th><th>Sep</th><th>Oct</th><th>Nov</th><th>Dec</th>
<th>Paid so far</th>
<th>Start date</th>
</thead>
<tbody>
<?php while ($row = mysqli_fetch_assoc($resultFees)) :
$button = sprintf($buttonTemplate, $row['student_id']);
$joinDate = \DateTime::createFromFormat('Y-m-d H:i:s', $row['studentstartdate']);
$joinMonth = $joinDate->format('m');
$courseFee = $row['coursefee'];
$payments = [ $row['MJan'], $row['MFeb'], $row['MMar'], $row['MApr'], $row['MMay'],
$row['MJun'], $row['MJul'], $row['MAug'], $row['MSep'], $row['MOct'], $row['MNov'], $row['MDec']];
$buttons = [];
foreach ($payments as $month => $paid) {
if($joinMonth > ($month + 1)) {
$buttons[$month] = '-';
continue;
}
if(0 === (int)$paid) {
$buttons[$month] = $button;
continue;
}
$buttons[$month] = $paid;
}
?>
<tr>
<td><?= $row['firstname'] . ' ' . $row['lastname']; ?></td>
<td><?= $row['subject'] . ' ' . $row['standard'] . '<br>' . $row['paid']; ?></td>
<?php foreach($buttons as $mon => $but): ?>
<td id="<?= $mon; ?>"><?= $but; ?></td>
<?php endforeach; ?>
<td><?= $row['paid']; ?></td>
<td><?= $row['studentstartdate']; ?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
Важный бит:
foreach ($payments as $month => $paid) {
if($joinMonth > ($month + 1)) {
$buttons[$month] = '-';
continue;
}
if(0 === (int)$paid) {
$buttons[$month] = $button;
continue;
}
$buttons[$month] = $paid;
}
В первом случае, если проверяется, действительно ли студент присоединился, (и так какя использовал индекс массива, мне нужно добавить один к месяцу).
Во втором случае, если он проверяет, не было ли сделано никакого платежа, и добавляет кнопку.
И по умолчанию он показывает оплаченное значение.
Следует отметить, что вы можете сделать это в структуре if-elseif-else, но я бы хотел показать другой способ решения этой проблемы, и этот способ также немного быстрее (микрооптимизации)