Фильтрация данных с использованием диапазона дат с флажком и таблицей соединений - PullRequest
0 голосов
/ 29 октября 2018

Я хочу отфильтровать данные с диапазоном дат и флажком. Это работает для флажка, но я получил эту ошибку, где я добавил несколько запросов для диапазона дат.

Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсным, логическое значение указано в C: \ xampp \ htdocs \ BMJSGCR \ 1 \ dt_rtrend1.php в строке 51

Предупреждение: mysqli_fetch_array () ожидает, что параметр 1 будет mysqli_result, логическое значение, указанное в C: \ xampp \ htdocs \ BMJSGCR \ 1 \ dt_rtrend1.php в строке 58

Можно ли использовать фильтр даты? потому что я использую тип данных datetime в базе данных.

вот мой код

<?php
if (isset($_POST['chk'])) {
    $defect_query = "";
    foreach ($_POST['chk'] as $id => $data) {
        $defect_query = $defect_query . ", COUNT(CASE t_transaction.DEFECT_CLASS_ID WHEN " . $data . " THEN t_defect_class.DEFECT_CLASS_NAME END) AS `" . $data . "`";
    }

    //$machine        = $_POST['machine'];
    $start_date = $_POST['start_date'];
    $end_date = $_POST['end_date'];
    //$grade      = $_POST['grade'];
    $chk = $_POST['chk'];
    ?>

    <thead>
    <th class="text-center" >Date Process</th>
    <?php
    foreach ($_POST['chk'] as $id => $data) {
        $get_defect_name = mysqli_query($mysqli, "SELECT * FROM `t_defect_class` WHERE `DEFECT_CLASS_ID` = $data");
        $defect_name_table = mysqli_fetch_assoc($get_defect_name);
        ?>
        <th class="text-center"><?php echo $defect_name_table['DEFECT_CLASS_NAME']; ?></th>
    <?php } ?>
    </thead>
    <?php
    $modal = mysqli_query($mysqli, "SELECT t_name_file.PROCESS_TIME" . $defect_query . " FROM t_transaction INNER JOIN t_name_file ON t_transaction.NAMEFILE_ID=t_name_file.NAMEFILE_ID INNER JOIN t_defect_class ON t_transaction.DEFECT_CLASS_ID=t_defect_class.DEFECT_CLASS_ID GROUP BY t_transaction.DEFECT_CLASS_ID, t_name_file.PROCESS_TIME t_name_file.PROCESS_TIME BETWEEN '$start_date' AND '$end_date' ORDER BY t_name_file.PROCESS_TIME");

    $count = mysqli_num_rows($modal);

    if ($count == "0") {
        ?>
        <td class="text-center">NOT FOUND</td>
        <?php
    } else {

        while ($defect = mysqli_fetch_array($modal)) {
            ?>
            <tr>
                <td class="text-center"><?php echo $defect['PROCESS_TIME']; ?></td>
                <?php foreach ($_POST['chk'] as $id => $data) { ?>
                    <td class="text-center"><?php echo $defect[$data]; ?></td>
                <?php } ?>
            </tr>


            <?php
        }
    }
}
?>

спасибо

Ответы [ 2 ]

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

Решено !, Спасибо всем !. вот мой код

