«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/07/26 20:33:37  №1235889 1
Призываю в тред гуру для ответа и новичков для просмотра. Эта конкретная задача которую вам по любому придется выполнять.
Задача: https://pastebin.com/jwPp3di5
Есть форма которая пишет введенное значение в файл. Но!, при нажатии кнопки обновить в браузере запрос повторяется и значение знаешь? опять пишутся в файл. Нужно ей запретить.
Пикрилейтед 2 - кнопка обновить
Пикрилейтед 3 - 5 нажатий

Я хочу собрать варианты решения и чем больше, тем лучше. И примеры. Гуру, не поленитесь написать решение иначе это придется делать мне.

Я решаю это так: https://pastebin.com/8ERUtNbx
Добавляю заголовок:
header("Location:$_SERVER[PHP_SELF]");
Но есть и минусы. Если файл что-то выводит до этой строки - будет ошибка:
Warning: Cannot modify header information - headers already sent by (output started at C:\Web\Apache2.2\htdocs\3.php:2) in C:\Web\Apache2.2\htdocs\3.php on line 18
Для того чтобы не контролировать весь вывод до заголовка, нужно в PHP.ini включить буфер
output_buffering = On
И использовать функции буфера ob_start(); и ob_end_flush();
Результат: https://pastebin.com/x9Np8tPb
Минус тоже в том что не во всех серверах буфер будет включен.
Ответы: >>1235891 >>1236030
Аноним 2018/07/26 20:39:02  №1235891 2
>>1235889
Так а что за задача? Тебе нужно с каждого нового запроса новый фал создавать или дописывать в один?
Ответы: >>1235899
Аноним 2018/07/26 20:57:48  №1235899 3
>>1235891
Задача НЕ дописывать в файл (файл тут для удобства, тоже самое происходить при добавлении в БД) пр обновлении страницы.
Мне показали пример ссессий и метки но я нихуйя пока не могу понять. Когда и как ставить.
Аноним 2018/07/27 07:25:13  №1236030 4
>>1235889

Чтобы форма не отправлялась 2 раза, надо использовать паттерн Post/Redirect/Get. Почитай мой урок про обработку форм https://github.com/codedokode/pasta/blob/master/forms.md

> Но есть и минусы. Если файл что-то выводит до этой строки - будет ошибка:

Надо в начало файла поместить всю логику, а весь вывод делать в конце. Если ты сначала выводишь шапку, а только потом обрабатываешь форму, то ты делаешь большую глупость.

Также, надо сохранять файл в utf-8 без BOM (byte order mark).

Не надо искать сложные решения там, где есть простые.
Ответы: >>1236478
Аноним 2018/07/27 17:16:15  №1236478 5
gothic7.jpg (103, 1024x768)
768x1024
>>1236030
>Чтобы форма не отправлялась 2 раза, надо использовать паттерн Post/Redirect/Get.
Где про это можно прочитать/посмотреть реализацию?

ОП, прошу твое внимания, так как всем похуй.
Я сам реализовал. Логика такова:
1. Создаем переменную метку и генерируем её случайное значение. Вставляем эту метку в форму чтобы отправить её методом POST.
2. Есть условие добавления информации в файл (в БД/не важно). К этому условию добавляем то, что переменная $_SESSION['token'] != $_POST['tonek']. В конце добавления данных в файл/БД/куда угодно устанавливаем $_SESSION['token'] = $_POST['tonek']. И все работает.
Логика такова:
Случайное число (например 666), передается формой ($_POST['token'] = 666), сравнивается с $_SESSION['token'] (коротая, пустая "" != 666) и условие выполняется. Присваиваем $_SESSION['token'] = $_POST['tonek'] (Это 666 = 666). Но когда мы нажимаем обновить (F5) $_POST['token'] не генерирует новое число, а отправляет старое. А его значение уже присвоено $_SESSION['token']. Теперь условие не выполняется. А выполнится оно только при новом отправлении формы.
https://pastebin.com/GjEUKt4y
Но мне типа успешные люди сказали что код хуевый. 2. Так ли это?

>Надо в начало файла поместить всю логику, а весь вывод делать в конце. Если ты сначала выводишь шапку, а только потом обрабатываешь форму, то ты делаешь большую глупость.
3. Можешь исправить мой код так как ты его видишь?
Ответы: >>1236495 >>1236551
Аноним 2018/07/27 17:51:35  №1236495 6
Аноним 2018/07/27 19:23:00  №1236551 7
>>1236478

> Где про это можно прочитать/посмотреть реализацию?

Это описано в уроке на который я давал ссылку: https://github.com/codedokode/pasta/blob/master/forms.md

> Если все данные введены правильно, то мы после их обработки делаем редирект на какую-то другую страницу, например на страницу просмотра введенной информации, страницу благодарности, и т.д. Редирект необходим, чтобы при обновлении страницы форма не отправлялась повторно (если ты не знаешь, что такое редирект, то это выдача заголовка вроде Location: /thankyou.php. В php для этого используется функция header()).

> Этот подход (редирект после успешной обработки формы) называется Post/Redirect/Get.

У тебя какое-то переусложненное решение с сессиями.

Советую прочитать урок внимательно.

> 3. Можешь исправить мой код так как ты его видишь?

Ты можешь сделать это и сам. Что сложного в том, чтобы убрать весь вывод из начала скрипта и перенести в конец?

Должно быть так:

<?php

проверка данных формы;
определение значений переменных

?>
HTML код с подстановкой переменных

Ответы: >>1236553
Аноним 2018/07/27 19:32:47  №1236553 8
>>1236551
Благодарю. Прости я не читал твоих уроков. По книге как-бы ебашу.