[Solución] Ejercicio de Programación PHP: Sistema de Consulta del Clima con Favoritos
db.php
<?php
// db.php: Configuración de conexión a la base de datos y funciones de acceso a datos.
function conectaDb() {
try {
$pdo = new PDO('mysql:host=localhost;dbname=nombre_de_tu_base_de_datos;charset=utf8', 'usuario', 'contraseña');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
} catch (PDOException $e) {
exit("Error: " . $e->getMessage());
}
}
function obtenerCiudadesFavoritas($usuarioId) {
$db = conectaDb();
$consulta = "SELECT nombre_ciudad FROM ciudades_favoritas WHERE usuario_id = :usuario_id";
$stmt = $db->prepare($consulta);
$stmt->execute(['usuario_id' => $usuarioId]);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
function agregarCiudadFavorita($nombreCiudad, $usuarioId) {
$db = conectaDb();
$consulta = "INSERT INTO ciudades_favoritas (nombre_ciudad, usuario_id) VALUES (:nombre_ciudad, :usuario_id)";
$stmt = $db->prepare($consulta);
$stmt->execute(['nombre_ciudad' => $nombreCiudad, 'usuario_id' => $usuarioId]);
return $stmt->rowCount();
}
function removerCiudadFavorita($nombreCiudad, $usuarioId) {
$db = conectaDb();
$consulta = "DELETE FROM ciudades_favoritas WHERE nombre_ciudad = :nombre_ciudad AND usuario_id = :usuario_id";
$stmt = $db->prepare($consulta);
$stmt->execute(['nombre_ciudad' => $nombreCiudad, 'usuario_id' => $usuarioId]);
return $stmt->rowCount();
}
funciones.php
<?php
// funciones.php: Funciones para manejar peticiones a la API, sesiones y cookies.
function consultarClimaAPI($ciudad) {
$apiKey = "tu_api_key_aquí";
$url = "http://api.openweathermap.org/data/2.5/weather?q={$ciudad}&appid={$apiKey}&units=metric&lang=es";
$resultado = file_get_contents($url);
return json_decode($resultado, true);
}
function iniciarSesionYCookie($ciudad) {
if (!isset($_SESSION)) {
session_start();
}
$_SESSION['ultima_busqueda'] = $ciudad;
setcookie('ultima_ciudad', $ciudad, time() + 86400 * 30, "/");
}
index.php
<?php
// index.php: Punto de entrada, muestra el formulario y procesa las búsquedas.
require_once "funciones.php";
require_once "db.php";
// Manejar la sesión y la cookie de la última ciudad buscada.
session_start();
$ultimaCiudad = $_SESSION['ultima_busqueda'] ?? $_COOKIE['ultima_ciudad'] ?? '';
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['ciudad'])) {
$ciudad = $_POST['ciudad'];
iniciarSesionYCookie($ciudad);
header("Location: clima.php?ciudad=" . urlencode($ciudad));
exit();
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Consulta del Clima</title>
</head>
<body>
<h1>Consulta del Clima</h1>
<form method="post">
Ciudad: <input type="text" name="ciudad" value="<?php echo htmlspecialchars($ultimaCiudad); ?>" required>
<button type="submit">Buscar Clima</button>
</form>
</body>
</html>
clima.php
require_once "funciones.php";
require_once "db.php";
session_start();
$usuarioId = $_SESSION['usuario_id'] ?? 1; // Asumimos un usuario por defecto o implementa tu lógica de autenticación
if (isset($_GET['ciudad'])) {
$ciudad = $_GET['ciudad'];
$resultadoClima = consultarClimaAPI($ciudad);
// Procesa y muestra la información del clima de forma más amigable
$temperatura = $resultadoClima['main']['temp'] ?? 'No disponible';
$descripcion = $resultadoClima['weather'][0]['description'] ?? 'No disponible';
echo "<h2>Clima en $ciudad</h2>";
echo "<p>Temperatura: $temperatura °C</p>";
echo "<p>Descripción: $descripcion</p>";
// Botones para añadir o remover de favoritos
echo "<form method='post' action='favoritos.php'>";
echo "<input type='hidden' name='ciudad' value='$ciudad'>";
echo "<input type='hidden' name='usuario_id' value='$usuarioId'>";
echo "<button type='submit' name='accion' value='añadir'>Añadir a Favoritos</button>";
echo "<button type='submit' name='accion' value='remover'>Remover de Favoritos</button>";
echo "</form>";
} else {
header("Location: index.php");
exit();
}
favoritos.php
<?php
// favoritos.php: Maneja añadir y remover ciudades de los favoritos.
require_once "db.php";
session_start();
$usuarioId = $_POST['usuario_id'] ?? null;
$ciudad = $_POST['ciudad'] ?? null;
$accion = $_POST['accion'] ?? null;
if ($ciudad && $usuarioId) {
switch ($accion) {
case 'añadir':
if (agregarCiudadFavorita($ciudad, $usuarioId)) {
$_SESSION['mensaje'] = "Ciudad añadida a favoritos.";
} else {
$_SESSION['error'] = "Error al añadir ciudad a favoritos.";
}
break;
case 'remover':
if (removerCiudadFavorita($ciudad, $usuarioId)) {
$_SESSION['mensaje'] = "Ciudad removida de favoritos.";
} else {
$_SESSION['error'] = "Error al remover ciudad de favoritos.";
}
break;
}
}
header("Location: index.php");
exit();
Last updated