Фильтрация CRUD-таблицы с использованием php

Во-первых, я новичок, поэтому извините, пожалуйста, за недостаток знаний.

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

«Кнопка фильтра» должна захватывать входной catID #, который используется в предложении WHERE в операторе SELECT. Я попытался заменить 13 в строке 72 на «$ catID», но безрезультатно.

При вводе определенного значения для числа 'category_id' в файле php, затем сохранении файла и обновлении браузера - это работает, но при использовании кнопки в браузере - нет.

Оператор SELECT звучит ... он работает в phpMyAdmin.

Если я что-то пропустил, дайте мне знать.

Заранее спасибо,

Дэйв

<!DOCTYPE html>
<html lang = "en">
   <head>
      <meta charset = "UTF-8">
      <title>Dashboard</title>
      <link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css">
      <script src = "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
      <script src = "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.js"></script>
      <style type = "text/css">
         .wrapper{
         width: 650px;
         margin: 0 auto;
         }
         .page-header h2{
         margin-top: 0;
         }
         table tr td:last-child a{
         margin-right: 15px;
         }
      </style>
      <script type = "text/javascript">
         $(document).ready(function(){
             $('[data-toggle = "tooltip"]').tooltip();   
         });
      </script>
   </head>
   <body>
      <div class = "wrapper">
         <div class = "container-fluid">
            <div class = "row">
               <div class = "col-md-12">
                  <div class = "page-header clearfix">
                     <h2 class = "center">Tag H Details</h2>
                     <div>
                        <!--Filter Button  -->
                        <d
                        <div class = "col-md-3">
                           <p class = "margin"></p>
                           <div class = "input-group">
                              <div class = "input-group-btn">
                                 <form action = "http://localhost/fp/rt/index.php" method = "post">
                                 <input type = "text" name = "catID" placeholder = "Category" class = "form-control" >
                                 <input type = "submit" name = "catID" value= "Filter" class = "btn btn-primary ">Filter</button></d>
                              </div>
                           </div>
                        </div>
                     </div>
                  </div>
                  <?php
                     // Include config file
                     require_once "config.php";

                     // Attempt select query execution

                     if (isset($_POST['catID']))
                     {

                     $catID = $_POST['catID'];

                     $sql = "SELECT
                     coh_items.id,
                     coh_items.tag_h_id,
                     coh_vendors.name,                          
                     coh_vendors.phone,
                     coh_vendors.c_code,
                     coh_items.purchase_price,
                     COUNT(tag_h_id) AS Reports
                     FROM
                     coh_items
                     INNER JOIN coh_vendors ON coh_items.tag_h_id = coh_vendors.id
                     WHERE
                     category_id = 13
                     GROUP BY
                     tag_h_id;";

                     $search_result = catID($sql);
                     }

                     else {
                     $sql = "SELECT * FROM `coh_items`";
                     $search_result = catID($sql);
                     }
                     function catID($sql){

                     $connect = mysqli_connect("localhost", "root", "", "green");
                     $filter_Result = mysqli_query($connect, $sql);
                     return $filter_Result;
                     };

                     if ($result = mysqli_query($link, $sql)){
                         if (mysqli_num_rows($result) > 0){
                             echo "<table class='table table-bordered table-striped'>";
                                 echo "<thead>";
                                     echo "<tr>";
                                      echo "<th>ID</th>";
                                      echo "<th>Name</th>"; 
                                      echo "<th>Phone</th>";
                                      echo "<th>Status</th>";   
                                      echo "<th>Reports</th>";
                                      echo "<th>Rate</th>";
                                      echo "<th>Action</th>";
                                      echo "</tr>";
                                      echo "</thead>";
                                      echo "<tbody>";
                                      while($row = mysqli_fetch_array($result)){
                                      echo "<tr>";
                                      echo "<td>" . $row['tag_h_id'] . "</td>";
                                      echo "<td>" . $row['name'] . "</td>"; 

                                      echo "<td>" . $row['phone'] . "</td>";
                                      echo "<td>" . $row['c_code'] . "</td>";
                                       echo "<td>" . $row['Reports'] . "</td>";
                                       echo "<td>" . $row['purchase_price'] . "</td>";
                                       echo "<td>";
                                       echo "<a href='read.php?id = ". $row['id'] ."' title='View Record' data-toggle='tooltip'><span class='glyphicon glyphicon-eye-open'></span></a>";
                                       echo "<a href='update.php?id = ". $row['id'] ."' title='Update Record' data-toggle='tooltip'><span class='glyphicon glyphicon-pencil'></span></a>";
                                       echo "<a href='delete.php?id = ". $row['id'] ."' title='Delete Record' data-toggle='tooltip'><span class='glyphicon glyphicon-trash'></span></a>";

                                         echo "</td>";
                                     echo "</tr>";
                                 }
                                 echo "</tbody>";                            
                             echo "</table>";
                             // Free result set
                             mysqli_free_result($result);
                         } else{
                             echo "<p class='lead'><em>No records were found.</em></p>";
                         }
                     } else{
                         echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
                     }

                     // Close connection
                     mysqli_close($link);
                     ?>
               </div>
            </div>
         </div>
      </div>
   </body>
