UdA Classe Quinta
Installazione Apache, PHP, MariaDB e deploy progetto PHP
Comunicazioni
Percorso Operativo
Classe QuintaAggiorniamo 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
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
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
Elenco moduli PHP:
php -m
Controllo specifico dei moduli MySQL:
php -m | grep -i mysql
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
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
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
);
Prepariamo una cartella locale che conterrà i file del progetto 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");
?>
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