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

  1. HTML5: per la struttura e il layout delle pagine.
  2. CSS3: per lo stile e la presentazione delle pagine.
  3. 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.
  4. MySQL: per la gestione dei dati degli utenti, delle prenotazioni e del menu del ristorante.
  5. 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

         // Inserimento utente nel database

        $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;

        }

    }

}

 $captcha_code = rand(1000, 9999);

$_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>

         <label for="password">Password</label>

        <input type="password" name="password" required>

        <label for="captcha">Inserisci il codice CAPTCHA: <?php echo $captcha_code; ?></label>

        <input type="text" name="captcha" required>

         <?php if (isset($error)) echo "<p>$error</p>"; ?>

         <button type="submit">Registrati</button>

    </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'];

     // Verifica l'esistenza dell'utente

    $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.";

    }

}

?>

 <!DOCTYPE html>

<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>

         <label for="password">Password</label>

        <input type="password" name="password" required>

         <?php if (isset($error)) echo "<p>$error</p>"; ?>

         <button type="submit">Accedi</button>

    </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>

    <h3>Prenotazione</h3>

    <form action="prenota.php" method="POST">

        <label for="numero_persone">Numero di persone</label>

        <input type="number" name="numero_persone" required>

        <label for="data_prenotazione">Data e ora prenotazione</label>

        <input type="datetime-local" name="data_prenotazione" required>

         <button type="submit">Prenota</button>

    </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'];

     // Aggiungi la prenotazione al database

    $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.');

    }

     if ($_SERVER['REQUEST_METHOD'] == 'POST') {

        $numero_persone = $_POST['numero_persone'];

        $data_prenotazione = $_POST['data_prenotazione'];

         // Aggiorna la prenotazione nel database

        $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>

         <label for="data_prenotazione">Data e Ora Prenotazione</label>

        <input type="datetime-local" name="data_prenotazione" value="<?php echo date('Y-m-d\TH:i', strtotime($prenotazione['data_prenotazione'])); ?>" required>

         <button type="submit">Aggiorna Prenotazione</button>

    </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');

 if (!isset($_SESSION['user_id'])) {

    header('Location: login.php');

    exit;

}

 if (isset($_GET['id'])) {

    $prenotazione_id = $_GET['id'];

     // Cancella la prenotazione dal database

    $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;

}

 if (isset($_GET['id'])) {

    $prenotazione_id = $_GET['id'];

     // Recupera la prenotazione

    $query = "SELECT * FROM prenotazioni WHERE id = '$prenotazione_id'";

    $result = $conn->query($query);

    $prenotazione = $result->fetch_assoc();

 

    if (!$prenotazione) {

        die('Prenotazione non trovata.');

    }

     // Simuliamo un pagamento riuscito

    $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

  1. Registrazione e Login: Testa la registrazione di un nuovo utente e accedi con il suo account.
  2. Prenotazione: Prenota un tavolo dal menu e verifica che venga visualizzato correttamente nella tua pagina di prenotazioni.
  3. Modifica e Cancellazione: Verifica che tu possa modificare e cancellare correttamente le prenotazioni.
  4. 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

Post popolari in questo blog

Simulazioni di reti (con Cisco Packet Tracer)

Esercizi in Excel e fogli di Google