¿Cómo puedo saber en qué botón se hizo clic en el envío de un formulario PHP?

Respuestas:

147

Con un formulario HTML como:

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

El código PHP a usar se vería así:

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

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

Siempre debe asumir o por defecto que el primer botón de envío aparezca en el código fuente HTML del formulario . En la práctica, los distintos navegadores envían de forma fiable el nombre / valor de un botón de envío con los datos de la publicación cuando:

  1. El usuario literalmente hace clic en el botón enviar con el mouse o dispositivo señalador
  2. O se enfoca en el botón de enviar (lo seleccionaron) y luego Enterse presiona la tecla.

Existen otras formas de enviar un formulario y algunos navegadores / versiones deciden no enviar el nombre / valor de los botones de envío en algunas de estas situaciones. Por ejemplo, muchos usuarios envían formularios presionando la Entertecla cuando el cursor / foco está en un campo de texto. Los formularios también se pueden enviar a través de JavaScript, así como algunos métodos más oscuros.

Es importante prestar atención a este detalle; de ​​lo contrario, puede frustrar a sus usuarios cuando envían un formulario, pero "no pasa nada" y sus datos se pierden, porque su código no detectó el envío de un formulario, porque usted no anticipó el hecho. que el nombre / valor de un botón de envío no se puede enviar con los datos de la publicación.

Además, el consejo anterior también debe usarse para formularios con un solo botón de envío porque siempre debe asumir un botón de envío predeterminado .

Soy consciente de que Internet está lleno de toneladas de tutoriales para el manejo de formularios, y casi todos ellos no hacen más que verificar el nombre y el valor de un botón de envío. ¡Pero, simplemente están equivocados!

cabra
fuente
1
Gracias por la información adicional sobre asumir un botón predeterminado ... fácil de pasar por alto.
kad81
¿Por qué esto usa else en lugar de else if?
Buts
@Gorg más si qué? ¿Para qué probarías y por qué?
Cabra
@goat ¿Sería más seguro especificar que definitivamente se ha hecho clic en btnSubmit? ¿Podría el usuario cambiar el valor del botón y enviar datos diferentes?
Buts
2
@Gorg, si está hablando de un usuario que está tratando de engañarlo, no hay nada que pueda hacer para detenerlo. Esta es una realidad que debe aceptar con la programación cliente / servidor: el cliente puede enviarle fácilmente los datos que desee. Es común que el almacenamiento del lado del servidor del usuario (por ejemplo, sesiones del lado del servidor) almacene datos que no desea que el usuario pueda manipular.
cabra
14

En HTML:

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

En PHP:

if (isset($_POST["btnSubmit"])){
  // "Save Changes" clicked
} else if (isset($_POST["btnDelete"])){
  // "Delete" clicked
}
MiffTheFox
fuente
4
Lo siento, tengo que votar en contra. Los manipuladores de formularios que se portan mal al usar la tecla Intro para enviar son un motivo de preocupación para mí.
cabra
4
@chris - Está bien, tienes un punto perfectamente válido. Votó a favor su respuesta.
MiffTheFox
1

Todo lo que necesita para dar el atributo de nombre a cada botón. Y debe abordar cada pulsación de botón desde el script PHP. Pero tenga cuidado de darle a cada botón un nombre único. Porque el script PHP solo se ocupa del nombre la mayor parte del tiempo

<input type="submit" name="Submit_this" id="This" />
Kavishka Hirushan
fuente
-2

¿Está preguntando en php o javascript.

Si está en php, dé el nombre de eso y use el método post u get, después de eso puede usar la opción de isset o ese nombre de botón en particular está marcado con ese valor.

Si está en js, use getElementById para eso

Karthik
fuente