H. Carpeta « srv / bd »

Versión para imprimir.

1. srv / bd / bdCrea.php

1<?php
2
3function bdCrea(PDO $con)
4{
5 $con->exec(
6 'CREATE TABLE IF NOT EXISTS PASATIEMPO (
7 PAS_ID INTEGER,
8 PAS_NOMBRE TEXT NOT NULL,
9 CONSTRAINT PAS_PK
10 PRIMARY KEY(PAS_ID),
11 CONSTRAINT PAS_NOM_UNQ
12 UNIQUE(PAS_NOMBRE)
13 )'
14 );
15 $con->exec(
16 'CREATE TABLE IF NOT EXISTS AMIGO (
17 AMI_ID INTEGER,
18 AMI_NOMBRE TEXT NOT NULL,
19 PAS_ID INTEGER,
20 CONSTRAINT AMI_PK
21 PRIMARY KEY(AMI_ID),
22 CONSTRAINT AMI_NOM_UNQ
23 UNIQUE(AMI_NOMBRE)
24 CONSTRAINT AMI_PAS_FK
25 FOREIGN KEY (PAS_ID) REFERENCES PASATIEMPO(PAS_ID)
26 )'
27 );
28}
29

2. srv / bd / Bd.php

1<?php
2
3require_once __DIR__ . "/../modelo/Pasatiempo.php";
4require_once __DIR__ . "/bdCrea.php";
5require_once __DIR__ . "/pasatiempoConsulta.php";
6require_once __DIR__ . "/pasatiempoAgrega.php";
7
8class Bd
9{
10
11 private static ?PDO $conexion = null;
12
13 static function getConexion(): PDO
14 {
15 if (self::$conexion === null) {
16
17 self::$conexion = new PDO(
18 // cadena de conexión
19 "sqlite:srvauno.db",
20 // usuario
21 null,
22 // contraseña
23 null,
24 // Opciones: conexiones persistentes y lanza excepciones.
25 [PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
26 );
27
28 bdCrea(self::$conexion);
29 $pasatiempo = pasatiempoConsulta();
30 if (count($pasatiempo) === 0) {
31 $pasatiempo = new Pasatiempo(nombre: "Futbol");
32 pasatiempoAgrega($pasatiempo);
33
34 $pasatiempo = new Pasatiempo(nombre: "Videojuegos");
35 pasatiempoAgrega($pasatiempo);
36 }
37 }
38
39 return self::$conexion;
40 }
41}
42

3. srv / bd / amigoAgrega.php

1<?php
2
3require_once __DIR__ . "/../modelo/Amigo.php";
4require_once __DIR__ . "/Bd.php";
5
6function amigoAgrega(Amigo $modelo)
7{
8 $modelo->valida();
9 $con = Bd::getConexion();
10 $stmt = $con->prepare(
11 "INSERT INTO AMIGO
12 (AMI_NOMBRE, PAS_ID)
13 VALUES
14 (:nombre, :pasId)"
15 );
16 $stmt->execute([
17 ":nombre" => $modelo->nombre,
18 ":pasId" => $modelo->pasatiempo === null
19 ? null
20 : $modelo->pasatiempo->id
21 ]);
22 /* Si usas una secuencia para generar el id,
23 * pasa como parámetro de lastInsertId el
24 * nombre de dicha secuencia, debes
25 * ejecutarlo antes del INSERT y pasarle el
26 * id generado al SQL. */
27 $modelo->id = $con->lastInsertId();
28 }
29

4. srv / bd / amigoBusca.php

1<?php
2
3require_once __DIR__ . "/../modelo/Amigo.php";
4require_once __DIR__ . "/../modelo/Pasatiempo.php";
5require_once __DIR__ . "/Bd.php";
6
7function amigoBusca(int $amiId)
8{
9 $con = Bd::getConexion();
10 $stmt = $con->prepare(
11 "SELECT
12 A.AMI_ID AS amiId,
13 A.AMI_NOMBRE AS amiNombre,
14 A.PAS_ID AS pasId,
15 P.PAS_NOMBRE AS pasNombre
16 FROM AMIGO A
17 LEFT JOIN PASATIEMPO P
18 ON A.PAS_ID = P.PAS_ID
19 WHERE A.AMI_ID = :amiId"
20 );
21 $stmt->execute([":amiId" => $amiId]);
22 $stmt->setFetchMode(PDO::FETCH_OBJ);
23 $obj = $stmt->fetch();
24 if ($obj === false) {
25 return false;
26 } else {
27 $pasatiempo = $obj->pasId === null
28 ? null
29 : new Pasatiempo(nombre: $obj->pasNombre, id: $obj->pasId);
30 $amigo = new Amigo(
31 nombre: $obj->amiNombre,
32 pasatiempo: $pasatiempo,
33 id: $obj->amiId
34 );
35 return $amigo;
36 }
37}
38

5. srv / bd / amigoConsulta.php

1<?php
2
3require_once __DIR__ . "/../../lib/php/recibeFetchAll.php";
4require_once __DIR__ . "/Bd.php";
5
6function amigoConsulta()
7{
8 $con = Bd::getConexion();
9 $stmt = $con->query(
10 "SELECT
11 A.AMI_ID AS amiId,
12 A.AMI_NOMBRE AS amiNombre,
13 P.PAS_NOMBRE AS pasNombre
14 FROM AMIGO A
15 LEFT JOIN PASATIEMPO P
16 ON A.PAS_ID = P.PAS_ID
17 ORDER BY A.AMI_NOMBRE"
18 );
19 $resultado = $stmt->fetchAll(PDO::FETCH_OBJ);
20 return recibeFetchAll($resultado);
21}
22

6. srv / bd / amigoElimina.php

1<?php
2
3require_once __DIR__ . "/Bd.php";
4
5function amigoElimina(int $id)
6{
7 $con = Bd::getConexion();
8 $stmt = $con->prepare(
9 "DELETE FROM AMIGO
10 WHERE AMI_ID = :id"
11 );
12 $stmt->execute([":id" => $id]);
13}
14

7. srv / bd / amigoModifica.php

1<?php
2
3require_once __DIR__ . "/../modelo/Amigo.php";
4require_once __DIR__ . "/Bd.php";
5
6function amigoModifica(Amigo $modelo)
7{
8 $modelo->valida();
9 $con = Bd::getConexion();
10 $stmt = $con->prepare(
11 "UPDATE AMIGO
12 SET
13 AMI_NOMBRE = :nombre,
14 PAS_ID = :pasId
15 WHERE AMI_ID = :id"
16 );
17 $stmt->execute([
18 ":id" => $modelo->id,
19 ":nombre" => $modelo->nombre,
20 ":pasId" => $modelo->pasatiempo === null
21 ? null
22 : $modelo->pasatiempo->id
23 ]);
24}
25

8. srv / bd / pasatiempoAgrega.php

1<?php
2
3require_once __DIR__ . "/../modelo/Pasatiempo.php";
4require_once __DIR__ . "/Bd.php";
5
6function pasatiempoAgrega(Pasatiempo $modelo)
7{
8 $modelo->valida();
9 $con = Bd::getConexion();
10 $stmt = $con->prepare(
11 "INSERT INTO PASATIEMPO
12 (PAS_NOMBRE)
13 VALUES
14 (:nombre)"
15 );
16 $stmt->execute([":nombre" => $modelo->nombre]);
17 /* Si usas una secuencia para generar el id,
18 * pasa como parámetro de lastInsertId el
19 * nombre de dicha secuencia, debes
20 * ejecutarlo antes del INSERT y pasarle el
21 * id generado al SQL. */
22 $modelo->id = $con->lastInsertId();
23}
24

9. srv / bd / pasatiempoConsulta.php

1<?php
2
3require_once __DIR__ . "/../../lib/php/recibeFetchAll.php";
4require_once __DIR__ . "/../modelo/Pasatiempo.php";
5require_once __DIR__ . "/Bd.php";
6
7/** @return Pasatiempo[] */
8function pasatiempoConsulta()
9{
10 $con = Bd::getConexion();
11 $stmt = $con->query(
12 "SELECT
13 PAS_ID AS id,
14 PAS_NOMBRE AS nombre
15 FROM PASATIEMPO
16 ORDER BY PAS_NOMBRE"
17 );
18 $resultado = $stmt->fetchAll(
19 PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,
20 Pasatiempo::class
21 );
22 return recibeFetchAll($resultado);
23}
24