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

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
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="" 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
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="" 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.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *