Показать все данные с указанной даты через условие php - PullRequest
0 голосов
/ 29 ноября 2018

Я генерирую данные из базы данных в HTML-таблицу, используя php.Я хочу выводить с условием php, используя дату присоединения студента.

Я хочу выполнить условие, при котором вы берете j.date, и все, что до этого должно иметь -, а после должно иметь кнопку «Оплатить», которая содержит studentid

+---------+------------+-----+-----+------+------+------+-----+
| Student |   J.date   | Jan | Feb | Mar  | Apr  | May  | ... |
+---------+------------+-----+-----+------+------+------+-----+
| John    | 25-03-2018 |   0 |   0 | 2000 |    0 | 1750 | ... |
| Michael | 10-04-2018 |   0 |   0 |    0 | 5000 |    0 | ... |
+---------+------------+-----+-----+------+------+------+-----+

Примерно так

+---------+------------+-----+-----+------+------+------+-----+
| Student |   J.date   | Jan | Feb | Mar  | Apr  | May  | ... |
+---------+------------+-----+-----+------+------+------+-----+
| John    | 25-03-2018 |   - |   - | 2000 | Pay  | 1750 | ... |
| Michael | 10-04-2018 |   - |   - |    - | 5000 | Pay  | ... |
+---------+------------+-----+-----+------+------+------+-----+

Обновлено

Запрос

<?php
$sqlFees = "SELECT
            s.student_id, s.firstname, s.lastname,
            c.subject, c.standard, (t.month * c.fee) AS coursefee,
            SUM(f.paid) AS paid, MIN(f.paiddate) AS studentstartdate,
        SUM(CASE WHEN MONTH(f.paiddate) = 1 THEN f.paid ELSE 0 END) AS MJan,
        SUM(CASE WHEN MONTH(f.paiddate) = 2 THEN f.paid ELSE 0 END) AS MFeb,
        SUM(CASE WHEN MONTH(f.paiddate) = 3 THEN f.paid ELSE 0 END) AS MMar,
        SUM(CASE WHEN MONTH(f.paiddate) = 4 THEN f.paid ELSE 0 END) AS MApr,
        SUM(CASE WHEN MONTH(f.paiddate) = 5 THEN f.paid ELSE 0 END) AS MMay,
        SUM(CASE WHEN MONTH(f.paiddate) = 6 THEN f.paid ELSE 0 END) AS MJun,
        SUM(CASE WHEN MONTH(f.paiddate) = 7 THEN f.paid ELSE 0 END) AS MJul,
        SUM(CASE WHEN MONTH(f.paiddate) = 8 THEN f.paid ELSE 0 END) AS MAug,
        SUM(CASE WHEN MONTH(f.paiddate) = 9 THEN f.paid ELSE 0 END) AS MSep,
        SUM(CASE WHEN MONTH(f.paiddate) = 10 THEN f.paid ELSE 0 END) AS MOct,
        SUM(CASE WHEN MONTH(f.paiddate) = 11 THEN f.paid ELSE 0 END) AS MNov,
        SUM(CASE WHEN MONTH(f.paiddate) = 12 THEN f.paid ELSE 0 END) AS MDec
        FROM
            fees f
                JOIN enrollments e ON f.enrollmentid = e.enrollment_id
                LEFT JOIN courses c ON e.courseid = c.course_id
                LEFT JOIN students s ON f.studentid = s.student_id
                LEFT JOIN terms t ON e.termid = t.term_id
        WHERE
            f.paiddate BETWEEN '2018-01-01 00:00:00' AND '2018-12-31 23:59:59'
        GROUP BY
            f.enrollmentid
        ORDER BY NOT EXISTS
                (SELECT studentid
                    FROM fees f
                WHERE f.enrollmentid = e.enrollment_id
                AND MONTH(f.paiddate) = MONTH(CURDATE())
                ) DESC
                ";
$resultFees = mysqli_query($con, $sqlFees);
?>