if (isset($_POST['chk'])){
  $defect_query = "";
  foreach ($_POST['chk'] as $id => $data) {
    $defect_query = $defect_query.", COUNT(CASE t_transaction.DEFECT_CLASS_ID WHEN ".$data." THEN t_defect_class.DEFECT_CLASS_NAME END) AS `".$data."`";
  }

  if (isset($_POST['machine'])) {
    $machine        = $_POST['machine'];
  }
  $start_date   = $_POST['start_date'];
  $end_date     = $_POST['end_date'];
  // echo "<script>alert('".$start_date." - ".$end_date."')</script>";
  if (isset($_POST['grade'])) {
    $grade      = $_POST['grade'];
  }
  $chk          = $_POST['chk'];




?>

    <thead>
      <th class="text-center" >Date Process</th>
      <?php
        foreach ($_POST['chk'] as $id => $data) {
          $get_defect_name = mysqli_query($mysqli, "SELECT * FROM `t_defect_class` WHERE `DEFECT_CLASS_ID` = $data");
          $defect_name_table = mysqli_fetch_assoc($get_defect_name);
        ?>
        <th class="text-center"><?php echo $defect_name_table['DEFECT_CLASS_NAME']; ?></th>
        <?php } ?>
    </thead>
<?php




  if (isset($_POST['grade']) && isset($_POST['machine'])) {
    $modal=mysqli_query($mysqli,"SELECT t_name_file.PROCESS_TIME".$defect_query." FROM t_transaction INNER JOIN t_name_file ON t_transaction.NAMEFILE_ID=t_name_file.NAMEFILE_ID INNER JOIN t_defect_class ON t_transaction.DEFECT_CLASS_ID=t_defect_class.DEFECT_CLASS_ID WHERE t_name_file.PROCESS_TIME BETWEEN '".$start_date."' AND '".$end_date."' AND t_name_file.MACHINE_ID = '".$machine."' AND t_name_file.NAMEFILE_ID = '".$grade."' GROUP BY t_transaction.DEFECT_CLASS_ID, t_name_file.PROCESS_TIME ORDER BY t_name_file.PROCESS_TIME");
  } else if (isset($_POST['machine']) && !isset($_POST['grade'])) {
    $modal=mysqli_query($mysqli,"SELECT t_name_file.PROCESS_TIME".$defect_query." FROM t_transaction INNER JOIN t_name_file ON t_transaction.NAMEFILE_ID=t_name_file.NAMEFILE_ID INNER JOIN t_defect_class ON t_transaction.DEFECT_CLASS_ID=t_defect_class.DEFECT_CLASS_ID WHERE t_name_file.PROCESS_TIME BETWEEN '".$start_date."' AND '".$end_date."' AND t_name_file.MACHINE_ID = '".$machine."' GROUP BY t_transaction.DEFECT_CLASS_ID, t_name_file.PROCESS_TIME ORDER BY t_name_file.PROCESS_TIME");
  } else if (isset($_POST['grade']) && !isset($_POST['machine'])) {
    $modal=mysqli_query($mysqli,"SELECT t_name_file.PROCESS_TIME".$defect_query." FROM t_transaction INNER JOIN t_name_file ON t_transaction.NAMEFILE_ID=t_name_file.NAMEFILE_ID INNER JOIN t_defect_class ON t_transaction.DEFECT_CLASS_ID=t_defect_class.DEFECT_CLASS_ID WHERE t_name_file.PROCESS_TIME BETWEEN '".$start_date."' AND '".$end_date."' AND t_name_file.NAMEFILE_ID = '".$grade."' GROUP BY t_transaction.DEFECT_CLASS_ID, t_name_file.PROCESS_TIME ORDER BY t_name_file.PROCESS_TIME");
  } else {
    $modal=mysqli_query($mysqli,"SELECT t_name_file.PROCESS_TIME".$defect_query." FROM t_transaction INNER JOIN t_name_file ON t_transaction.NAMEFILE_ID=t_name_file.NAMEFILE_ID INNER JOIN t_defect_class ON t_transaction.DEFECT_CLASS_ID=t_defect_class.DEFECT_CLASS_ID WHERE t_name_file.PROCESS_TIME GROUP BY t_transaction.DEFECT_CLASS_ID, t_name_file.PROCESS_TIME ORDER BY t_name_file.PROCESS_TIME");
  }
  // echo "<script>alert(\"SELECT t_name_file.PROCESS_TIME".$defect_query." FROM t_transaction INNER JOIN t_name_file ON t_transaction.NAMEFILE_ID=t_name_file.NAMEFILE_ID INNER JOIN t_defect_class ON t_transaction.DEFECT_CLASS_ID=t_defect_class.DEFECT_CLASS_ID WHERE t_name_file.PROCESS_TIME BETWEEN '".$start_date."' AND '".$end_date."' AND t_name_file.MACHINE_ID = '".$machine."' AND t_name_file.GRADE = '".$grade."' GROUP BY t_transaction.DEFECT_CLASS_ID, t_name_file.PROCESS_TIME ORDER BY t_name_file.PROCESS_TIME\")</script>";
  $no = 0;
  while($defect=mysqli_fetch_array($modal)){
  $no++;

?>
  <tr>
      <td class="text-center"><?php echo $defect['PROCESS_TIME']; ?></td>
      <?php foreach ($_POST['chk'] as $id => $data) { ?>
        <td class="text-center"><?php echo  $defect[$data]; ?></td>
      <?php } ?>
  </tr>


<?php 
} 
} ?>
0 голосов
/ 29 октября 2018

У меня есть несколько проблем с безопасностью и эффективностью, когда я проверяю ваш фрагмент, но, чтобы сосредоточиться на заданном вопросе, проблема заключается в том, что у вас есть мошенник 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.

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