php

PHP: compra de productos con formulario (ejercicio resuelto)

El día de hoy vamos a resolver un ejercicio de programación en PHP. Se trata de simular la compra de productos a través de un formulario y luego mostrar el total.

Es un ejercicio de programación para aprender más sobre este lenguaje. La solicitud dice:

Realizar una página web dinámica con PHP que simule la compra de varios productos de una tiendita a través de un formulario web.

  • Solicitar el nombre de 5 productos (cuadros de textos).
  • Solicitar la marca de cada producto (desplegables).
  • Solicitar el precio de cada producto (cuadros de número)
  • El formulario tendrá los botones de enviar y reset
  • Al presionar el botón de envío, el programa calculará la suma de los productos (subtotal), el IVA y el total de la compra (Subtotal + IVA)

Vamos a hacerlo dibujando el formulario de manera dinámica y recibiéndolo igualmente en el servidor.

Dibujando formulario con PHP

Solicitar datos de 5 productos con PHP – Ejercicio de programación resuelto

Primero veamos cómo solicitar los datos de los 5 productos con PHP (nombre, marca y precio).

Para eso simplemente hacemos un ciclo y en cada paso dibujamos los input (todos dentro del mismo form):

<form action-xhr="#" method="post">
    <?php
    $cantidadProductos = 5;
    ?>
    <?php for ($i = 0; $i < 5; $i++) { ?>
        <p>Producto <?php echo $i + 1 ?></p>
        <label for="">Nombre: </label>
        <input type="text" name="nombres[]" required>
        <label for="">Marca:</label>
        <select name="marcas[]" required>
            <option selected value="Marca 1">Marca 1</option>
            <option value="Marca 2">Marca 2</option>
            <option value="Marca 3">Marca 3</option>
        </select>
        <label for="">Precio:</label>
        <input type="number" name="precios[]" required>
        <br>
    <?php } ?>
    <br>
    <input type="submit">
    <input type="reset">
</form>

Fíjate en que el formulario tiene el action vacío, por lo que al enviarlo se enviará a la misma página en la que se está mostrando (es decir, el formulario y el manejo del mismo están en el mismo archivo).

Otra cosa importante es que en el name de los elementos estamos usando [] al final, esto quiere decir que cada campo del formulario será enviado como arreglo.

Nota: para enviar y resetear el formulario tenemos los input type submit y reset respectivamente.

Diferenciar entre ver página o procesar formulario

Debido a que el formulario y el procesamiento está en el mismo script de PHP necesitamos diferenciar si se quiere ejecutar el script o procesar el formulario.

Cuando visitamos la página del script desde el navegador estamos haciendo una petición GET, pero cuando el formulario es enviado hace una petición POST.

Nota: si quisieras podrías separar los archivos y procesar el formulario en, por ejemplo, procesar.php mientras que muestras el formulario en productos.php.

Para diferenciar podemos leer la clave REQUEST_METHOD del arreglo superglobal $_SERVER.

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    # Ok, es una petición POST
}

Procesar formulario

Ahora veamos cómo procesar el formulario y mostrar IVA, total, etcétera. Simplemente vamos a hacer un ciclo for desde 1 hasta la cantidad de elementos y extraer el valor de cada arreglo según su índice.

<?php
$nombres = $_POST["nombres"];
$marcas = $_POST["marcas"];
$precios = $_POST["precios"];
$subtotal = 0;
for ($i = 0; $i < count($nombres); $i++) {
    $nombre = $nombres[$i];
    $marca = $marcas[$i];
    $precio = floatval($precios[$i]);
    $subtotal += $precio;
    printf("%s ($%s) marca %s<br>", $nombre, number_format($precio, 2), $marca);
}
$porcentajeIva = 0.16;
$iva = $subtotal * $porcentajeIva;
$total = $subtotal + $iva;

echo "<br><strong>Subtotal: </strong>$" . number_format($subtotal, 2) . "<br>";
echo "<strong>IVA: </strong>$" . number_format($iva, 2) . "<br>";
echo "<strong>TOTAL: </strong>$" . number_format($total, 2) . "<br>";
echo "<br><a href=''>Volver al formulario</a>";
exit;

El subtotal es la suma de todos los precios, luego se le aumenta el IVA (o impuesto) sacando el porcentaje de aumento y finalmente el total es la suma del subtotal y el IVA.

En este caso el IVA está en el 16 % pues así es en mi país, tú puedes cambiar ese porcentaje.

Nota: fíjate en el exit al final. Eso es para detener la ejecución del código y es necesario porque estoy usando el mismo archivo para ambas cosas y así prevengo que se vuelva a mostrar el formulario cuando lo estoy procesando.

Poniendo todo junto

Recibo de compra con PHP en ejercicio resuelto – Subtotal, IVA y total

El código completo queda como se ve a continuación. La salida ya la has visto en las imágenes anteriores.

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nombres = $_POST["nombres"];
    $marcas = $_POST["marcas"];
    $precios = $_POST["precios"];
    $subtotal = 0;
    for ($i = 0; $i < count($nombres); $i++) {
        $nombre = $nombres[$i];
        $marca = $marcas[$i];
        $precio = floatval($precios[$i]);
        $subtotal += $precio;
        printf("%s ($%s) marca %s<br>", $nombre, number_format($precio, 2), $marca);
    }
    $porcentajeIva = 0.16;
    $iva = $subtotal * $porcentajeIva;
    $total = $subtotal + $iva;

    echo "<br><strong>Subtotal: </strong>$" . number_format($subtotal, 2) . "<br>";
    echo "<strong>IVA: </strong>$" . number_format($iva, 2) . "<br>";
    echo "<strong>TOTAL: </strong>$" . number_format($total, 2) . "<br>";
    echo "<br><a href=''>Volver al formulario</a>";
    exit;
}
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Productos</title>
</head>

<body>

    <form action-xhr="#" method="post">
        <?php
        $cantidadProductos = 5;
        ?>
        <?php for ($i = 0; $i < 5; $i++) { ?>
            <p>Producto <?php echo $i + 1 ?></p>
            <label for="">Nombre: </label>
            <input type="text" name="nombres[]" required>
            <label for="">Marca:</label>
            <select name="marcas[]" required>
                <option selected value="Marca 1">Marca 1</option>
                <option value="Marca 2">Marca 2</option>
                <option value="Marca 3">Marca 3</option>
            </select>
            <label for="">Precio:</label>
            <input type="number" name="precios[]" required>
            <br>
        <?php } ?>
        <br>
        <input type="submit">
        <input type="reset">
    </form>
</body>
</html>

Por aquí te dejo más tutoriales de PHP en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

3 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

3 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

3 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

3 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

3 días hace

Solución: Apache – Server unable to read htaccess file

Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…

4 días hace

Esta web usa cookies.