<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>
<?php while($row = mysqli_fetch_assoc($resultFees)) :
    $studentId = $row['student_id'];
    $studentFName = $row['firstname'];
    $studentLName = $row['lastname'];
    $studentFullName = $studentFName.' '.$studentLName;
    $subject = $row['subject'];
    $standard = $row['standard'];
    $paid = $row['paid'];
    $courseFee = $row['coursefee'];
    $studentStartDate = $row['studentstartdate']; // this is the J.date
    $monthJan = $row['MJan'];
    $monthFeb = $row['MFeb'];
    $monthMar = $row['MMar'];
    $monthApr = $row['MApr'];
    $monthMay = $row['MMay'];
    $monthJun = $row['MJun'];
    $monthJul = $row['MJul'];
    $monthAug = $row['MAug'];
    $monthSep = $row['MSep'];
    $monthOct = $row['MOct'];
    $monthNov = $row['MNov'];
    $monthMDec = $row['MDec'];
    ?>
    <tr>
        <td><?php echo $studentId.' '.$studentFullName; ?></td>
        <td><?php echo $subject.' '.$standard.'<br>'.$courseFee; ?></td>
        <td id="0"><?php echo $monthJan; ?></td>
        <td id="1"><?php echo $monthFeb; ?></td>
        <td id="2"><?php echo $monthMar; ?></td>
        <td id="3"><?php echo $monthApr; ?></td>
        <td id="4"><?php echo $monthMay; ?></td>
        <td id="5"><?php echo $monthJun; ?></td>
        <td id="6"><?php echo $monthJul; ?></td>
        <td id="7"><?php echo $monthAug; ?></td>
        <td id="8"><?php echo $monthSep; ?></td>
        <td id="9"><?php echo $monthOct; ?></td>
        <td id="10"><?php echo $monthNov; ?></td>
        <td id="11"><?php echo $monthMDec; ?></td>
        <td><?php echo $paid.'/- '; ?></td>
        <td><?php echo $studentStartDate; ?></td>
    </tr>
<?php endwhile; ?>
</table>

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018
function formatPay($value, $date, $date2) {
  if($value == 0) {
    if(strtotime($date) < strtotime($date2) {
      $output = '-';
    } else {
      $output = 'Pay';
    }
  } else {
    $output = $value;
  }
  return $output;
}
$studentStartDate = $row['studentstartdate']; // this is the J.date
$monthJan = formatPay($row['MJan'],$studentStartDate,'01-01-2018');
$monthFeb = formatPay($row['MFeb'],$studentStartDate,'01-02-2018');
$monthMar = formatPay($row['MMar'],$studentStartDate,'01-03-2018');
$monthApr = formatPay($row['MApr'],$studentStartDate,'01-04-2018');
$monthMay = formatPay($row['MMay'],$studentStartDate,'01-05-2018');
$monthJun = formatPay($row['MJun'],$studentStartDate,'01-06-2018');
$monthJul = formatPay($row['MJul'],$studentStartDate,'01-07-2018');
$monthAug = formatPay($row['MAug'],$studentStartDate,'01-08-2018');
$monthSep = formatPay($row['MSep'],$studentStartDate,'01-09-2018');
$monthOct = formatPay($row['MOct'],$studentStartDate,'01-10-2018');
$monthNov = formatPay($row['MNov'],$studentStartDate,'01-11-2018');
$monthMDec = formatPay($row['MDec'],$studentStartDate,'01-12-2018');

Если я не сделал опечатку где-нибудь, это должно работать.Поскольку ваш код немного запутан, проще всего создать функцию, которая обрабатывает это преобразование.

0 голосов
/ 30 ноября 2018

Я думаю, что вы после чего-то вроде этого.Вы можете сделать это в 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, но я бы хотел показать другой способ решения этой проблемы, и этот способ также немного быстрее (микрооптимизации)

0 голосов
/ 29 ноября 2018

Ваш вопрос неясен, но я попробую.

Вы можете сделать что-то вроде этого:

$date = date_create_from_format('d-m-Y', $j.date);

, тогда в вашей таблице:

<?= $date->format('m') < $yourMonth ? '-' : $date->format('m') == $yourMonth ? $yourNumber : $date->format('m') +1 == $yourMonth ? 'Pay' : $yourNumber ?>

Надеюсь, это будет полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...