UdA Classe Quinta

Installazione Apache, PHP, MariaDB e deploy progetto PHP

Prof. ENRICO MELE
Percorso guidato per preparare l'ambiente, creare il database e pubblicare un progetto PHP tra Windows e Linux
Comunicazioni

Percorso Operativo

Classe Quinta
Fase 1 Ambiente Web Linux
Installazione di Apache
Aggiorniamo i pacchetti e installiamo Apache:
sudo apt update
sudo apt install apache2 -y
Avviamo e abilitiamo Apache all'avvio del sistema:
sudo systemctl start apache2
sudo systemctl enable apache2
Installazione di PHP e del modulo MySQL
Installiamo PHP e il modulo per collegare PHP a MySQL o MariaDB:
sudo apt update
sudo apt install php php-mysql -y
Riavviamo Apache:
sudo systemctl restart apache2
Permessi sulla cartella web
Assegniamo la proprietà della cartella web all'utente con cui lavoriamo:
sudo chown -R utente:gruppo /var/www/html
Esempio:
sudo chown -R enrico:www-data /var/www/html
Impostiamo i permessi consigliati:
sudo chmod -R 755 /var/www/html
Verifica dei moduli PHP installati
Elenco moduli PHP:
php -m
Controllo specifico dei moduli MySQL:
php -m | grep -i mysql
Fase 2 Database MariaDB
Installazione di MariaDB
Installiamo il server database:
sudo apt install mariadb-server -y
Avviamo e abilitiamo il servizio:
sudo systemctl start mariadb
sudo systemctl enable mariadb
Verifichiamo la porta 3306:
sudo ss -tulnp | grep 3306
Accesso a MariaDB
Accediamo come amministratore:
sudo mysql
Impostiamo la password dell'utente root:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
Da questo momento l'accesso avviene con:
mysql -u root -p
Creazione del database di test
Creiamo il database:
CREATE DATABASE rubrica_db;
Entriamo nel database:
USE rubrica_db;
Creiamo la tabella contatti:
CREATE TABLE contatti (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL,
    telefono VARCHAR(30) NOT NULL,
    creato_il TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Fase 3 Progetto PHP
Creiamo una cartella per il progetto di test
Prepariamo una cartella locale che conterrà i file del progetto PHP.
File config.php
Creiamo il file di configurazione per la connessione al database:
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$dbname = "rubrica_db";

$conn = new mysqli($host, $user, $pass, $dbname);

if ($conn->connect_error) {
    die("Connessione fallita: " . $conn->connect_error);
}

$conn->set_charset("utf8");
?>
Fase 4 Deploy e Verifica

Il file principale del progetto gestisce inserimento, lettura ed eliminazione dei contatti. Per non appesantire la pagina, il listato completo resta espandibile.

Mostra il file index.php completo
<?php
require_once "config.php";

/* INSERIMENTO */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["aggiungi"])) {
    $nome = trim($_POST["nome"]);
    $email = trim($_POST["email"]);
    $telefono = trim($_POST["telefono"]);

    if ($nome !== "" && $email !== "" && $telefono !== "") {
        $sql = "INSERT INTO contatti (nome, email, telefono) VALUES (?, ?, ?)";
        $stmt = $conn->prepare($sql);
        $stmt->bind_param("sss", $nome, $email, $telefono);
        $stmt->execute();
        $stmt->close();
    }

    header("Location: index.php");
    exit;
}

/* ELIMINAZIONE */
if (isset($_GET["delete"])) {
    $id = (int) $_GET["delete"];

    $sql = "DELETE FROM contatti WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->close();

    header("Location: index.php");
    exit;
}

/* LETTURA DATI */
$sql = "SELECT * FROM contatti ORDER BY id DESC";
$result = $conn->query($sql);
$contatti = [];