</html>

Этот ответ должен дать вам некоторое представление о том, кто должен решить вашу проблему. а также защитит себя от атак SQL-инъекций: stackoverflow.com/a/60496/4665

Jon P 05.10.2018 06:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
430
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как правильно указывает Джон П., без подготовленных операторов ваш код уязвим для атак с использованием SQL-инъекций. Таким образом, вам действительно нужно перекодировать SQL, используя подготовленные операторы. Однако, если вы просто работаете на домашнем компьютере и не беспокоитесь о безопасности своей базы данных, ниже вы найдете быстрое решение.

Переменная $ sql - это просто строка, и вам нужно создать ее, используя конкатенацию. Как показано ниже:

$sql = "SELECT
          coh_items.id,
          coh_items.tag_h_id,
          coh_vendors.name,                          
          coh_vendors.phone,
          coh_vendors.c_code,
          coh_items.purchase_price,
          COUNT(tag_h_id) AS Reports
        FROM
          coh_items
          INNER JOIN coh_vendors ON coh_items.tag_h_id = coh_vendors.id
        WHERE
          category_id = ".$catID." 
        GROUP BY
          tag_h_id;";

Обновлено:

Хорошо, я нашел проблему. Вы назвали ввод текста и ввод отправки как catID, но, поскольку отправка идет после, его значение (фильтр) перезаписывает значение из текста и используется в методе POST. Простое изменение имени в отправке или удаление имени решит проблему.

    <p class = "margin"></p>
    <div class = "input-group-btn">
        <form action = "http://localhost/fp/rt/index.php" method = "post">
            <input type = "text" name = "catID" placeholder = "Category" class = "form-control"/>
            <input type = "submit" value= "Filter" class = "btn btn-primary "/>
        </form>
    </div>

Позвольте мне знать, если это помогает.

ECPerth 05.10.2018 04:24

Этот ответ - чрезвычайно опасный пример. Это делает запрос уязвимым для атак с использованием SQL-инъекций.

Jon P 05.10.2018 06:14

Спасибо за ваши быстрые ответы ... Я очень ценю их обоих. К счастью, поскольку это будет использоваться только на сервере на моей машине, атака с использованием sql-инъекции не является для меня серьезной проблемой. Я очень ценю, что вы указали на это - думаю, я все еще очень зеленый. Решение, предлагаемое ECPerth, к сожалению, вызывает ошибку. Любые идеи?

Dave Zest 05.10.2018 20:00

Значит, он работает, как ожидалось, когда у вас жестко запрограммировано «13»? Вы пытались вывести $ catID перед запуском запроса (сразу после $ catID = $ _POST ['catID'];) и убедиться, что он содержит ожидаемое значение.

ECPerth 06.10.2018 09:52

Это не только уязвимо для SQL-инъекций, но и подвержено ошибкам. Например, если входной $ catID содержит одинарную кавычку, запрос SQL становится синтаксически неверным.

Pang 07.10.2018 07:37

ECPerth - это правильно, жестко закодированные 13 (и другие значения, которые есть в моей таблице, работают), и попытка предложения эха не показывает входное значение. Панг - спасибо, что поделились своим наблюдением.

Dave Zest 07.10.2018 18:54

Я снова отредактировал свой ответ, теперь я знаю, что это не уведомляет вас автоматически. Надеюсь, это решит проблему. Я тоже все еще изучаю правильную практику на этом сайте.

ECPerth 08.10.2018 09:02

Похоже, вы определили настоящую причину этой проблемы, и наблюдение Панга также было полезным в том, что переменная, необходимая для чтения '$ catID' (с одинарными кавычками), заставила это работать. Ваше здоровье!

Dave Zest 09.10.2018 05:57

Другие вопросы по теме