PHP crash course: Simple Weather App

MD ARIFUL HAQUE - Aug 1 - - Dev Community

A weather application that fetches and displays weather information from an API using PHP, jQuery, AJAX, Bootstrap, CSS, and MySQL.

Topics:

- PHP
- Weather API
- jQuery
- AJAX
- Bootstrap
- CSS
- MySQL
Enter fullscreen mode Exit fullscreen mode

Step-by-Step Solution with Code Explanation

1. Directory Structure

weather-app/
│
├── config.sample.php
├── database/
│   └── weather_app.sql
├── src/
│   ├── api.php
│   ├── fetch_weather.php
│   └── index.php
├── css/
│   └── styles.css
├── js/
│   └── script.js
├── vendor/
│   └── (composer dependencies)
├── composer.json
├── README.md
└── .gitignore
Enter fullscreen mode Exit fullscreen mode

2. Database Schema

database/database.sql:

CREATE DATABASE IF NOT EXISTS weather_app;
USE weather_app;

CREATE TABLE IF NOT EXISTS weather_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    city VARCHAR(100) NOT NULL,
    temperature FLOAT NOT NULL,
    description VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Enter fullscreen mode Exit fullscreen mode

3. Configuration File

config.sample.php:

<?php
define('DB_HOST', 'localhost');
define('DB_NAME', 'weather_app');
define('DB_USER', 'root');
define('DB_PASS', '');

define('WEATHER_API_KEY', 'your_api_key_here');
define('WEATHER_API_URL', 'http://api.openweathermap.org/data/2.5/weather');
?>
Enter fullscreen mode Exit fullscreen mode

4. Configure the Database Connection

db.php:

<?php
   include 'config.php';
   // Database configuration
   $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME;
   $options = [
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
       PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
   ];

   try {
       $pdo = new PDO($dsn, DB_USER, DB_PASS, $options);
       $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   } catch (PDOException $e) {
       die('Database connection failed: ' . $e->getMessage());
   }
?>```



#### 5. **API Handling**

**src/api.php:**


```php
<?php
require_once '../db.php';

function getWeatherData($city) {
    $url = WEATHER_API_URL . "?q=" . urlencode($city) . "&appid=" . WEATHER_API_KEY . "&units=metric";
    $response = file_get_contents($url);
    return json_decode($response, true);
}

if (isset($_GET['city'])) {
    $city = $_GET['city'];
    $weatherData = getWeatherData($city);

    // Save to database
    $stmt = $pdo->prepare('INSERT INTO weather_logs (city, temperature, description) VALUES (?, ?, ?)');
    $stmt->execute([
        $weatherData['name'],
        $weatherData['main']['temp'],
        $weatherData['weather'][0]['description']
    ]);

    echo json_encode($weatherData);
}
?>
Enter fullscreen mode Exit fullscreen mode

6. Fetching Weather Data

src/fetch_weather.php:

<?php
require_once '../db.php';

$stmt = $pdo->query('SELECT * FROM weather_logs ORDER BY created_at DESC');
$weatherLogs = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo json_encode($weatherLogs);
?>
Enter fullscreen mode Exit fullscreen mode

7. HTML and Frontend Code

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Weather App</title>
    <link rel="stylesheet" href="css/styles.css">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h1 class="mt-5">Weather App</h1>
        <div class="form-group">
            <label for="city">Enter city name:</label>
            <input type="text" id="city" class="form-control">
        </div>
        <button id="getWeather" class="btn btn-primary">Get Weather</button>
        <div id="weatherResult" class="mt-4"></div>
        <h2 class="mt-5">Weather Logs</h2>
        <div id="weatherLogs" class="mt-4"></div>
    </div>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script src="js/script.js"></script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

8. CSS Styles

css/styles.css:

body {
    padding-top: 20px;
}
Enter fullscreen mode Exit fullscreen mode

9. JavaScript and AJAX

js/script.js:

$(document).ready(function () {
    $('#getWeather').click(function () {
        var city = $('#city').val();
        $.ajax({
            url: 'api.php',
            method: 'GET',
            data: { city: city },
            success: function (data) {
                var weather = JSON.parse(data);
                $('#weatherResult').html(
                    `<h3>Weather in ${weather.name}</h3>
                     <p>Temperature: ${weather.main.temp}°C</p>
                     <p>Description: ${weather.weather[0].description}</p>`
                );
                fetchWeatherLogs();
            }
        });
    });

    function fetchWeatherLogs() {
        $.ajax({
            url: 'fetch_weather.php',
            method: 'GET',
            success: function (data) {
                var logs = JSON.parse(data);
                var logsHtml = '<ul class="list-group">';
                logs.forEach(function (log) {
                    logsHtml += `<li class="list-group-item">
                                    <strong>${log.city}</strong>: 
                                    ${log.temperature}°C, 
                                    ${log.description} 
                                    <em>(${log.created_at})</em>
                                </li>`;
                });
                logsHtml += '</ul>';
                $('#weatherLogs').html(logsHtml);
            }
        });
    }

    fetchWeatherLogs();
});
Enter fullscreen mode Exit fullscreen mode

This solution covers the necessary steps to create a weather application using, jQuery, AJAX, Bootstrap, CSS, and MySQL. The provided code explanations and examples should help you understand and implement each part of the application.

Connecting Links

If you found this series helpful, please consider giving the repository a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me!

If you want more helpful content like this, feel free to follow me:

Source Code

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .