IlayVanse
Здравствуйте. Столкнулся с такой проблемой: при первом нажатии на кнопку, выполняется код, а если перезагрузить страницу, то код выполниться без нажатия кнопки.
Как выполнять код по нажатию кнопки и не дать выполниться после перезагрузки страницы?
Код который использую:PHP:
<form method=«POST» class=«modal-content animate» action=«»> <div class=«container»> <label for=«uname»><b>User</b></label> <input type=«text» placeholder=«Enter Username» name=«uname» required> <label for=«psw»><b>Password</b></label> <input type=«password» placeholder=«Enter Password» name=«psw» required> <input type=«submit» name=«but» value=«Login»> <label> <input type=«checkbox» checked=«checked» name=«remember»> Remember me </label> </div> </form> if ($_POST[‘but’] == true){ echo ‘Y34’; }
Drunkenmunky
Вот эту часть кода исправьте
Код (Text):
if (isset($_POST[‘but’])){ echo ‘Y34’; }
IlayVanse
Нет. Так код тоже выполняется после перезагрузки страницы.
Drunkenmunky
Давайте полный код страницы.
IlayVanse
PHP:
<!DOCTYPE html> <html> <head> <meta name=»viewport» content=»width=device-width, initial-scale=1″> </head> <body> </br> <form method=»POST» class=»modal-content animate» action=»»> <div class=»container»> <h3>Authorization</h3> <label for=»uname»><b>User</b></label> <input type=»text» placeholder=»Enter Username» name=»uname» required> <label for=»psw»><b>Password</b></label> <input type=»password» placeholder=»Enter Password» name=»psw» required> <input type=»submit» name=»but» value=»Login»> <label> <input type=»checkbox» checked=»checked» name=»remember»> Remember me </label> </div> </form> </body> </html> <?php echo ‘Y34’; } ?>
Drunkenmunky
Понял что вы хотите.
Нет, это не так работает.
Чтобы понять механизм, замените метод отправки на GET. И при обновлении смотрите на адресную строку.
Artur_hopf
mkramer
Расшифрую ответ @Artur_hopf. POST-запросы не должны отдавать контент в браузер за исключением случая, когда они дёргаются ажаксом. Поэтому, для обработки форм пишется отдельный обработчик (в том же или другом файле), который, сразу после того, как он сделал нужные действия (к примеру, запись в базу, что мы чаще всего и рисуем на пыхе), он должен давать редирект гетом на другую страничку. У вас же сейчас при обновлении наверняка спрашивает браузер, отправлять ли данные ещё раз. Вот это как раз то, что делает ваша кнопка — отправляет данные. И браузер их отправляет ещё раз, а скрипт на стороне сервера нифига про кнопку не знает, он видит, что пришли данные
Вероломство
несколько вариантов:
- делать после каждого POST-запроса редирект страницы на саму себя (при обновлении страницы не будет запроса повторной отправки данных)
- писать обработчик в отдельном файле и возвращать оттуда редиректом по рефереру, например (при обновлении страницы не будет запроса повторной отправки данных)
- вставлять при помощи js по нажатии на кнопку атрибут value с проверочным токеном, проверять его на бэке (генерируя после каждого обращения к токену — новый токен) и давать отлуп, если он не совпал (при обновлении страницы будет запрос повторной отправки данных, но он не отработает, так как кнопка не была нажата и js не вставил проверочный токен), данный способ хорош ещё при борьбе с CURL-ботами: CURL не знает заранее, какой токен будет проверяться на бэке и не сможет отправить value для кнопки, которое будет соответствовать ему, а если даже и выполнит его получение по первому curl_exec, то будет отшит, так как при втором curl_exec токен полученный в первом не сопадёт один чёрт, потому что после обращения к токену первый раз был сгенерирован новый и curl — убит
Вероломство
<input type=»text» placeholder=»Enter Username» name=»uname» required>
заменить на
<input placeholder=»Enter Username» name=»uname» required>
потому что input по дефолту и так type=»text»
<input type=»submit» name=»but» value=»Login»>
заменить на
<button name=»but»>Login</button>
потому что для кнопки есть тег button и он по дефолту и так type=»submit»
и больше никогда не создавать кнопки инпутами
mkramer
Это чтоб целых 11 байт сэкономить?
А если сделать инпут, монитор у посетителя взорвётся?
Это всё не нарушает никаких стандартов, и не создаёт критичных последствий.
Вероломство
это вырабатывает аккуратность и дисциплину
просто по моему личному мнению рисовать кнопки инпутами придумали индусы, которые не смогли понять, как button поместить в сериализацию при обработке форм на js, поэтому, если js не используется, то и не надо индусом становиться, костылями не хватало ещё в html пользоваться
mkramer
Всё проще. <input type=’button’> появился раньше, чем отдельный тег <button>.
Вероломство
поэтому он и появился, например, чтобы не костылить кнопки со скрытыми полями
HTML:
Drunkenmunky
Здесь какое-то недоразумение.
Атрибут name у input type=»submit» поддерживается.
Вероломство
и в чём недоразумение?
в том что ты нарисовал инпутом кнопку и занял атрибут value её названием, что привело к использованию ещё одного скрытого inputa? согласен
поэтому для кнопки используется тег кнопки
Drunkenmunky
Простите недопонял.
name не используют. Он там не нужен. В большинстве случаев.
Только если кнопок больше одной.
mkramer
Вообще, лично для меня нету запретных тем, запретных тегов/операторов. Я даже goto-шку поставить не против, если мне так логика очевиднее (хотя, разумеется, делаю это очень редко, большей частью в задачах типа импорта xlsx в базу, поскольку там часто удобно). Поэтому как мысль поведёт, так и наверстаю.
Вероломство
при чём тут имя параметра и имя кнопки вместо значения? )))
Drunkenmunky
Если указан атрибут name, содержимое value значения не имеет, без name value не передается.
Проще объяснить на примере.PHP:Передаётся только что-то одно.