5E e 5I Sia: Prenotazione ristorante con Php e Mysql, utilizzo di Html5, Css3, sessioni, login, criptazione e captcha
Ecco un esempio di applicazione web completa con login, sessioni, crittografia, CAPTCHA numerico e la simulazione di un menu per la prenotazione in un ristorante.
Utilizzo di Html5, Css3, Php e Mysql
Struttura dell'applicazione
- HTML5: per la struttura e il layout
delle pagine.
- CSS3: per lo stile e la
presentazione delle pagine.
- PHP: per la gestione del backend,
inclusi il login, la sessione, la crittografia, la prenotazione (inserimento, modifica, visualizzazione e cancellazione) e la
connessione al database MySQL.
- MySQL: per la gestione dei dati
degli utenti, delle prenotazioni e del menu del ristorante.
- Captcha numerico: per proteggere ulteriormente l'accesso non autorizzato.
Passo 1: Creare il Database
Prima di
tutto, dobbiamo creare un database MySQL per memorizzare gli utenti, le
prenotazioni e il menu. Usa il seguente SQL per creare il database e le
tabelle:
CREATE DATABASE ristorante;
USE ristorante;
-- Tabella per gli utenti
CREATE TABLE utenti (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
data_registrazione TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabella per il menu del ristorante
CREATE TABLE menu (
id INT AUTO_INCREMENT PRIMARY KEY,
nome_piatto VARCHAR(100) NOT NULL,
descrizione TEXT,
prezzo DECIMAL(10,2) NOT NULL
);
-- Tabella per le prenotazioni
CREATE TABLE prenotazioni (
id INT AUTO_INCREMENT PRIMARY KEY,
nome_cliente VARCHAR(100) NOT NULL,
email_cliente VARCHAR(100) NOT NULL,
numero_persone INT NOT NULL,
data_prenotazione DATETIME NOT NULL,
stato ENUM('confermata', 'annullata', 'in attesa') DEFAULT 'in attesa'
);
Passo 2: Connessione al Database
Inizia
creando il file db.php per la
connessione al database MySQL.
<?php
$host = 'localhost';
$user = 'root'; // Cambia
con il tuo username MySQL
$password = ''; // Cambia con la tua password MySQL
$database = 'ristorante';
$conn = new mysqli($host, $user, $password, $database);
if ($conn->connect_error) {
die("Connessione fallita: " . $conn->connect_error);
}
?>
Passo 3: Pagina di Registrazione (HTML + PHP)
La pagina di
registrazione permette agli utenti di creare un account. Verrà implementato
anche un CAPTCHA numerico.
register.php
<?php
session_start();
include('db.php');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Validazione CAPTCHA
if ($_POST['captcha'] != $_SESSION['captcha_code']) {
$error = "Il
codice CAPTCHA non è corretto.";
} else {
// Validazione dei campi
$nome = $_POST['nome'];
$email = $_POST['email'];
$password = $_POST['password'];
$hashed_password = password_hash($password,
PASSWORD_DEFAULT); //
Criptazione della password
$query = "INSERT
INTO utenti (nome, email, password) VALUES ('$nome', '$email', '$hashed_password')";
if ($conn->query($query) === TRUE) {
echo "Registrazione avvenuta con
successo!";
} else {
echo "Errore: " . $conn->error;
}
}
}
$_SESSION['captcha_code'] = $captcha_code;
?>
<!DOCTYPE html>
<html
lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Registrazione</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Registrazione Utente</h2>
<form method="POST">
<label for="nome">Nome</label>
<input type="text" name="nome" required>
<label for="email">Email</label>
<input type="email" name="email" required>
<input type="password" name="password" required>
<label for="captcha">Inserisci il codice CAPTCHA: <?php echo $captcha_code; ?></label>
<input type="text" name="captcha" required>
</form>
</body>
</html>
Passo 4: Pagina di Login (HTML + PHP)
La pagina di
login permette agli utenti di accedere con il proprio account.
login.php
<?php
session_start();
include('db.php');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$email = $_POST['email'];
$password = $_POST['password'];
$query = "SELECT
* FROM utenti WHERE email='$email'";
$result = $conn->query($query);
if ($result->num_rows > 0) {
$user = $result->fetch_assoc();
// Verifica la password
if (password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_name'] = $user['nome'];
header('Location: menu.php');
exit;
} else {
$error = "Password
errata.";
}
} else {
$error = "Utente
non trovato.";
}
}
?>
<html
lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Login</h2>
<form method="POST">
<label for="email">Email</label>
<input type="email" name="email" required>
<input type="password" name="password" required>
</form>
</body>
</html>
Passo 5: Pagina del Menu e Prenotazione
Questa
pagina mostrerà il menu del ristorante e consentirà di fare una prenotazione.
menu.php
<?php
session_start();
include('db.php');
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
// Recupera il menu dal database
$query = "SELECT * FROM menu";
$result = $conn->query($query);
?>
<!DOCTYPE html>
<html
lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Menu Ristorante</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Benvenuto, <?php echo $_SESSION['user_name']; ?></h2>
<h3>Menu</h3>
<table>
<tr>
<th>Nome Piatto</th>
<th>Descrizione</th>
<th>Prezzo</th>
</tr>
<?php while ($row = $result->fetch_assoc()) { ?>
<tr>
<td><?php echo $row['nome_piatto']; ?></td>
<td><?php echo $row['descrizione']; ?></td>
<td><?php echo number_format($row['prezzo'], 2, ',', '.'); ?>
€</td>
</tr>
<?php } ?>
</table>
<form action="prenota.php" method="POST">
<label for="numero_persone">Numero di persone</label>
<input type="number" name="numero_persone"
required>
<input type="datetime-local" name="data_prenotazione"
required>
</form>
</body>
</html>
Passo 6: Gestire le Prenotazioni
Crea il file
prenota.php per gestire
la prenotazione.
prenota.php
<?php
session_start();
include('db.php');
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$user_id = $_SESSION['user_id'];
$numero_persone = $_POST['numero_persone'];
$data_prenotazione = $_POST['data_prenotazione'];
$query = "INSERT
INTO prenotazioni (nome_cliente, email_cliente, numero_persone,
data_prenotazione)
SELECT nome, email, '$numero_persone', '$data_prenotazione' FROM utenti
WHERE id = '$user_id'";
if ($conn->query($query) === TRUE) {
echo "Prenotazione effettuata con
successo!";
} else {
echo "Errore: " . $conn->error;
}
}
?>
Passo 7: CSS di Base
Ecco uno
stile di base per l'applicazione. Puoi salvarlo in style.css.
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
h2, h3 {
color: #333;
}
form {
margin: 20px;
padding: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-top: 10px;
}
input {
width: 100%;
padding: 10px;
margin-top: 5px;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
background-color: #28a745;
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 4px;
margin-top: 10px;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
table, th, td {
border: 1px solid #ddd;
}
th, td {
padding: 10px;
text-align: left;
}
Passo 8: Test e Messa in Produzione
Una volta che hai configurato il database e il codice PHP, dovresti testare l'applicazione su un server locale o remoto con PHP e MySQL. Puoi usare XAMPP, WAMP, MAMP o un server remoto con PHP e MySQL abilitati.
1. Modifica del Database
Per gestire
il pagamento e lo stato della prenotazione, aggiungerò un campo per lo stato
del pagamento nella tabella prenotazioni. Questo campo può contenere valori come 'in attesa', 'pagato', e 'annullato'.
ALTER TABLE prenotazioni ADD COLUMN stato_pagamento ENUM('in attesa', 'pagato', 'annullato') DEFAULT 'in attesa';
2. Gestione delle Prenotazioni
2.1. Pagina di Visualizzazione e Modifica delle
Prenotazioni
Crea una
pagina che consenta di visualizzare tutte le prenotazioni effettuate e di
modificarle o cancellarle.
visualizza_prenotazioni.php
Questa
pagina mostrerà tutte le prenotazioni dell'utente, insieme a opzioni per
modificare o cancellare le prenotazioni.
<?php
session_start();
include('db.php');
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$user_id = $_SESSION['user_id'];
// Recupera le prenotazioni dell'utente
$query = "SELECT * FROM prenotazioni WHERE email_cliente = (SELECT email FROM
utenti WHERE id = '$user_id')";
$result = $conn->query($query);
?>
<!DOCTYPE html>
<html
lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Le tue
Prenotazioni</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Le tue Prenotazioni</h2>
<table>
<tr>
<th>Nome Cliente</th>
<th>Numero Persone</th>
<th>Data
Prenotazione</th>
<th>Stato
Prenotazione</th>
<th>Stato
Pagamento</th>
<th>Azioni</th>
</tr>
<?php while ($row = $result->fetch_assoc()) { ?>
<tr>
<td><?php echo $row['nome_cliente']; ?></td>
<td><?php echo $row['numero_persone']; ?></td>
<td><?php echo $row['data_prenotazione']; ?></td>
<td><?php echo ucfirst($row['stato']); ?></td>
<td><?php echo ucfirst($row['stato_pagamento']); ?></td>
<td>
<a href="modifica_prenotazione.php?id=<?php echo $row['id'];
?>">Modifica</a> |
<a href="cancella_prenotazione.php?id=<?php echo $row['id'];
?>" onclick="return
confirm('Sei sicuro di voler cancellare questa prenotazione?')">Cancella</a>
|
<?php if ($row['stato_pagamento'] == 'in attesa') { ?>
<a href="paga_prenotazione.php?id=<?php echo $row['id'];
?>">Paga</a>
<?php } ?>
</td>
</tr>
<?php } ?>
</table>
</body>
</html>
2.2. Pagina di Modifica della Prenotazione
Questa
pagina permetterà agli utenti di modificare le informazioni della prenotazione,
come il numero di persone o la data.
modifica_prenotazione.php
<?php
session_start();
include('db.php');
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
if (isset($_GET['id'])) {
$prenotazione_id = $_GET['id'];
// Recupera la prenotazione dal database
$query = "SELECT
* FROM prenotazioni WHERE id = '$prenotazione_id'";
$result = $conn->query($query);
$prenotazione = $result->fetch_assoc();
if (!$prenotazione) {
die('Prenotazione non trovata.');
}
$numero_persone = $_POST['numero_persone'];
$data_prenotazione = $_POST['data_prenotazione'];
$update_query = "UPDATE
prenotazioni SET numero_persone = '$numero_persone', data_prenotazione = '$data_prenotazione'
WHERE id = '$prenotazione_id'";
if ($conn->query($update_query) === TRUE) {
echo "Prenotazione aggiornata con
successo!";
} else {
echo "Errore: " . $conn->error;
}
}
} else {
die('ID prenotazione non fornito.');
}
?>
<!DOCTYPE html>
<html
lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modifica
Prenotazione</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h2>Modifica Prenotazione</h2>
<form method="POST">
<label for="numero_persone">Numero Persone</label>
<input type="number" name="numero_persone" value="<?php echo $prenotazione['numero_persone'];
?>" required>
<input type="datetime-local" name="data_prenotazione" value="<?php echo date('Y-m-d\TH:i', strtotime($prenotazione['data_prenotazione']));
?>" required>
</form>
</body>
</html>
2.3. Pagina di Cancellazione della Prenotazione
Questa
pagina cancellerà la prenotazione selezionata dal database.
cancella_prenotazione.php
<?php
session_start();
include('db.php');
header('Location: login.php');
exit;
}
$prenotazione_id = $_GET['id'];
$query = "DELETE
FROM prenotazioni WHERE id = '$prenotazione_id'";
if ($conn->query($query) === TRUE) {
echo "Prenotazione cancellata con
successo!";
} else {
echo "Errore durante la
cancellazione della prenotazione: " . $conn->error;
}
} else {
echo "ID prenotazione non
fornito.";
}
?>
3. Simulazione del Pagamento
Simuleremo
una pagina di pagamento che cambia lo stato del pagamento per una prenotazione
quando l'utente clicca su "Paga".
paga_prenotazione.php
<?php
session_start();
include('db.php');
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
$prenotazione_id = $_GET['id'];
$query = "SELECT
* FROM prenotazioni WHERE id = '$prenotazione_id'";
$result = $conn->query($query);
$prenotazione = $result->fetch_assoc();
if (!$prenotazione) {
die('Prenotazione non trovata.');
}
$stato_pagamento = 'pagato';
$update_query = "UPDATE
prenotazioni SET stato_pagamento = '$stato_pagamento' WHERE id = '$prenotazione_id'";
if ($conn->query($update_query) === TRUE) {
echo "Pagamento effettuato con
successo!";
} else {
echo "Errore: " . $conn->error;
}
} else {
echo "ID prenotazione non
fornito.";
}
?>
4. CSS
Puoi
utilizzare lo stesso file style.css creato in precedenza, senza modifiche.
5. Test dell'Applicazione
- Registrazione e Login: Testa la registrazione di un
nuovo utente e accedi con il suo account.
- Prenotazione: Prenota un tavolo dal menu e
verifica che venga visualizzato correttamente nella tua pagina di
prenotazioni.
- Modifica e Cancellazione: Verifica che tu possa
modificare e cancellare correttamente le prenotazioni.
- Pagamento: Simula un pagamento per una
prenotazione e verifica che lo stato del pagamento venga aggiornato.
Questo ti dà
una base solida per un'applicazione di prenotazione di ristorante, che include
login, gestione delle prenotazioni (modifica, cancellazione) e simulazione di
pagamento.
di Paolo Latella
Commenti
Posta un commento