У меня есть несколько проблем с безопасностью и эффективностью, когда я проверяю ваш фрагмент, но, чтобы сосредоточиться на заданном вопросе, проблема заключается в том, что у вас есть мошенник WHERE
в конце $modal
, который наверняка вызовет выпуск.
Если это не устраняет ошибку, вам следует улучшить свой вопрос, включив в него точное сгенерированное сообщение об ошибке.
И я обнаружил, что нет ,
до третьего условия в вашем предложении GROUP BY.
И хотя мне бы очень хотелось, чтобы я смог протестировать свой фрагмент перед его публикацией здесь, я думаю, что сценарий обеспечит повышенную безопасность, стабильность, эффективность и удобочитаемость. (Конечно, нет никаких гарантий, что он не содержит ошибок)
<?php
if (empty($_POST['chk']
|| empty($_POST['start_date'])
|| empty($_POST['end_date'])
|| !is_array($_POST['chk'])
|| date('Y-m-d', strtotime($_POST['start_date'])) !== $_POST['start_date']
|| date('Y-m-d', strtotime($_POST['end_date'])) !== $_POST['end_date']) {
echo "Missing/Invalid Submission Data";
} else { // all expected submission data is present and sufficiently valid
$defect_select_ext = "";
foreach ($_POST['chk'] as &$data) {
$data = (int)$data; // for security
$defect_select_ext .= ", COUNT(CASE a.DEFECT_CLASS_ID WHEN $data THEN c.DEFECT_CLASS_NAME END) AS `$data`";
}
// I assume you are already connected...
// avoid iterated queries but maintain order
if (!$result = mysqli_query($mysqli, "SELECT DEFECT_CLASS_NAME FROM t_defect_class WHERE DEFECT_CLASS_ID IN (" . implode(',', $_POST['chk']) . ") ORDER BY FIELD(DEFECT_CLASS_ID," . implode(',', $_POST['chk']) . ")")) {
echo "Syntax Error While Retrieving DEFECT CLASS NAMES";
} else {
?>
<table>
<thead>
<tr>
<th class="text-center">Date Process</th>
<?php
while ($row = mysqli_fetch_assoc($result)) {
echo "<th class=\"text-center\">{$row['DEFECT_CLASS_NAME']}</th>";
}
?>
</tr>
</thead>
<tbody>
<?php
$query = "SELECT t_name_file.PROCESS_TIME" . $defect_select_ext . "
FROM t_transaction a
INNER JOIN t_name_file b ON a.NAMEFILE_ID = b.NAMEFILE_ID
INNER JOIN t_defect_class c ON a.DEFECT_CLASS_ID = c.DEFECT_CLASS_ID
GROUP BY a.DEFECT_CLASS_ID,
b.PROCESS_TIME,
b.PROCESS_TIME BETWEEN '$start_date' AND '$end_date'
ORDER BY t_name_file.PROCESS_TIME");
$colspan = sizeof($_POST['chk']) + 1;
if (!$modal = mysqli_query($mysqli, $query)) {
echo "<tr><td colspan=\"$colspan\" class=\"text-center\">Syntax Error @ Master Query</td></tr>";
} elseif (!mysqli_num_rows($modal)) {
echo "<tr><td colspan=\"$colspan\" class=\"text-center\">NOT FOUND</td></tr>";
} else {
while ($row = mysqli_fetch_array($modal)) {
echo "<tr>";
echo "<td class=\"text-center\">{$row['PROCESS_TIME']}</td>";
foreach ($_POST['chk'] as $data) {
echo "<td class=\"text-center\">{$row[$data]}</td>";
}
echo "</tr>";
}
}
echo "</table>";
}
}
p.s. Я рекомендую хранить имена таблиц базы данных и имена столбцов в нижнем регистре, чтобы было легче отличить имена таблиц / столбцов от MYSQL KEYWORDS / FUNCTIONS.