Cómo conectar un botón HTML con un método de un objeto php

Un alumno de un curso de PHP Orientado a Objetos me hizo esta pregunta:

Necesito hacer que un botón o link de mi HTML ejecute un método de un objeto php.

Intenté lo siguiente pero sin éxito:
<a href=»<?php $objeto->Método() ?>»> Reservar </a>
La pregunta encerraba una confusión respecto del modelo de ejecución de PHP. Revisemos un poco

Cuál es el modelo de ejecución de PHP

Lo primero que hay que entender para responder esta pregunta es el ciclo de vida de una petición a una aplicación (o página) PHP.

Recordemos que PHP es un lenguaje pensado (al menos originalmente) para generar código HTML en forma dinámica sin recurrir a complicados mecanismos tipo CGI.

HTML es la salida por defecto de PHP cuando se ejecuta como módulo de algún servidor web (Apache por ejemplo)… HTML porque eso es lo que los navegadores (FireFox, Chrome, etc…) interpretan para mostrar los resultados a los visitantes (El uso más común de una aplicación web).

Una vez el HTML está generado es enviado al cliente, el cual, al recibirlo lo procesa para dibujar la página correspondiente.

Más gráficamente:

(Diapositiva extraída del curso de Introducción a PHP)

Cuál es el problema

Al escribir <a href="<?php $objeto->Método() ?>"> Reservar </a> en un único archivo PHP se está generando un html del tipo:

<a href="XXX"> Reservar </a>

Donde lo que está en rojo  es la salida del método $objeto->Metodo(). 

Por ejemplo, si $objeto->Metodo() tiene una definición como esta: 
function Metodo()
{
   echo "reservar.php";
}
Lo que vas a ver en el HTML es 
<a href="reservar.php"> Reservar </a>

Podés chequearlo accediendo al código fuente de la página que recibís cuando ingresás a la URL que estás probando (Apretando CTRL+U en tu navegador).

El problema es que, al momento de hacer click en el link el método ya se ejecutó… ¡precisamente para generar el link!

Cómo se soluciona el problema

Una solución pasa por tener dos archivos php diferentes:

  1. Uno para mostrar el botón
  2. Otro para ejecutar el método
De hecho, el primer archivo podría ser puro HTML (Depende de lo que vayas a querer hacer).
El segundo será seguramente el que efectivamente haga la reserva (Guardando en la base de datos o lo que sea).
 
En definitiva, el HTML sería algo como:
<a href="reservar.php?id=1"> Reservar </a>

Y el php (reservar.php) sería algo como:

<?php

$objeto = new Clase();
$objeto->Metodo( $_GET['id'] );

De esta forma el método se ejecutará como respuesta al click sobre el enlace.

Esta confusión es muy común cuando uno empieza a programar para la web… hay que acostumbrarse a pensar en diferentes ambientes/momentos de ejecución (Es un poco como cuando el Doc Brown le decía a Marty que no estaba pensando «en la cuarta dimensión» :)).

Es cuestión de acostumbrarse nomás… ni qué hablar si agregamos la parte que se ejecuta del lado de la base de datos!

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

4 comentarios

  1. Para evitar ataques de CORS (que una web cualquiera pueda tener oculto el link a «reservar.php?id=1» y ejecutarte una acción sin tu permiso) es siempre mejor pasar la data «id=1» via POST. Eso requiere tener un par de líneas mas en JS, pero es fundamentalmente mas seguro

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.