Як я можу зрозуміти, на яку кнопку було натиснуто у формі PHP?


76

У мене є кілька кнопок на моїй сторінці, але я не впевнений, як визначити, яку з них натиснули. Ось розмітка для моїх двох кнопок:

<input type="submit" id="btnSubmit" value="Save Changes" />
<input type="submit" id="btnDelete" value="Delete" />

Відповіді:


147

За допомогою HTML-форми, наприклад:

<input type="submit" name="btnSubmit" value="Save Changes" />
<input type="submit" name="btnDelete" value="Delete" />

Використовуваний PHP-код виглядатиме так:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Something posted

    if (isset($_POST['btnDelete'])) {
        // btnDelete
    } else {
        // Assume btnSubmit
    }
}

Завжди слід передбачати або за замовчуванням відображати першу кнопку подання у вихідному коді HTML форми . На практиці різні браузери надійно надсилають ім’я / значення кнопки подання з даними публікації, коли:

  1. Користувач буквально натискає кнопку подання за допомогою миші або вказівного пристрою
  2. Або є фокус на кнопці подати (вони перекладаються на неї), а потім Enterнатискається клавіша.

Існують інші способи подання форми, і деякі браузери / версії вирішують не надсилати ім’я / значення будь-яких кнопок подання у деяких із цих ситуацій. Наприклад, багато користувачів подають форми, натискаючи Enterклавішу, коли курсор / фокус знаходиться на текстовому полі. Форми також можна надсилати через JavaScript, а також деякі незрозумілі методи.

Важливо звернути увагу на цю деталь, інакше ви дійсно можете розчарувати своїх користувачів, коли вони подають форму, але "нічого не відбувається", і їх дані втрачаються, оскільки ваш код не виявив подання форми, оскільки ви не передбачали факту що ім’я / значення кнопки надсилання не можуть надсилатися разом із даними повідомлення.

Крім того, вищевказану пораду слід також використовувати для форм з однією кнопкою надсилання, тому що ви завжди повинні приймати за замовчуванням кнопку надсилання .

Мені відомо, що Інтернет наповнений безліччю підручників з обробки форм, і майже всі вони роблять не що інше, як перевірку на ім’я та значення кнопки подання. Але вони просто помиляються!


1
Дякуємо за додаткову інформацію про припущення кнопки за замовчуванням ..., яку легко пропустити.
kad81

чому це використовує else замість else якщо?
Buts

@Gorg ще, якщо що? Що б ви тестували і чому?
козел

@goat Чи безпечніше було б вказати, що на btnSubmit точно було натиснуто? Чи міг користувач змінити значення кнопки та подати різні дані?
Батс

2
@Gorg, якщо ви говорите про користувача, який намагається вас обдурити, ви нічого не можете зробити, щоб це зупинити. Це реальність, яку ви повинні прийняти при програмуванні клієнт / сервер - клієнт може легко надіслати вам будь- які потрібні дані. Загальне для зберігання даних на сервері користувача (наприклад, сеанси на стороні сервера) зберігає дані, які ви не хочете, щоб користувач міг втручатися.
козел

14

У HTML:

<input type="submit" id="btnSubmit" name="btnSubmit" value="Save Changes" />
<input type="submit" id="btnDelete" name="btnDelete" value="Delete" />

У PHP:

if (isset($_POST["btnSubmit"])){
  // "Save Changes" clicked
} else if (isset($_POST["btnDelete"])){
  // "Delete" clicked
}

4
Вибачте, маю голосувати проти. Обробники форм, які неналежним чином поводяться при використанні клавіші Enter для подання, є моєю неприємною твариною.
козел

4
@chris - Це нормально, ви висловлюєте цілком слушну думку. Проголосував за вашу відповідь.
MiffTheFox

1

Все, що вам потрібно, щоб надати атрибут name кожній кнопці. І вам потрібно звернутися до кожного натискання кнопки зі сценарію PHP. Але будьте обережні, даючи кожній кнопці унікальну назву. Оскільки сценарій PHP більшу частину часу піклується лише про ім’я

<input type="submit" name="Submit_this" id="This" />

-2

Ви запитуєте в php або javascript.

Якщо це в php, вкажіть його ім'я та скористайтеся методом post або get, після цього ви можете скористатися опцією isset або для цього значення кнопки буде встановлено відповідне значення.

Якщо це в js, використовуйте для цього getElementById

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.