1 | <?php |
2 | |
3 | require_once __DIR__ . "/../../lib/php/validaNombre.php"; |
4 | |
5 | class Amigo |
6 | { |
7 | |
8 | public int $id; |
9 | public string $nombre; |
10 | public ?Pasatiempo $pasatiempo; |
11 | |
12 | public function __construct( |
13 | string $nombre = "", |
14 | ?Pasatiempo $pasatiempo = null, |
15 | int $id = 0 |
16 | ) { |
17 | $this->id = $id; |
18 | $this->nombre = $nombre; |
19 | $this->pasatiempo = $pasatiempo; |
20 | } |
21 | |
22 | public function valida() |
23 | { |
24 | validaNombre($this->nombre); |
25 | } |
26 | } |
27 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../../lib/php/validaNombre.php"; |
4 | |
5 | class Pasatiempo |
6 | { |
7 | |
8 | public int $id; |
9 | public string $nombre; |
10 | |
11 | public function __construct(string $nombre = "", int $id = 0) |
12 | { |
13 | $this->id = $id; |
14 | $this->nombre = $nombre; |
15 | } |
16 | |
17 | public function valida() |
18 | { |
19 | validaNombre($this->nombre); |
20 | } |
21 | } |
22 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../lib/php/ejecutaServicio.php"; |
4 | require_once __DIR__ . "/../lib/php/JsonResponse.php"; |
5 | require_once __DIR__ . "/../lib/php/leeEntero.php"; |
6 | require_once __DIR__ . "/../lib/php/leeTexto.php"; |
7 | require_once __DIR__ . "/modelo/Amigo.php"; |
8 | require_once __DIR__ . "/modelo/Pasatiempo.php"; |
9 | require_once __DIR__ . "/bd/amigoAgrega.php"; |
10 | |
11 | ejecutaServicio(function () { |
12 | $nombre = leeTexto("nombre"); |
13 | $pasId = leeEntero("pasId"); |
14 | $pasatiempo = $pasId === null |
15 | ? null |
16 | : new Pasatiempo(id: $pasId); |
17 | $modelo = new Amigo( |
18 | nombre: $nombre === null ? "" : trim($nombre), |
19 | pasatiempo: $pasatiempo |
20 | ); |
21 | amigoAgrega($modelo); |
22 | $id = htmlentities($modelo->id); |
23 | $pasatiempo = $modelo->pasatiempo; |
24 | return JsonResponse::created("/srv/srvAmigoBusca.php?id=$id", [ |
25 | "id" => ["value" => $modelo->id], |
26 | "nombre" => ["value" => $modelo->nombre], |
27 | "pasId" => ["value" => $pasatiempo === null ? "" : $pasatiempo->id] |
28 | ]); |
29 | }); |
30 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../lib/php/ejecutaServicio.php"; |
4 | require_once __DIR__ . "/../lib/php/ProblemDetails.php"; |
5 | require_once __DIR__ . "/../lib/php/pdFaltaId.php"; |
6 | require_once __DIR__ . "/../lib/php/leeEntero.php"; |
7 | require_once __DIR__ . "/bd/amigoBusca.php"; |
8 | |
9 | ejecutaServicio(function () { |
10 | $id = leeEntero("id"); |
11 | if ($id === null) throw pdFaltaId(); |
12 | $modelo = amigoBusca($id); |
13 | if ($modelo === false) { |
14 | $htmlId = htmlentities($id); |
15 | throw new ProblemDetails( |
16 | status: ProblemDetails::NotFound, |
17 | type: "/error/amigonoencontrado.html", |
18 | title: "Amigo no encontrado.", |
19 | detail: "No se encontró ningún amigo con el id $htmlId.", |
20 | ); |
21 | } else { |
22 | $pasatiempo = $modelo->pasatiempo; |
23 | return [ |
24 | "id" => ["value" => $modelo->id], |
25 | "nombre" => ["value" => $modelo->nombre], |
26 | "pasId" => ["value" => $pasatiempo === null ? "" : $pasatiempo->id] |
27 | ]; |
28 | } |
29 | }); |
30 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../lib/php/ejecutaServicio.php"; |
4 | require_once __DIR__ . "/bd/amigoConsulta.php"; |
5 | |
6 | ejecutaServicio(function () { |
7 | $lista = amigoConsulta(); |
8 | $render = ""; |
9 | foreach ($lista as $modelo) { |
10 | $amiId = htmlentities($modelo->amiId); |
11 | $amiNombre = htmlentities($modelo->amiNombre); |
12 | $pasNombre = $modelo->pasNombre === null |
13 | ? "<em>-- Sin pasatiempo --</em>" |
14 | : htmlentities($modelo->pasNombre); |
15 | $render .= |
16 | "<dt><a href='modifica.html?id=$amiId'>$amiNombre</a></dt> |
17 | <dd><a href='modifica.html?id=$amiId'>$pasNombre</a></dd>"; |
18 | } |
19 | return ["lista" => ["innerHTML" => $render]]; |
20 | }); |
21 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../lib/php/ejecutaServicio.php"; |
4 | require_once __DIR__ . "/../lib/php/JsonResponse.php"; |
5 | require_once __DIR__ . "/../lib/php/pdFaltaId.php"; |
6 | require_once __DIR__ . "/../lib/php/leeEntero.php"; |
7 | require_once __DIR__ . "/bd/amigoElimina.php"; |
8 | |
9 | ejecutaServicio(function () { |
10 | $id = leeEntero("id"); |
11 | if ($id === null) throw pdFaltaId(); |
12 | amigoElimina($id); |
13 | return JsonResponse::noContent(); |
14 | }); |
15 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../lib/php/ejecutaServicio.php"; |
4 | require_once __DIR__ . "/../lib/php/pdFaltaId.php"; |
5 | require_once __DIR__ . "/../lib/php/leeEntero.php"; |
6 | require_once __DIR__ . "/../lib/php/leeTexto.php"; |
7 | require_once __DIR__ . "/modelo/Amigo.php"; |
8 | require_once __DIR__ . "/modelo/Pasatiempo.php"; |
9 | require_once __DIR__ . "/bd/amigoModifica.php"; |
10 | |
11 | ejecutaServicio(function () { |
12 | $id = leeEntero("id"); |
13 | if ($id === null) throw pdFaltaId(); |
14 | $nombre = leeTexto("nombre"); |
15 | $pasId = leeEntero("pasId"); |
16 | $pasatiempo = $pasId === null |
17 | ? null |
18 | : new Pasatiempo(id: $pasId); |
19 | $modelo = new Amigo( |
20 | nombre: $nombre === null ? "" : trim($nombre), |
21 | pasatiempo: $pasatiempo, |
22 | id: $id |
23 | ); |
24 | amigoModifica($modelo); |
25 | return [ |
26 | "id" => ["value" => $modelo->id], |
27 | "nombre" => ["value" => $modelo->nombre], |
28 | "pasId" => ["value" => $pasatiempo === null ? "" : $pasatiempo->id] |
29 | ]; |
30 | }); |
31 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../lib/php/ejecutaServicio.php"; |
4 | require_once __DIR__ . "/bd/pasatiempoConsulta.php"; |
5 | |
6 | ejecutaServicio(function () { |
7 | $lista = pasatiempoConsulta(); |
8 | $render = "<option value=''>-- Sin pasatiempo --</option>"; |
9 | foreach ($lista as $modelo) { |
10 | $id = htmlentities($modelo->id); |
11 | $nombre = htmlentities($modelo->nombre); |
12 | $render .= "<option value='$id'>{$nombre}</option>"; |
13 | } |
14 | return ["pasId" => ["innerHTML" => $render]]; |
15 | }); |
16 |
1 | <?php |
2 | |
3 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../modelo/Pasatiempo.php"; |
4 | require_once __DIR__ . "/bdCrea.php"; |
5 | require_once __DIR__ . "/pasatiempoConsulta.php"; |
6 | require_once __DIR__ . "/pasatiempoAgrega.php"; |
7 | |
8 | class 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../modelo/Amigo.php"; |
4 | require_once __DIR__ . "/Bd.php"; |
5 | |
6 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../modelo/Amigo.php"; |
4 | require_once __DIR__ . "/../modelo/Pasatiempo.php"; |
5 | require_once __DIR__ . "/Bd.php"; |
6 | |
7 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../../lib/php/recibeFetchAll.php"; |
4 | require_once __DIR__ . "/Bd.php"; |
5 | |
6 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/Bd.php"; |
4 | |
5 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../modelo/Amigo.php"; |
4 | require_once __DIR__ . "/Bd.php"; |
5 | |
6 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../modelo/Pasatiempo.php"; |
4 | require_once __DIR__ . "/Bd.php"; |
5 | |
6 | function 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 |
1 | <?php |
2 | |
3 | require_once __DIR__ . "/../../lib/php/recibeFetchAll.php"; |
4 | require_once __DIR__ . "/../modelo/Pasatiempo.php"; |
5 | require_once __DIR__ . "/Bd.php"; |
6 | |
7 | /** @return Pasatiempo[] */ |
8 | function 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 |