Отменить повторную отправку формы PHP

364
30 декабря 2017, 04:43

Столкнулся с проблемой повторной отправки формы. Прошу помощи, т.к. уже просто мозг вскипает.
Есть файл с функциями, файл в котором выводится статья, и форма комментирования под нее.

Проблема следующая:

Исполняется функция, которая добавляет комментарий к статье. После этого нужно как то избежать повторной отправки формы, чтоб не появлялось окно о повторной отправке данных вообще. header(Location: ) не работает поскольку до него уже были и функции и код.

Как возможно решить эту проблему?
Прошу прощения за глупый вопрос и за кучу кода. Собственно сам код.

<
?php
    include_once 'functions.php';//подключаю файл с функциями
    $full_article = showArticle();//функция получает из базы данных всю информацию о статье
    $article_comments = selectArticleComments();//выводит комментарии для этой статьи из Базы данных
?>
    <!--HEADER-->
    <?php include_once '../inc/header.php'; ?>//подключаю хэдер
    <div id="content">
        <div class="container">//вывожу статью
            <div class="row">
                <section class="content__left col-sm-8">
                    <?php
                    foreach ($full_article as $full_art){
                        ?>
                        <div class="block">
                            <h3><?= $full_art['title']; ?></h3><hr/>
                            <div>
                                <a><?= $full_art['views'] . ' '; ?>Просмотров</a>
                            </div>
                            <div class="block__content">
                                <div>
                                    <img src="../media/images/<?= $full_art['img']; ?>">
                                </div>
                                <div class="full-text">
                                    <?= $full_art['text']; ?>
                                </div>
                            </div>
                        </div>
                        <?php
                    }
                    ?>
                    <div class="block" id="comment-add-form">//ФОРМА ДОБАВЛЕНИЯ КОММЕНТАРИЯ
                        <h3>Добавить комментарий</h3>
                        <div class="block__content">
                            <form class="form" method="post" action="../inc/article.php?id=<?php echo $article_comment['article_id'];?>">
                                <div class="form__group">
                                    <div class="row">
                                        <div class="col-md-6">
                                            <input type="text" class="form__control" required="" name="name" placeholder="Имя">
                                        </div>
                                        <div class="col-md-6">
                                            <input type="text" class="form__control" required="" name="email" placeholder="email">
                                        </div>
                                    </div>
                                </div>
                                <div class="form__group">
                                    <textarea name="text" required="" class="form__control" placeholder="Текст комментария ..."></textarea>
                                </div>
                                <div class="form__group">
                                    <input type="submit" class="form__control" name="do_post" value="Добавить комментарий">
                                </div>
                            </form>
                        </div>
                    </div>
                </section>
                <section class="content__right col-sm-4">
                    <!--SIDEBAR-->
                    <?php include '../inc/sidebar.php'?>
                </section>
            </div>
        </div>
    </div>
    <footer id="footer">
        <?php include '../inc/footer.php'?>
    </footer>
</div>
<?php//ДОБАВЛЯЮ КОММЕНТАРИЙ 
if (isset($_POST['do_post'])){
addComment();//ФУНКЦИЯ КОТОРАЯ ДОБАВЛЯЕТ КОММЕНТАРИЙ В БАЗУ ДАННЫХ
}//вставлять тут redirect нет смысла - он не сработает.
Answer 1

Попробуйте так:

Вверху:

<?php
    include_once 'functions.php';//подключаю файл с функциями
    $full_article = showArticle();//функция получает из базы данных всю информацию о статье
    if (isset($_POST['do_post'])){
       addComment();//ФУНКЦИЯ КОТОРАЯ ДОБАВЛЯЕТ КОММЕНТАРИЙ В БАЗУ ДАННЫХ
    }
    $article_comments = selectArticleComments();//выводит комментарии для этой статьи из Базы данных
?>

Это для того, чтобы во время перезагрузки страницы в $article_comments появился новый комментарий. Иначе - сообщение о комментарии есть, но видно его не будет. Внизу добавление комментария нужно убрать.

Это конечно при условии, что эта форма отправляется на эту же страницу. Если нет, тогда нужно смотреть код где обрабатывается $_POST. Если да, попробуйте action в форме оставить пустым так:

<form class="form" method="post" action="">
Answer 2

Вопрос решил похожим способом, как указанный вверху. Первым делом в шапке оставил только это

<?php
    include_once 'functions.php';//подключаю функции
    ob_start();//буферизация начата
?>
$full_article = showArticle();//функция получает из базы данных всю информацию о статье

перенес сверху непосредственно, в то место, где начинается

foreach ($full_article as $full_art){...}

a

$article_comments = selectArticleComments();

перенес туда, где начинается

foreach ($article_comments as $article_comment){...}

затем во всех подключаемых файлах вроде header, sidebar и т.д. удалил ненужные include(потому что хедер и аналогичные элементы подключаются в index.php или article.php. таким образом избежал ненужных повторов) я новичок в этом, потому подключать файлы везде где только можно я люблю))) В самом низу документа код

<?php
if (isset($_POST['do_post'])){
    addComment();//добавление комментария в БД
    header("Location: " . $_SERVER['HTTP_REFERER']);//возвращаем пользователя на ту же страницу(поскольку она имеет вид не просто article.php а article.php?id=4 т.е. в зависимости от id статьи. адрес меняется)
}

P.S. данный способ работает.Возможно он не идеален, но я лишь учусь. Всем огромное спасибо за помощь. Возможно кому-то тоже это поможет.

READ ALSO
Запись данных массива в базу данных MySQL

Запись данных массива в базу данных MySQL

Доброго времени сутокИмеется массив (только числовой) $_POST['ch'] и массив $_POST['osel'] (так же числовой)

244
DropzoneJS + PHP

DropzoneJS + PHP

Установил плагин DropzoneJS (http://wwwdropzonejs

153
Рассчитать время между датами

Рассчитать время между датами

Есть две даты с временем в формате DATETIME (напр2017-12-28 15:00 и 2017-12-29 12:00 )

195
Как исключить мета поле в запросе get_posts?

Как исключить мета поле в запросе get_posts?

В цикле wordpress есть запрос get_posts произвольного типа, в выводе которого нужно исключить мета поле cp_category со значением "Шины" и полностью мета...

152