if ($result && $result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $contatti[] = $row;
    }
}
?>

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rubrica Contatti</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background: #f4f6f9;
            margin: 0;
            padding: 30px;
        }

        .container {
            max-width: 900px;
            margin: auto;
            background: white;
            padding: 25px;
            border-radius: 12px;
            box-shadow: 0 4px 18px rgba(0,0,0,0.1);
        }

        h1, h2 {
            text-align: center;
            color: #333;
        }

        form {
            display: grid;
            gap: 12px;
            margin-bottom: 30px;
        }

        input[type="text"],
        input[type="email"] {
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 8px;
            font-size: 16px;
        }

        button {
            padding: 12px;
            background: #0d6efd;
            color: white;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            font-size: 16px;
        }

        button:hover {
            background: #0b5ed7;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 15px;
        }

        table th, table td {
            padding: 12px;
            border-bottom: 1px solid #ddd;
            text-align: left;
        }

        table th {
            background: #f0f2f5;
        }

        .delete-btn {
            color: white;
            background: #dc3545;
            padding: 7px 10px;
            border-radius: 6px;
            text-decoration: none;
        }

        .delete-btn:hover {
            background: #bb2d3b;
        }

        .vuoto {
            text-align: center;
            color: #777;
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Rubrica Contatti</h1>

        <h2>Aggiungi un contatto</h2>
        <form method="POST" action="">
            <input type="text" name="nome" placeholder="Nome" required>
            <input type="email" name="email" placeholder="Email" required>
            <input type="text" name="telefono" placeholder="Telefono" required>
            <button type="submit" name="aggiungi">Salva contatto</button>
        </form>

        <h2>Elenco contatti</h2>

        <?php if (count($contatti) > 0): ?>
            <table>
                <tr>
                    <th>ID</th>
                    <th>Nome</th>
                    <th>Email</th>
                    <th>Telefono</th>
                    <th>Azione</th>
                </tr>

                <?php foreach ($contatti as $contatto): ?>
                    <tr>
                        <td><?= htmlspecialchars($contatto["id"]) ?></td>
                        <td><?= htmlspecialchars($contatto["nome"]) ?></td>
                        <td><?= htmlspecialchars($contatto["email"]) ?></td>
                        <td><?= htmlspecialchars($contatto["telefono"]) ?></td>
                        <td>
                            <a class="delete-btn" href="?delete=<?= $contatto["id"] ?>" onclick="return confirm('Eliminare questo contatto?')">Elimina</a>
                        </td>
                    </tr>
                <?php endforeach; ?>
            </table>
        <?php else: ?>
            <p class="vuoto">Nessun contatto presente.</p>
        <?php endif; ?>
    </div>
</body>

</html>
Preparazione SSH sul server

Prima della copia del progetto controlliamo che il server SSH sia installato:

dpkg -l | grep openssh-server

Se non risulta installato, lo aggiungiamo:

sudo apt update
sudo apt install openssh-server -y

Avviamo il servizio SSH e abilitiamolo all'avvio del sistema:

sudo systemctl start ssh
sudo systemctl enable ssh

Verifichiamo che il servizio sia attivo:

sudo systemctl status ssh

Controlliamo che la porta 22 sia in ascolto:

sudo ss -tulnp | grep :22
Dump completo del database da Windows

Da Windows salviamo un dump completo del database, comprensivo di struttura e dati:

mysqldump -u root -p --databases rubrica_db > C:\Users\Enrico\Desktop\rubrica_db_completo.sql

In questo modo il file .sql contiene creazione del database, tabelle, vincoli e record.

Possiamo trasferire il dump insieme alla cartella del progetto verso il Raspberry:

scp -r "C:\Users\Enrico\Desktop\rubrica" "C:\Users\Enrico\Desktop\rubrica_db_completo.sql" enrico@192.168.1.50:"/home/enrico"
Copia del progetto con SCP

Da Windows possiamo inviare la cartella del progetto al server Linux con scp:

scp -r "PercorsoWindows" utente@ip:"/percorsolinux"

Esempio:

scp -r "C:\Users\Enrico\Desktop\rubrica" enrico@192.168.1.50:"/var/www/html"
Ripristino del dump sul Raspberry

Dopo il trasferimento, dal Raspberry importiamo il dump completo da riga di comando:

mysql -u root -p < /home/enrico/rubrica_db_completo.sql

Se vogliamo controllare che il database sia stato ripristinato correttamente:

mysql -u root -p -e "SHOW DATABASES;"
mysql -u root -p -e "USE rubrica_db; SHOW TABLES;"
Verifica finale

Apriamo il browser e visitiamo l'indirizzo del server:

http://IP_DEL_SERVER/index.php