За последние 24 часа нас посетили 22348 программистов и 1143 робота. Сейчас ищут 662 программиста ...

Фильтр вывода товара из базы данных

Тема в разделе "PHP и базы данных", создана пользователем Macan, 11 июл 2019.

  1. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Приветствую всех, подскажите как реализовать множественный фильтр. Имеется база данных, из которой выводятся выбранный пользователем с помощью выпадающего списка и чек-боксов , товар на страницу в блоке carts.

    Структура БД.

    scrin.png



    ----index.php----

    PHP:
    1. <?php
    2.  
    3.     include 'main.php';
    4.     $shiny = $result;
    5.  
    6. ?>
    7. <!DOCTYPE html>
    8. <html lang="ru">
    9.  
    10. <head>
    11.  
    12.     <meta charset="utf-8">
    13.     <base href="/">
    14.  
    15.     <title></title>
    16.     <meta name="description" content="">
    17.  
    18.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
    19.     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    20.    
    21.     <!-- Template Basic Images Start -->
    22.     <meta property="og:image" content="path/to/image.jpg">
    23.     <link rel="icon" href="img/favicon/favicon.ico">
    24.     <link rel="apple-touch-icon" sizes="180x180" href="img/favicon/apple-touch-icon-180x180.png">
    25.     <!-- Template Basic Images End -->
    26.    
    27.     <!-- Custom Browsers Color Start -->
    28.     <meta name="theme-color" content="#322E44">
    29.     <!-- Custom Browsers Color End -->
    30.  
    31.     <link rel="stylesheet" href="css/main.css">
    32.  
    33. </head>
    34. <body>
    35. <form class="form">
    36.     <?php
    37.     $result = mysqli_query($conn, 'SELECT DISTINCT brend FROM shiny ORDER BY brend');
    38.     ?>
    39.  
    40.         <select id="brend">
    41.         <option disabled selected>Все</option>
    42.         <?php
    43.  
    44.             while( ($brend = mysqli_fetch_assoc($result)) ) {
    45.  
    46.             echo '<option value="'. $brend['brend'] .'">' . $brend['brend'] . '</option>';
    47.  
    48.             }
    49.         ?>
    50.  
    51.         </select>
    52.  
    53.         <?php
    54.         $result = mysqli_query($conn, 'SELECT DISTINCT width FROM shiny ORDER BY width');
    55.         ?>
    56.  
    57.         <select id="width">
    58.         <option disabled selected>Все</option>
    59.         <?php
    60.  
    61.             while( ($width = mysqli_fetch_assoc($result)) ) {
    62.                
    63.             echo '<option value="' . $width['width'] . '">' . $width['width'] . '</option>';
    64.  
    65.             }
    66.         ?>
    67.  
    68.         </select>
    69.  
    70.         <?php
    71.         $result = mysqli_query($conn, 'SELECT DISTINCT height FROM shiny ORDER BY height');
    72.         ?>
    73.  
    74.         <select id="height">
    75.         <option disabled selected>Все</option>
    76.         <?php
    77.  
    78.             while( ($height = mysqli_fetch_assoc($result)) ) {
    79.                
    80.             echo '<option value="' . $height['height'] . '">' . $height['height'] . '</option>';
    81.  
    82.             }
    83.         ?>
    84.  
    85.         </select>
    86.  
    87.         <?php
    88.         $result = mysqli_query($conn, 'SELECT DISTINCT diametr FROM shiny ORDER BY diametr');
    89.         ?>
    90.  
    91.         <select id="diametr">
    92.         <option disabled selected>Все</option>
    93.         <?php
    94.             while( ($diametr = mysqli_fetch_assoc($result)) ) {
    95.                
    96.             echo '<option value="' . $diametr['diametr'] . '">' . $diametr['diametr'] . '</option>';
    97.  
    98.             }
    99.         ?>
    100.  
    101.         </select>
    102.  
    103.                     <div class="leto">
    104.                         <input class="check-box" type="checkbox" id="leto" />
    105.                         <label class="check" for="leto">Летняя</label>
    106.                        
    107.                     </div>
    108.  
    109.                     <div class="zima">
    110.                         <input class="check-box" type="checkbox" id="zima" />
    111.                         <label class="check" for="zima">Зимняя</label>
    112.                     </div>
    113.  
    114.                     <div class="ship">
    115.                         <input class="check-box" type="checkbox" id="ship" />
    116.                         <label class="check" for="ship">Шипованная</label>
    117.                     </div>
    118.                     <div class="neship">
    119.                         <input class="check-box" type="checkbox" id="neship" />
    120.                         <label class="check" for="neship">Нешипованная</label>
    121.                     </div>
    122.                     <button type="reset" class="button-right">Сбросить</button>
    123. </form>
    124.             <button class="button-left">Выбрать</button>
    125.  
    126.  
    127.  
    128.  
    129. <div class="carts" id="carts">
    130.     <!-- <?php foreach ($shiny as $item) : ?>
    131.         <div class="cart">
    132.         <img src="<?=$item['image'];?>">
    133.         <p class="brend"><b><?=$item['brend'];?></b></p>
    134.         <p class="name"><b><?=$item['name'];?></b></p>
    135.         <p class="width"><b>Ширина:  <?=$item['width'];?></span></b></p>
    136.         <p class="height"><b>Высота:  <?=$item['height'];?></span></b></p>
    137.         <p class="diametr"><b>Диаметр:  <?=$item['diametr'];?></span></b></p>
    138.         <p class="season"><b>Сезон:  <?=$item['season'];?></span></b></p>
    139.         <p class="weight"><b>Вес:  <?=$item['weight'];?> кг.</span></b></p>
    140.         </div>
    141.     <?php endforeach; ?> -->
    142. </div>
    143.  
    144. <?php
    145.     mysqli_close($conn);
    146. ?>
    147.  
    148.     <script src="js/jquery.min.js"></script>
    149.     <script src="js/common.js"></script>
    150.  
    151. </body>
    152. </html>
    ----main.php----

    PHP:
    1.     $conn = mysqli_connect('localhost', '*****', '*****', '******');
    2.         if($conn == false ) {
    3.             echo 'Не удалось соединиться!';
    4.             echo mysqli_connect_error();
    5.             exit();
    6.         }
    7.  
    8.  
    9.  
    10.     $result = mysqli_query($conn, 'SELECT * FROM shiny');
    11.     for($i = 0;$i < mysqli_num_rows($result); $i++) {
    12.         $shiny[] = mysqli_fetch_array($result);
    13.     }
    14.  
    15.     return $shiny;
    ----common.js----

    Код (Javascript):
    1. $(document).ready(function() {
    2.  
    3.     function filterItems() {
    4.         var filter = $('.form'),
    5.             items = $('.cart');
    6.         items.hide();
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Код (Text):
    1. SELECT * FROM shiny WHERE <множественный фильтр>
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Для начал добавить всем селектам name.
    HTML:
    1. <select id="width" name="width">
    Потом в main.php проверять есть ли что то в этих name и писать условие.
    PHP:
    1. if(isset($_POST['width'])){
    2. // всяческие проверки что пришло;
    3. $width = //если все хорошо, передача это в переменную
    4. }
    5. // в итоге если есть что фильтровать пишем
    6. $sql="SELECT * FROM shiny WHERE width = '$width'";
    7. //если нечего фильтровать
    8. $sql="SELECT * FROM shiny";
    9. $result = mysqli_query($conn, $sql);
     
  4. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Спасибо,попробую.
    Вот сайт http://ves-shiny.ru но там неправильно работают чек-боксы, и схема вывода другая(ошибся немного).
     
  5. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Что-то ничего не происходит. И ошибок нет.
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    кнопка выбрать должна быть в форме. Так примерно должно быть:
    HTML:
    1. <form method="post">
    2.    <p><select name="hero">
    3.     <option disabled>Выберите героя</option>
    4.     <option value="Чебурашка">Чебурашка</option>
    5.     <option value="Крокодил Гена">Крокодил Гена</option>
    6.     <option value="Шапокляк">Шапокляк</option>
    7.     <option value="Крыса Лариса">Крыса Лариса</option>
    8.    </select></p>
    9.    <p><input type="submit" value="Отправить"></p>
    10.   </form>
     
  7. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    Sql инъекция в main.php?
     
  8. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    У м
    У меня кнопка выбора работает просто как
    Код (Javascript):
    1. $('.button-left').click (function() {
    2.             $('.carts').show();
     
  9. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    Ну js тогда должен отправить ajax запрос php скрипту
     
  10. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Там вообще index.html, вывод через json parse.
    --- Добавлено ---
    Как это можно реализовать?
     
  11. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    А сорри, это @Artur_hopf накидал схематичный код с инъекцией.

    Вообще ajax запрос необязательно делать, тогда добавь input type submit , как пишет @Artur_hopf .
    Без нажатия на кнопку форма не отправится.
     
  12. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Что-то типа такого ?
    Код (Javascript):
    1. $.ajax({
    2.                 url: 'index.php',
    3.                     data: filter.serialize(),
    4.                 type: 'POST',
    5.                 success: function(responseHtml){
    6.                     $('.carts').html(responseHtml);
    --- Добавлено ---
    Эти селекты и чек-боксы просто как фильтр работают,не надо ни каких форм отправлять.
     
  13. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @yanuzay какие еще инъекции =)
    PHP:
    1. if(isset($_POST['width'])){
    2. // всяческие проверки что пришло;
     
  14. yanuzay

    yanuzay Активный пользователь

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    Sql инъекции
     
  15. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Ничего.
    PHP:
    1. if(isset($_POST['brend'])){
    2.             echo 'hello';
    3.             $brend = $br;
    4.         }
    5.         $sql="SELECT * FROM shiny WHERE brend = '$brend'";
    6.         $result = mysqli_query($conn, $sql);
     
  16. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    HTML:
    1.     <span>Производитель</span>
    2.     <select id="brend">
    3.         <option disabled="" selected="">Все</option>
    4.         <option value="Continental">Continental</option>
    5.         <option value="Dunlop">Dunlop</option>
    6.         <option value="Firestone">Firestone</option>
    7.         <option value="Formula">Formula</option>
    8.         <option value="GeneralTire">GeneralTire</option>
    9.         <option value="Gislaved">Gislaved</option>
    10.         <option value="Goform">Goform</option>
    11.         <option value="Goodrich">Goodrich</option>
    12.         <option value="GoodYear">GoodYear</option>
    13.         <option value="Hankook">Hankook</option>
    14.         <option value="Headway">Headway</option>
    15.         <option value="Horizon">Horizon</option>
    16.         <option value="Kama">Kama</option>
    17.         <option value="Kumho">Kumho</option>
    18.         <option value="Laufenn">Laufenn</option>
    19.         <option value="Matador">Matador</option>
    20.         <option value="Maxxis">Maxxis</option>
    21.         <option value="Michelin">Michelin</option>
    22.         <option value="Nitto">Nitto</option>
    23.         <option value="Nokian">Nokian</option>
    24.         <option value="Pirelli">Pirelli</option>
    25.         <option value="Sailun">Sailun</option>
    26.         <option value="Sava">Sava</option>
    27.         <option value="Tigar">Tigar</option>
    28.         <option value="ToyoTires">ToyoTires</option>
    29.         <option value="Viatti">Viatti</option>
    30.         <option value="Yokohama">Yokohama</option>
    31.                
    32.     </select>
    33.  
    34.     <span>Ширина</span>
    35.     <select id="width">
    36.         <option disabled="" selected="">Все</option>
    37.         <option value="115">115</option>
    38.         <option value="125">125</option>
    39.         <option value="135">135</option>
    40.         <option value="145">145</option>
    41.         <option value="155">155</option>
    42.         <option value="165">165</option>
    43.         <option value="175">175</option>
    44.         <option value="185">185</option>
    45.         <option value="195">195</option>
    46.         <option value="205">205</option>
    47.         <option value="215">215</option>
    48.         <option value="225">225</option>
    49.         <option value="235">235</option>
    50.         <option value="245">245</option>
    51.         <option value="255">255</option>
    52.         <option value="265">265</option>
    53.         <option value="275">275</option>
    54.         <option value="285">285</option>
    55.         <option value="295">295</option>
    56.         <option value="305">305</option>
    57.         <option value="315">315</option>
    58.         <option value="325">325</option>
    59.         <option value="335">335</option>
    60.         <option value="345">345</option>
    61.        
    62.     </select>
    63.  
    64.     <span>Высота</span>
    65.     <select id="height">
    66.         <option disabled="" selected="">Все</option>
    67.         <option value="25">25</option>
    68.         <option value="27">27</option>
    69.         <option value="29">29</option>
    70.         <option value="30">30</option>
    71.         <option value="31">31</option>
    72.         <option value="32">32</option>
    73.         <option value="33">33</option>
    74.         <option value="34">34</option>
    75.         <option value="35">35</option>
    76.         <option value="36">36</option>
    77.         <option value="37">37</option>
    78.         <option value="38.5">38.5</option>
    79.         <option value="40">40</option>
    80.         <option value="42">42</option>
    81.         <option value="45">45</option>
    82.         <option value="50">50</option>
    83.         <option value="55">55</option>
    84.         <option value="60">60</option>
    85.         <option value="65">65</option>
    86.         <option value="70">70</option>
    87.         <option value="75">75</option>
    88.         <option value="80">80</option>
    89.         <option value="82">82</option>
    90.         <option value="85">85</option>
    91.         <option value="90">90</option>
    92.  
    93.     </select>
    94.  
    95.     <span>Диаметр</span>
    96.     <select id="diametr">
    97.         <option disabled="" selected="">Все</option>
    98.         <option value="12">12</option>
    99.         <option value="12C">12C</option>
    100.         <option value="13">13</option>
    101.         <option value="13C">13C</option>
    102.         <option value="14">14</option>
    103.         <option value="14C">14C</option>
    104.         <option value="15">15</option>
    105.         <option value="15C">15C</option>
    106.         <option value="16">16</option>
    107.         <option value="16C">16C</option>
    108.         <option value="17">17</option>
    109.         <option value="17C">17C</option>
    110.         <option value="18">18</option>
    111.         <option value="18C">18C</option>
    112.         <option value="19">19</option>
    113.         <option value="20">20</option>
    114.         <option value="21">21</option>
    115.         <option value="22">22</option>
    116.         <option value="23">23</option>
    117.  
    118.     </select>
    119. </form>
    120. <button class="button-left" id="post" style="cursor: pointer;">Выбрать</button>
    121. var form = document.querySelectorAll('form select'),
    122.     post = document.getElementById('post');
    123.     formData = new FormData();
    124.  
    125. [].forEach.call(form, function(item){
    126.     item.addEventListener("input", function(){
    127.         var id = this.getAttribute("id"),
    128.             val = this.value;
    129.         formData.append(id, val);
    130.         console.log(id);
    131.     })
    132. });
    133.  
    134. post.onclick = function(){
    135.     formAjax('test.php', formData, function(data){
    136.         console.log(data);
    137.     });
    138. }
    139.  
    140. function formAjax(url, form, success) {
    141.  
    142.     var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    143.     xhr.open('POST', url);
    144.     xhr.onreadystatechange = function() {
    145.         if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); }
    146.         if (xhr.status==500) { console.log(xhr.responseText); }
    147.     };
    148.     xhr.send(form);
    149.     return xhr;
    150. }
    test.php
    PHP:
    1. <?php
    2. if(count($_POST) > 0){
    3.     print_r($_POST);
    4. }
    5. ?>
     
  17. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Uncaught TypeError: Cannot set property 'onclick' of null
     
  18. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    ид прописали на кнопку?
    HTML:
    1. <button class="button-left" id="post" style="cursor: pointer;">Выбрать</button>
     
  19. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Да, вот только дошло.Теперь ошибки нет.
    --- Добавлено ---
    Сейчас все console.log отрабатывают, кроме чек-боксов.
     
  20. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Их там нет потому что))
     
  21. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    После нажатия на кнопку - пустота.
     
  22. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добавили в свой код и не работает теперь?)
     
  23. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    Да так и есть, я работаю с черновым вариантом сайта на Open Server.
     
  24. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Наймите лучше кого нибудь, за вас делать не хочется. Хороший вам пример показал
     
  25. Macan

    Macan Активный пользователь

    С нами с:
    11 июл 2019
    Сообщения:
    29
    Симпатии:
    0
    PHP:
    1. $result = mysqli_query($conn, 'SELECT * FROM shiny');
    2.     for($i = 0;$i < mysqli_num_rows($result); $i++) {
    3.         $shiny[] = mysqli_fetch_array($result);
    4.     }
    5.         if(count($_POST) > 0){
    6.             print_r($_POST);
    7.     }
    8.     return $shiny;
    А вот теперь работает.
    --- Добавлено ---
    В консоли приходит Array.
    --- Добавлено ---
    Я тупанул не туда вставил.
    PHP:
    1. if(count($_POST) > 0){
    2.             print_r($_POST);