выполнение кода кнопки после перезагрузки страницы

IlayVanse

Здравствуйте. Столкнулся с такой проблемой: при первом нажатии на кнопку, выполняется код, а если перезагрузить страницу, то код выполниться без нажатия кнопки.
Как выполнять код по нажатию кнопки и не дать выполниться после перезагрузки страницы?
Код который использую:

PHP:
  1.  <form method=«POST» class=«modal-content animate» action=«»>
  2.    
  3.    <div class=«container»>
  4.      <label for=«uname»><b>User</b></label>
  5.      <input type=«text» placeholder=«Enter Username» name=«uname» required>
  6.  
  7.      <label for=«psw»><b>Password</b></label>
  8.      <input type=«password» placeholder=«Enter Password» name=«psw» required>
  9.        
  10.      <input type=«submit» name=«but» value=«Login»>
  11.      <label>
  12.        <input type=«checkbox» checked=«checked» name=«remember»> Remember me
  13.      </label>
  14.    </div>
  15.  </form>
  16.  
  17. if ($_POST[‘but’] == true){
  18.     echo ‘Y34’;
  19. }
 

Drunkenmunky

Вот эту часть кода исправьте

Код (Text):
  1. if (isset($_POST[‘but’])){
  2.     echo ‘Y34’;
  3. }
 

IlayVanse

Нет. Так код тоже выполняется после перезагрузки страницы.

 

Drunkenmunky

Давайте полный код страницы.

 

IlayVanse

PHP:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name=»viewport» content=»width=device-width, initial-scale=1″>
  5. </head>
  6. <body>
  7.  </br>
  8.  
  9.  <form method=»POST» class=»modal-content animate» action=»»>
  10.    
  11.    <div class=»container»>
  12.     <h3>Authorization</h3>
  13.      <label for=»uname»><b>User</b></label>
  14.      <input type=»text» placeholder=»Enter Username» name=»uname» required>
  15.  
  16.      <label for=»psw»><b>Password</b></label>
  17.      <input type=»password» placeholder=»Enter Password» name=»psw» required>
  18.        
  19.      <input type=»submit» name=»but» value=»Login»>
  20.      <label>
  21.        <input type=»checkbox» checked=»checked» name=»remember»> Remember me
  22.      </label>
  23.    </div>
  24.  </form>
  25. </body>
  26. </html>
  27. <?php
  28. if (isset($_POST[‘but’])){
  29.     echo ‘Y34’;
  30. }
  31. ?>
 

Drunkenmunky

Понял что вы хотите.
Нет, это не так работает.
Чтобы понять механизм, замените метод отправки на GET. И при обновлении смотрите на адресную строку.

 

Artur_hopf

PHP:
  1. if(isset($_POST[‘but’])) {
  2.     header(«location:test.php»); // твой фаил где написано echo’Y34′
  3. }
 

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»

и больше никогда не создавать кнопки инпутами :mad:

 

mkramer

Это чтоб целых 11 байт сэкономить?

А если сделать инпут, монитор у посетителя взорвётся?

Это всё не нарушает никаких стандартов, и не создаёт критичных последствий.

 

Вероломство

это вырабатывает аккуратность и дисциплину :)

просто по моему личному мнению рисовать кнопки инпутами придумали индусы, которые не смогли понять, как button поместить в сериализацию при обработке форм на js, поэтому, если js не используется, то и не надо индусом становиться, костылями не хватало ещё в html пользоваться :)

 

mkramer

Всё проще. <input type=’button’> появился раньше, чем отдельный тег <button>.

 

Вероломство

поэтому он и появился, например, чтобы не костылить кнопки со скрытыми полями

HTML:
  1. <form method=«post»>
  2.     <input type=«hidden» name=«id» value=«<?= $post->id ?>»>
  3.     <input type=«submit» value=«Редактировать»>
  4. </form>
  5.  
  6. <form method=«post»>
  7.     <button name=«id» value=«<?= $post->id ?>»>Редактировать</button>
  8. </form>

:)

 

Drunkenmunky

Здесь какое-то недоразумение.
Атрибут name у input type=»submit» поддерживается.

 

Вероломство

и в чём недоразумение?

в том что ты нарисовал инпутом кнопку и занял атрибут value её названием, что привело к использованию ещё одного скрытого inputa? согласен :)

поэтому для кнопки используется тег кнопки :D

 

Drunkenmunky

Простите недопонял.
name не используют. Он там не нужен. В большинстве случаев.
Только если кнопок больше одной.

 

mkramer

Вообще, лично для меня нету запретных тем, запретных тегов/операторов. Я даже goto-шку поставить не против, если мне так логика очевиднее (хотя, разумеется, делаю это очень редко, большей частью в задачах типа импорта xlsx в базу, поскольку там часто удобно). Поэтому как мысль поведёт, так и наверстаю.

 

Вероломство

при чём тут имя параметра и имя кнопки вместо значения? )))

 

Drunkenmunky

Если указан атрибут name, содержимое value значения не имеет, без name value не передается.
Проще объяснить на примере.

PHP:
  1. <form>
  2. Подтвердите совершеннолетие <br><br>
  3. <input name=»adult» type=submit value=»18+»>
  4. <input name=»getout» type=submit value=»18-«>
  5. </form>
  6.  
  7. <?php
  8. if(isset($_GET[‘getout’])) echo ‘do svidangya’;/// —>
  9.  
  10. if(isset($_GET[‘adult’])) echo ‘preved’;/// —>
  11. ?>

Передаётся только что-то одно.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *