За последние 24 часа нас посетил 20251 программист и 1080 роботов. Сейчас ищут 742 программиста ...

Проверить, пришёл GET или нет

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

Метки:
  1. Comandante

    Comandante Новичок

    С нами с:
    9 май 2019
    Сообщения:
    5
    Симпатии:
    0
    Доброго времени суток всем! Никак не могу решить следующую проблему. Есть файл index.php, где есть форма, которая добавляет данные в БД. С добавлением всё в порядке, но возникает такая ошибка- после добавления данных в БД, если обновить страницу(при пустой форме), в БД дублируются данные, введённые до этого. Например: я ввожу в форму слово "Форум по PHP", нажимаю на кнопку добавить, происходит добавление "Форум по PHP" в БД, страница обновляется, форма пуста, я нажимаю кнопку обновить, и значение "ФОРУМ по PHP" вновь дублируется в БД. Ниже приложу свой код, где я пытался решить эту проблему с помощью if (isset(var) )
    PHP:
    1. <?php
    2. $connect = mysqli_connect("localhost", "root", "", "diplom");
    3. if (isset($_GET['category'])) {
    4.   $category = $_GET['category'];
    5.   $q = mysqli_query($connect, "INSERT INTO categories VALUES (null, '$category')");
    6. }
    7. ?>
    Если нужно, также прикладываю часть HTML кода
    HTML:
    1. <!DOCTYPE html>
    2.     <meta charset="utf-8">
    3.     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    4.     <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
    5.     <style type="text/css">
    6.     </style>
    7.     <title></title>
    8. </head>
    9.   <div class="container">
    10.         <div class="row">
    11.       <div class="col-3">
    12. <div id="sidebar-wrapper">
    13.         <ul class="sidebar-nav">
    14.             <li class="sidebar-brand"><a href="index.php">Главная</a>
    15.             </li>
    16.             <li><a href="add_post.php">Добавить запись</a>
    17.             </li>
    18.             <li><a href="edit_posts.php">Редактировать записи</a>
    19.             </li>
    20.             <li><a href="add_cat.php">Добавить категорию</a>
    21.             </li>
    22.             <li><a href="edit_cat.php">Редактировать категории</a>
    23.             </li>
    24.         </ul>
    25.     </div>
    26.   </div>
    27. <div class="col-9">
    28. <form action="add_cat.php">
    29. <div class="row h-100 justify-content-center align-items-center mt-5">
    30.   <div class="form-row col-md-3 ">
    31.     <input type="text" name="category" class="form-control" placeholder="Добавить категорию">
    32.   </div>
    33. </div>
    34.   <div class="row h-100 justify-content-center align-items-center mt-4">
    35.   <button type="submit" class="btn btn-primary">Добавить</button>
    36.     </div>
    37. </form>
    38. </div>
    39. </div>
    40. </div>
    41. <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    42. <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    43. <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    44. </body>
    45. </html>
     
  2. Vanchot

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

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    После вставки в БД ничего не выводить в браузер, а сделать редирект на ту же страницу
    PHP:
    1. if(!empty($_GET['category'])){
    2.     $category = $_GET['category'];// для продакшена так не годится, нужно обезопасить строку
    3.     $q = mysqli_query($connect, "INSERT INTO categories VALUES (null, '$category')");
    4.     header('Location: http://адрес.страницы.с.формой');
    5. }
     
    #2 Vanchot, 9 май 2019
    Последнее редактирование: 9 май 2019
    Comandante нравится это.
  3. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    sql инъекция зайдет на ура.
    только ленивый не взломает тебя с таким кодом.
     
  4. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @yanuzay, никто его ломать не будет, ключевое слово diplom.
     
    Comandante нравится это.
  5. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    497
    Симпатии:
    57
    я тоже заметил, после того как ответил)
     
  6. Comandante

    Comandante Новичок

    С нами с:
    9 май 2019
    Сообщения:
    5
    Симпатии:
    0
    Тоже пробовал этот вариант, но без редиректа, с ним всё заработало, большое спасибо!
     
  7. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Comandante, но в целом замечание правильное, данные перед внесением в бд надо обрабатывать. И дело не только в инъекциях, без эскейпирования можно потерять много данных.
    Поздновато вы пришли на форум, диплом я так понимаю "горит"?
    --- Добавлено ---
    @Comandante, как это вариант редиректа без самого редиректа? :D
     
  8. Vanchot

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

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    Печально. Или, может, Вы использовали рандомные номера в сессии? Тогда ок.

    Что-то на этом форуме у меня частый facepalm.