En esta lección se muestra la base de una aplicación que vende o compra.
Para poder manejar compras en línea, es necesario que la venta incluya la referencia al cliente.
Puedes probar el ejemplo en http://srvcompras.rf.gd/.
Prueba el ejemplo en http://srvcompras.rf.gd/.
Descarga el archivo /src/srvcompras.zip y descompáctalo.
Crea una cuenta de email pqra ti, por ejemplo, pepito@google.com. Si ya tienes un email, omite este paso.
Crea una cuenta de GitHub usando el email anterior y selecciona el nombre de usuario unsando la parte inicial del correo electrónico, por ejemplo pepito. Si ya tienes una cuenta, omite este paso.
Crea un repositorio nuevo. En el nombre del repositorio debes poner el nombre de tu sitio; por ejemplo devuelvejson
Edita los archivos que desees.
Prueba tu sitio localmente.
Necesitas un hosting. En este ejemplo se muestra como usar el hosting. https://infinityfree.com/ Si no lo has usado, lo primero que tienes que hacer es entrar a registrar tu email con el botón Registrar. Si ya tienes tu email registrado, omite este paso.
Crea una cuenta. Si ya tienes cuenta, entra a ella y crea un nuevo domino. En este ejemplo no se crean los archivos directamente en el hosting.
Sube tus archivos a GitHub. En este ejemplo no hay archivo sw.js ni necesitas esperar 11 o más minutos.
Prueba el ejemplo en http://srvcompras.rf.gd/.
Descarga el archivo /src/srvcompras.zip y descompáctalo.
Crea tu proyecto en GitHub:
Crea una cuenta de email para tí, por ejemplo, pepito@google.com. Si ya tienes un email, omite este paso.
Crea una cuenta de GitHub usando el email anterior y selecciona el nombre de usuario unsando la parte inicial del correo electrónico, por ejemplo pepito. Si ya tienes una cuenta, omite este paso.
Crea un repositorio nuevo. En la página principal de GitHub cliquea 📘 New.
En la página Create a new repository introduce los siguientes datos:
Proporciona el nombre de tu repositorio debajo de donde dice Repository name *.
Mantén la selección Public para que otros usuarios puedan ver tu proyecto.
Verifica la casilla Add a README file. En este archivo se muestra información sobre tu proyecto.
Cliquea License: None. y selecciona la licencia que consideres más adecuada para tu proyecto.
Cliquea Create repository.
Importa el proyecto en GitHub:
En la página principal de tu proyecto en GitHub, en la pestaña < > Code, cliquea < > Code y en la sección Branches y copia la dirección que está en HTTPS, debajo de Clone.
En Visual Studio Code, usa el botón de la izquierda para Source Control.
Cliquea el botón Clone Repository.
Pega la url que copiaste anteriormente hasta arriba, donde dice algo como Provide repository URL y presiona la teclea Intro.
Selecciona la carpeta donde se guardará la carpeta del proyecto.
Abre la carpeta del proyecto importado.
Añade el contenido de la carpeta descompactada que contiene el código del ejemplo.
Edita los archivos que desees.
Haz clic derecho en index.html
, selecciona
PHP Server: serve project y se abre el navegador para que puedas
probar localmente el ejemplo.
Para depurar paso a paso haz lo siguiente:
En el navegador, haz clic derecho en la página que deseas depurar y selecciona inspeccionar.
Recarga la página, de preferencia haciendo clic derecho en el ícono de
volver a cargar la página
y
seleccionando vaciar caché y volver a cargar de manera forzada (o
algo parecido). Si no aparece un menú emergente, simplemente cliquea
volver a cargar la página
.
Revisa que no aparezca ningún error ni en la pestañas Consola, ni
en Red.
Selecciona la pestaña Fuentes (o Sources si tu navegador está en Inglés).
Selecciona el archivo donde vas a empezar a depurar.
Haz clic en el número de la línea donde vas a empezar a depurar.
En Visual Studio Code, abre el archivo de PHP donde vas a empezar a depurar.
Haz clic en Run and Debug
.
Si no está configurada la depuración, haz clic en create a launch json file.
Haz clic en la flechita RUN AND DEBUG, al lado de la cual debe
decir Listen for Xdebug
.
Aparece un cuadro con los controles de depuración
Selecciona otra vez el archivo de PHP y haz clic en el número de la línea donde vas a empezar a depurar.
Regresa al navegador, recarga la página y empieza a usarla.
Si se ejecuta alguna de las líneas de código seleccionadas, aparece resaltada en la pestaña de fuentes. Usa los controles de depuración para avanzar, como se muestra en este video.
Sube el proyecto al hosting que elijas.
Crea una nueva carpeta para crear un nuevo proyecto que estará conectado directamente al servidor web por ftp.
Abre la nueva carpeta con Visual Studio Code.
Tecle al mismo Mayúsculas+Control+P y selecciona SFTP: Config. Aparece un archivo de configuración de FTP. Llena los datos con la configuración de FTP de tu servidor, excepto la contraseña.
Cliquea el botón de SFTP y luego haz clic en la URL de tu servidos. En la barra superior te pide la contraseña y ENTER.
Pásate a la parte de archivos y coloca tus archivos.
Cliquea con el botón derecho en la sección de archivos y selecciona Sync: Local -> Remote.
Abre un navegador y prueba el proyecto en tu hosting.
En el hosting InfinityFree, la primera vez que corres la página, puede marcar un mensaje de error, pero al recargar funciona correctamente. Puedes evitar este problema usando un dominio propio.
Para subir el código a GitHub, en la sección de SOURCE CONTROL, en Message introduce un mensaje sobre los cambios que hiciste, por ejemplo index.html corregido, selecciona v y luego Commit & Push.
Haz clic en los triángulos para expandir las carpetas
| 1 | <!DOCTYPE html> |
| 2 | <html lang="es"> |
| 3 | |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="UTF-8"> |
| 7 | <meta name="viewport" content="width=device-width"> |
| 8 | |
| 9 | <title>Productos</title> |
| 10 | |
| 11 | <script type="module" src="js/lib/manejaErrores.js"></script> |
| 12 | |
| 13 | </head> |
| 14 | |
| 15 | <body> |
| 16 | |
| 17 | <h1>Productos</h1> |
| 18 | |
| 19 | <p><a href="carrito.html">Ver carrito</a></p> |
| 20 | |
| 21 | <dl id="lista"> |
| 22 | <dt>Cargando…</dt> |
| 23 | <dd><progress max="100">Cargando…</progress></dd> |
| 24 | </dl> |
| 25 | |
| 26 | <script type="module"> |
| 27 | |
| 28 | import { descargaVista } from "./js/lib/descargaVista.js" |
| 29 | |
| 30 | descargaVista("php/vista-index.php") |
| 31 | |
| 32 | </script> |
| 33 | |
| 34 | </body> |
| 35 | |
| 36 | </html> |
| 1 | <!DOCTYPE html> |
| 2 | <html lang="es"> |
| 3 | |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="UTF-8"> |
| 7 | <meta name="viewport" content="width=device-width"> |
| 8 | |
| 9 | <title>Agregar</title> |
| 10 | |
| 11 | <script type="module" src="js/lib/manejaErrores.js"></script> |
| 12 | </head> |
| 13 | |
| 14 | <body> |
| 15 | |
| 16 | <form id="formulario"> |
| 17 | |
| 18 | <h1>Agregar</h1> |
| 19 | |
| 20 | <p><a href="index.html">Cancelar</a></p> |
| 21 | |
| 22 | <input type="hidden" name="id"> |
| 23 | |
| 24 | <p> |
| 25 | <label> |
| 26 | Producto |
| 27 | <output name="producto"> |
| 28 | <progress max="100">Cargando…</progress> |
| 29 | </output> |
| 30 | </label> |
| 31 | </p> |
| 32 | |
| 33 | <p> |
| 34 | <label> |
| 35 | Precio |
| 36 | <output name="precio"> |
| 37 | <progress max="100">Cargando…</progress> |
| 38 | </output> |
| 39 | </label> |
| 40 | </p> |
| 41 | |
| 42 | <p> |
| 43 | <label> |
| 44 | Cantidad * |
| 45 | <input name="cantidad" type="number" min="0" step="0.01"> |
| 46 | </label> |
| 47 | </p> |
| 48 | |
| 49 | <p>* Obligatorio</p> |
| 50 | |
| 51 | <p><button type="submit">Agregar</button></p> |
| 52 | |
| 53 | </form> |
| 54 | |
| 55 | <script type="module"> |
| 56 | |
| 57 | import { descargaVista } from "./js/lib/descargaVista.js" |
| 58 | import { submitAccion } from "./js/lib/submitAccion.js" |
| 59 | |
| 60 | const params = new URL(location.href).searchParams |
| 61 | descargaDatos() |
| 62 | |
| 63 | async function descargaDatos() { |
| 64 | |
| 65 | if (params.size > 0) { |
| 66 | |
| 67 | await descargaVista("php/vista-agrega.php?" + params) |
| 68 | |
| 69 | formulario.addEventListener( |
| 70 | "submit", |
| 71 | event => submitAccion( |
| 72 | event, "php/det-venta-agrega.php", formulario, "index.html" |
| 73 | ) |
| 74 | ) |
| 75 | |
| 76 | } |
| 77 | |
| 78 | } |
| 79 | |
| 80 | </script> |
| 81 | |
| 82 | </body> |
| 83 | |
| 84 | </html> |
| 1 | <!DOCTYPE html> |
| 2 | <html lang="es"> |
| 3 | |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="UTF-8"> |
| 7 | <meta name="viewport" content="width=device-width"> |
| 8 | |
| 9 | <title>Carrito</title> |
| 10 | |
| 11 | <script type="module" src="js/lib/manejaErrores.js"></script> |
| 12 | |
| 13 | </head> |
| 14 | |
| 15 | <body> |
| 16 | |
| 17 | <h1>Carrito</h1> |
| 18 | |
| 19 | <p> |
| 20 | |
| 21 | <a href="index.html">Productos</a> |
| 22 | |
| 23 | <button id="botonProcesar" type='button'> |
| 24 | Procesar compra |
| 25 | </button> |
| 26 | |
| 27 | </p> |
| 28 | |
| 29 | <p> |
| 30 | <label> |
| 31 | Folio |
| 32 | <output id="folio"> |
| 33 | <progress max="100">Cargando…</progress> |
| 34 | </output> |
| 35 | </label> |
| 36 | </p> |
| 37 | |
| 38 | <fieldset> |
| 39 | |
| 40 | <legend>Detalle</legend> |
| 41 | |
| 42 | <dl id="detalles"> |
| 43 | <dt>Cargando…</dt> |
| 44 | <dd><progress max="100">Cargando…</progress></dd> |
| 45 | </dl> |
| 46 | |
| 47 | </fieldset> |
| 48 | |
| 49 | <script type="module"> |
| 50 | |
| 51 | import { descargaVista } from "./js/lib/descargaVista.js" |
| 52 | import { consume } from "./js/lib/consume.js" |
| 53 | import { recibeJson } from "./js/lib/recibeJson.js" |
| 54 | |
| 55 | const params = new URL(location.href).searchParams |
| 56 | descargaDatos() |
| 57 | |
| 58 | async function descargaDatos() { |
| 59 | await descargaVista("php/vista-carrito.php") |
| 60 | botonProcesar.addEventListener("click", procesa) |
| 61 | } |
| 62 | |
| 63 | async function procesa() { |
| 64 | if (confirm('Confirma procesar')) { |
| 65 | await consume(recibeJson('php/venta-en-captura-procesa.php')) |
| 66 | location.href = 'index.html' |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | </script> |
| 71 | |
| 72 | </body> |
| 73 | |
| 74 | </html> |
| 1 | <!DOCTYPE html> |
| 2 | <html lang="es"> |
| 3 | |
| 4 | <head> |
| 5 | |
| 6 | <meta charset="UTF-8"> |
| 7 | <meta name="viewport" content="width=device-width"> |
| 8 | |
| 9 | <title>Modificar</title> |
| 10 | |
| 11 | <script type="module" src="js/lib/manejaErrores.js"></script> |
| 12 | |
| 13 | </head> |
| 14 | |
| 15 | <body> |
| 16 | |
| 17 | <form id="formulario"> |
| 18 | |
| 19 | <h1>Modificar</h1> |
| 20 | |
| 21 | <p><a href="carrito.html">Cancelar</a></p> |
| 22 | |
| 23 | <input type="hidden" name="prodId"> |
| 24 | |
| 25 | <p> |
| 26 | <label> |
| 27 | Producto |
| 28 | <output name="prodNombre"> |
| 29 | <progress max="100">Cargando…</progress> |
| 30 | </output> |
| 31 | </label> |
| 32 | </p> |
| 33 | |
| 34 | <p> |
| 35 | <label> |
| 36 | Precio |
| 37 | <output name="precio"> |
| 38 | <progress max="100">Cargando…</progress> |
| 39 | </output> |
| 40 | </label> |
| 41 | </p> |
| 42 | |
| 43 | <p> |
| 44 | <label> |
| 45 | Cantidad * |
| 46 | <input name="cantidad" type="number" min="0" step="0.01"> |
| 47 | </label> |
| 48 | </p> |
| 49 | |
| 50 | <p>* Obligatorio</p> |
| 51 | |
| 52 | <p> |
| 53 | |
| 54 | <button type="submit">Guardar</button> |
| 55 | |
| 56 | <button id="botonEliminar" type="button"> |
| 57 | Eliminar |
| 58 | </button> |
| 59 | |
| 60 | </p> |
| 61 | |
| 62 | </form> |
| 63 | |
| 64 | <script type="module"> |
| 65 | |
| 66 | import { descargaVista } from "./js/lib/descargaVista.js" |
| 67 | import { submitAccion } from "./js/lib/submitAccion.js" |
| 68 | import { accionElimina } from "./js/lib/accionElimina.js" |
| 69 | |
| 70 | const params = new URL(location.href).searchParams |
| 71 | descargaDatos() |
| 72 | |
| 73 | async function descargaDatos() { |
| 74 | |
| 75 | if (params.size > 0) { |
| 76 | |
| 77 | await descargaVista("php/vista-modifica.php?" + params) |
| 78 | |
| 79 | formulario.addEventListener( |
| 80 | "submit", |
| 81 | event => submitAccion( |
| 82 | event, "php/det-venta-modifica.php", formulario, "carrito.html" |
| 83 | ) |
| 84 | ) |
| 85 | |
| 86 | botonEliminar.addEventListener( |
| 87 | "click", |
| 88 | () => accionElimina( |
| 89 | "php/det-venta-elimina.php", |
| 90 | formulario, |
| 91 | "Confirma la eliminación", |
| 92 | "carrito.html" |
| 93 | ) |
| 94 | ) |
| 95 | |
| 96 | } |
| 97 | |
| 98 | } |
| 99 | |
| 100 | </script> |
| 101 | |
| 102 | </body> |
| 103 | |
| 104 | </html> |
| 1 | <?php |
| 2 | |
| 3 | require_once __DIR__ . "/ventaEnCapturaAgrega.php"; |
| 4 | |
| 5 | class Bd |
| 6 | { |
| 7 | |
| 8 | private static ?PDO $pdo = null; |
| 9 | |
| 10 | public static function pdo(): PDO |
| 11 | { |
| 12 | if (self::$pdo === null) { |
| 13 | self::$pdo = new PDO( |
| 14 | // cadena de conexión |
| 15 | "sqlite:" . __DIR__ . "/srvcompras.db", |
| 16 | // usuario |
| 17 | null, |
| 18 | // contraseña |
| 19 | null, |
| 20 | // Opciones: pdos no persistentes y lanza excepciones. |
| 21 | [PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] |
| 22 | ); |
| 23 | |
| 24 | self::$pdo->exec( |
| 25 | 'CREATE TABLE IF NOT EXISTS VENTA ( |
| 26 | VENT_ID INTEGER, |
| 27 | VENT_EN_CAPTURA INTEGER NOT NULL, |
| 28 | CONSTRAINT VENT_PK |
| 29 | PRIMARY KEY(VENT_ID) |
| 30 | )' |
| 31 | ); |
| 32 | self::$pdo->exec( |
| 33 | 'CREATE TABLE IF NOT EXISTS PRODUCTO ( |
| 34 | PROD_ID INTEGER, |
| 35 | PROD_NOMBRE TEXT NOT NULL, |
| 36 | PROD_EXISTENCIAS REAL NOT NULL, |
| 37 | PROD_PRECIO REAL NOT NULL, |
| 38 | CONSTRAINT PROD_PK |
| 39 | PRIMARY KEY(PROD_ID), |
| 40 | CONSTRAINT PROD_NOM_UNQ |
| 41 | UNIQUE(PROD_NOMBRE), |
| 42 | CONSTRAINT PROD_NOM_NV |
| 43 | CHECK(LENGTH(PROD_NOMBRE) > 0) |
| 44 | )' |
| 45 | ); |
| 46 | self::$pdo->exec( |
| 47 | 'CREATE TABLE IF NOT EXISTS DET_VENTA ( |
| 48 | VENT_ID INTEGER NOT NULL, |
| 49 | PROD_ID INTEGER NOT NULL, |
| 50 | DTV_CANTIDAD REAL NOT NULL, |
| 51 | DTV_PRECIO REAL NOT NULL, |
| 52 | CONSTRAINT DTV_PK |
| 53 | PRIMARY KEY (VENT_ID, PROD_ID), |
| 54 | CONSTRAINT DTV_VENT_FK |
| 55 | FOREIGN KEY (VENT_ID) REFERENCES VENTA(VENT_ID), |
| 56 | CONSTRAINT DTV_PROD_FK |
| 57 | FOREIGN KEY (PROD_ID) REFERENCES PRODUCTO(PROD_ID) |
| 58 | )' |
| 59 | ); |
| 60 | |
| 61 | $cantidadDeProductos = |
| 62 | self::$pdo->query("SELECT COUNT(PROD_ID) FROM PRODUCTO")->fetchColumn(0); |
| 63 | |
| 64 | if ($cantidadDeProductos === 0) { |
| 65 | self::$pdo->exec( |
| 66 | "INSERT INTO PRODUCTO |
| 67 | (PROD_NOMBRE, PROD_EXISTENCIAS, PROD_PRECIO) |
| 68 | VALUES |
| 69 | ('Sandwich', 50, 15), |
| 70 | ('Hot dog', 40, 30), |
| 71 | ('Hamburguesa', 30, 40)" |
| 72 | ); |
| 73 | } |
| 74 | |
| 75 | $cantidadDeVentas = |
| 76 | self::$pdo->query("SELECT COUNT(VENT_ID) FROM VENTA")->fetchColumn(0); |
| 77 | |
| 78 | if ($cantidadDeVentas === 0) { |
| 79 | ventaEnCapturaAgrega(self::$pdo); |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | return self::$pdo; |
| 84 | } |
| 85 | } |
| 86 |
| 1 | <?php |
| 2 | |
| 3 | require_once __DIR__ . "/lib/manejaErrores.php"; |
| 4 | require_once __DIR__ . "/lib/recibeEnteroObligatorio.php"; |
| 5 | require_once __DIR__ . "/lib/recibeFlotanteObligatorio.php"; |
| 6 | require_once __DIR__ . "/lib/validaEntidadObligatoria.php"; |
| 7 | require_once __DIR__ . "/lib/devuelveCreated.php"; |
| 8 | require_once __DIR__ . "/Bd.php"; |
| 9 | require_once __DIR__ . "/productoBusca.php"; |
| 10 | require_once __DIR__ . "/ventaEnCapturaBusca.php"; |
| 11 | |
| 12 | |
| 13 | $prodId = recibeEnteroObligatorio("id"); |
| 14 | $cantidad = recibeFlotanteObligatorio("cantidad"); |
| 15 | |
| 16 | $bd = Bd::pdo(); |
| 17 | |
| 18 | $producto = productoBusca($bd, $prodId); |
| 19 | $producto = validaEntidadObligatoria("Producto", $producto); |
| 20 | |
| 21 | $venta = ventaEnCapturaBusca($bd); |
| 22 | $venta = validaEntidadObligatoria("Venta en captura", $venta); |
| 23 | |
| 24 | $stmt = $bd->prepare( |
| 25 | "INSERT INTO DET_VENTA ( |
| 26 | VENT_ID, PROD_ID, DTV_CANTIDAD, DTV_PRECIO |
| 27 | ) values ( |
| 28 | :VENT_ID, :PROD_ID, :DTV_CANTIDAD, :DTV_PRECIO |
| 29 | )" |
| 30 | ); |
| 31 | $stmt->execute([ |
| 32 | ":VENT_ID" => $venta["VENT_ID"], |
| 33 | ":PROD_ID" => $prodId, |
| 34 | ":DTV_CANTIDAD" => $cantidad, |
| 35 | ":DTV_PRECIO" => $producto["PROD_PRECIO"], |
| 36 | ]); |
| 37 | |
| 38 | $encodeProdId = urlencode($prodId); |
| 39 | devuelveCreated("/php/vista-modifica.php?id=$encodeProdId", [ |
| 40 | "prodId" => ["value" => $prodId], |
| 41 | "prodNombre" => ["value" => $producto["PROD_NOMBRE"]], |
| 42 | "precio" => ["value" => "$" . number_format($producto["PROD_PRECIO"], 2)], |
| 43 | "cantidad" => ["valueAsNumber" => $cantidad], |
| 44 | ]); |
| 45 |
| 1 | <?php |
| 2 | |
| 3 | require_once __DIR__ . "/lib/manejaErrores.php"; |
| 4 | require_once __DIR__ . "/lib/recibeEnteroObligatorio.php"; |
| 5 | require_once __DIR__ . "/lib/devuelveNoContent.php"; |
| 6 | require_once __DIR__ . "/Bd.php"; |
| 7 | require_once __DIR__ . "/ventaEnCapturaBusca.php"; |
| 8 | |
| 9 | $prodId = recibeEnteroObligatorio("prodId"); |
| 10 | |
| 11 | $bd = Bd::pdo(); |
| 12 | |
| 13 | $venta = ventaEnCapturaBusca($bd); |
| 14 | if ($venta !== false) { |
| 15 | $stmt = $bd->prepare( |
| 16 | "DELETE FROM DET_VENTA WHERE VENT_ID = :VENT_ID AND PROD_ID = :PROD_ID" |
| 17 | ); |
| 18 | $stmt->execute([":VENT_ID" => $venta["VENT_ID"], ":PROD_ID" => $prodId]); |
| 19 | } |
| 20 | devuelveNoContent(); |
| 21 |
| 1 | <?php |
| 2 | |
| 3 | require_once __DIR__ . "/lib/manejaErrores.php"; |
| 4 | require_once __DIR__ . "/lib/recibeEnteroObligatorio.php"; |
| 5 | require_once __DIR__ . "/lib/recibeFlotanteObligatorio.php"; |
| 6 | require_once __DIR__ . "/lib/validaEntidadObligatoria.php"; |
| 7 | require_once __DIR__ . "/lib/devuelveJson.php"; |
| 8 | require_once __DIR__ . "/Bd.php"; |
| 9 | require_once __DIR__ . "/productoBusca.php"; |
| 10 | require_once __DIR__ . "/ventaEnCapturaBusca.php"; |
| 11 | |
| 12 | $prodId = recibeEnteroObligatorio("prodId"); |
| 13 | $cantidad = recibeFlotanteObligatorio("cantidad"); |
| 14 | |
| 15 | $bd = Bd::pdo(); |
| 16 | |
| 17 | $producto = productoBusca($bd, $prodId); |
| 18 | $producto = validaEntidadObligatoria("Producto", $producto); |
| 19 | |
| 20 | $venta = ventaEnCapturaBusca($bd); |
| 21 | $venta = validaEntidadObligatoria("Venta en captura", $venta); |
| 22 | |
| 23 | $stmt = $bd->prepare( |
| 24 | "UPDATE DET_VENTA |
| 25 | SET |
| 26 | DTV_CANTIDAD = :DTV_CANTIDAD, |
| 27 | DTV_PRECIO = :DTV_PRECIO |
| 28 | WHERE |
| 29 | VENT_ID = :VENT_ID |
| 30 | AND PROD_ID = :PROD_ID" |
| 31 | ); |
| 32 | $stmt->execute([ |
| 33 | ":DTV_CANTIDAD" => $cantidad, |
| 34 | ":DTV_PRECIO" => $producto["PROD_PRECIO"], |
| 35 | ":VENT_ID" => $venta["VENT_ID"], |
| 36 | ":PROD_ID" => $prodId |
| 37 | ]); |
| 38 | |
| 39 | devuelveJson([ |
| 40 | "prodId" => ["value" => $prodId], |
| 41 | "prodNombre" => ["value" => $producto["PROD_NOMBRE"]], |
| 42 | "precio" => ["value" => "$" . number_format($producto["PROD_PRECIO"], 2)], |
| 43 | "cantidad" => ["valueAsNumber" => $cantidad], |
| 44 | ]); |
| 45 |
| 1 | <?php |
| 2 | |
| 3 | function detVentaConsulta(\PDO $bd, int $ventaId) |
| 4 | { |
| 5 | $stmt = $bd->prepare( |
| 6 | "SELECT |
| 7 | DV.PROD_ID, |
| 8 | P.PROD_NOMBRE, |
| 9 | P.PROD_EXISTENCIAS, |
| 10 | P.PROD_PRECIO, |
| 11 | DV.DTV_CANTIDAD, |
| 12 | DV.DTV_PRECIO |
| 13 | FROM DET_VENTA DV, PRODUCTO P |
| 14 | WHERE |
| 15 | DV.PROD_ID = P.PROD_ID |
| 16 | AND DV.VENT_ID = :VENT_ID |
| 17 | ORDER BY P.PROD_NOMBRE" |
| 18 | ); |
| 19 | $stmt->execute([":VENT_ID" => $ventaId]); |
| 20 | $lista = $stmt->fetchAll(PDO::FETCH_ASSOC); |
| 21 | return $lista; |
| 22 | } |
| 23 |
| 1 | <?php |
| 2 | |
| 3 | function productoBusca(\PDO $bd, int $prodId) |
| 4 | { |
| 5 | $stmt = $bd->prepare("SELECT * FROM PRODUCTO WHERE PROD_ID = :PROD_ID"); |
| 6 | $stmt->execute([":PROD_ID" => $prodId]); |
| 7 | $modelo = $stmt->fetch(PDO::FETCH_ASSOC); |
| 8 | return $modelo; |
| 9 | } |
| 10 |
| 1 | SQLite format 3 @ .�*
O � W
��
{ �,�'tableDET_VENTADET_VENTACREATE TABLE DET_VENTA ( |
| 2 | VENT_ID INTEGER NOT NULL, |
| 3 | PROD_ID INTEGER NOT NULL, |
| 4 | DTV_CANTIDAD REAL NOT NULL, |
| 5 | DTV_PRECIO REAL NOT NULL, |
| 6 | CONSTRAINT DTV_PK |
| 7 | PRIMARY KEY (VENT_ID, PROD_ID), |
| 8 | CONSTRAINT DTV_VENT_FK |
| 9 | FOREIGN KEY (VENT_ID) REFERENCES VENTA(VENT_ID), |
| 10 | CONSTRAINT DTV_PROD_FK |
| 11 | FOREIGN KEY (PROD_ID) REFERENCES PRODUCTO(PROD_ID) |
| 12 | )1E indexsqlite_autoindex_DET_VENTA_1DET_VENTA�m�-tablePRODUCTOPRODUCTOCREATE TABLE PRODUCTO ( |
| 13 | PROD_ID INTEGER, |
| 14 | PROD_NOMBRE TEXT NOT NULL, |
| 15 | PROD_EXISTENCIAS REAL NOT NULL, |
| 16 | PROD_PRECIO REAL NOT NULL, |
| 17 | CONSTRAINT PROD_PK |
| 18 | PRIMARY KEY(PROD_ID), |
| 19 | CONSTRAINT PROD_NOM_UNQ |
| 20 | UNIQUE(PROD_NOMBRE), |
| 21 | CONSTRAINT PROD_NOM_NV |
| 22 | CHECK(LENGTH(PROD_NOMBRE) > 0) |
| 23 | )/C indexsqlite_autoindex_PRODUCTO_1PRODUCTO �&�+tableVENTAVENTACREATE TABLE VENTA ( |
| 24 | VENT_ID INTEGER, |
| 25 | VENT_EN_CAPTURA INTEGER NOT NULL, |
| 26 | CONSTRAINT VENT_PK |
| 27 | PRIMARY KEY(VENT_ID) |
| 28 | ) � �� � ��� #Hamburguesa( Hot dog$ Sandwich0 |
| 29 |