πŸš€ Riassunto Visuale β€” Pagina Web con Database

Strumenti: XAMPP (Apache + MySQL + PHP)  |  Progetto: Catalogo Prodotti

1. Architettura Client-Server

🌐 Browser (Client)
β†’
βš™οΈ Server PHP (XAMPP)
β†’
πŸ—„οΈ MySQL Database

2. Struttura del Progetto

πŸ“„ HTML
index.html Home
inserimento.html Form inserimento
ricerca.html Form ricerca
login.html Form login
βš™οΈ PHP
connessione.php Apre il DB
inserimento.php Salva dati
ricerca.php Legge dati
login.php Autentica, crea sessione
logout.php Distrugge sessione
πŸ—„οΈ Database web_app
prodotti: id, nome, descrizione, prezzo, immagine
utenti: id, username, password(hash), tipo
πŸ“ Cartelle
C:\xampp\htdocs\progetto\
immagini\ Foto prodotti
Accesso: http://localhost/progetto/

3. Flusso Inserimento (scrittura)

1. Apre inserimento.html
⬇️ compila form
2. Clicca "Salva"
⬇️ dati in POST
3. PHP riceve i dati dal form di inserimento con $_POST
⬇️
4. INSERT … VALUES (?, ?, ?)
⬇️ bind_param("ssd", …)
5. execute() salva nel DB
⬇️
6. "Salvato!" βœ…

4. Flusso Ricerca (lettura)

1. Apre ricerca.html
⬇️ scrive "laptop"
2. Clicca "Cerca"
⬇️ GET β†’ ricerca.php?nome=laptop
3. $_GET['nome']
⬇️ SELECT * FROM prodotti WHERE nome = ?
4. bind_param("s", $nome)
⬇️
5. fetch_assoc() + while
⬇️
6. Tabella risultati πŸ“‹

6. Array associativo

È come una rubrica telefonica: accedi per nome (chiave), non per posizione.

β€’ $_POST: $_POST['nome'] β†’ valore del campo con name="nome".
β€’ $row: dopo fetch_assoc(), $row["prezzo"] β†’ valore colonna prezzo.

7. POST vs GET

πŸ“¨ POST (busta chiusa) πŸ“¬ GET (cartolina)
Dove vanno i dati Nel corpo della richiesta (nascosti) Visibili nell'URL: ?nome=laptop
Quando usarlo Inserimento, modifica, cancellazione Ricerche, filtri, navigazione
Riservatezza PiΓΉ riservato: non in cronologia o log Meno riservato: visibile a tutti
Lunghezza Nessun limite pratico ~2048 caratteri
In PHP $_POST['campo'] $_GET['campo']

8. Codice essenziale

πŸ”‘ connessione.php

<?php
$servername = "localhost";
$username   = "root";
$password   = "";
$dbname     = "web_app";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("❌ Connessione fallita: " . $conn->connect_error);
}
?>

βš™οΈ inserimento.php

<?php
require_once 'connessione.php';
$nome   = $_POST['nome'];
$prezzo = $_POST['prezzo'];
$stmt = $conn->prepare(
    "INSERT INTO prodotti (nome, prezzo) VALUES (?, ?)"
);
$stmt->bind_param("sd", $nome, $prezzo);
$stmt->execute();
echo "βœ… Prodotto salvato!";
$stmt->close();
$conn->close();
?>

πŸ” ricerca.php

<?php
require_once 'connessione.php';
$nome = $_GET['nome'];
$stmt = $conn->prepare(
    "SELECT * FROM prodotti WHERE nome = ?"
);
$stmt->bind_param("s", $nome);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo $row["nome"] . " β€” €" . $row["prezzo"] . "<br>";
}
?>

9. Sessione: cos'Γ¨, come funziona, a cosa serve

Sessione = un armadietto personale sul server, assegnato quando fai login.
Serve per ricordare chi sei mentre navighi, senza reinserire username e password ogni volta.

HTTP Γ¨ "senza memoria": ogni richiesta Γ¨ isolata. Le sessioni risolvono questo problema usando un cookie (numero dell'armadietto) che il browser rispedisce automaticamente a ogni pagina.
πŸ” Ciclo di vita:
  1. Login β†’ login.php verifica con password_verify().
  2. Crea $_SESSION['id'], $_SESSION['ruolo'].
  3. Browser riceve cookie PHPSESSID (numero armadietto).
  4. Ogni click β†’ browser rispedisce cookie β†’ server riconosce utente.
  5. Logout β†’ session_destroy() svuota l'armadietto.
πŸ‘€ Login
login.html β†’ form
login.php β†’ verifica password, crea $_SESSION
πŸ›‘οΈ Protezione pagina
session_start(); come prima riga
if (!isset($_SESSION['id'])) { header("Location: login.html"); exit; }
πŸšͺ Logout
session_destroy();
header("Location: index.html"); exit;
⚠️ "headers already sent"
Causa: output (spazio, echo, HTML) prima di header() o session_start().
Soluzioni: <?php come primo carattere, niente spazi prima, evita righe vuote dopo ?>, sempre exit dopo header().

10. Sicurezza

SQL Injection β†’ Sempre Prepared Statements.
Mai valori diretti nella query: … WHERE nome = '$nome' Γ¨ pericoloso. Usa ? + bind_param().
XSS β†’ htmlspecialchars().
echo htmlspecialchars($row["nome"]); converte <script> in codice innocuo.
Upload file β†’ Controlli obbligatori.
β€’ .htaccess in immagini/: blocca .php.
β€’ Tipo MIME: solo image/jpeg, image/png, image/gif, image/webp.
β€’ Limite dimensione (es. 2 MB).
β€’ Nome univoco: uniqid('img_', true) . '.' . $estensione.
β€’ move_uploaded_file() (unico metodo sicuro).

11. Riepilogo flusso completo

HTML Form
β†’
POST / GET
β†’
PHP riceve $_POST / $_GET
β†’
connessione.php β†’ $conn
β†’
Query con ?
β†’
bind_param()
β†’
execute()
β†’
fetch_assoc()
β†’
Output HTML

12. Concetti chiave

Concetto Significato
$_POST / $_GET Array associativi con i dati del form. Il name del campo HTML diventa la chiave dell'array associativo.
Prepared Statement + binding
1Β° Passo Query con ? (segnaposto). Separa comandi da dati: previene SQL Injection.
2Β°Passo bind_param("tipi", …)
Sostituisce i ? con i valori reali contenuti nell'array associativo $_POST ($_GET se Γ¨ una ricerrca) :"tipi" sono i tipi delle varibili sostituite dai segnaposto e possono essere s=stringa, i=intero, d=decimale, b=blob.
fetch_assoc() Legge una riga della tabella ottenuta attraverso la Query come array associativo: $row["nome"].
htmlspecialchars() Rende sicuri i dati utente prima di stamparli in HTML (previene XSS).
require_once Include le istruzioni di un file essenziale una sola volta. Se manca β†’ errore fatale.
$_FILES Array con dati file caricato in un form in cui c'Γ¨ input type="file".
Sessione Sessione = un armadietto personale sul server, assegnato quando fai login. Serve per ricordare chi sei mentre navighi, senza reinserire username e password ogni volta. HTTP Γ¨ "senza memoria": ogni richiesta Γ¨ isolata. Le sessioni risolvono questo problema usando un cookie (numero dell'armadietto) che il browser rispedisce automaticamente a ogni pagina..
In poche righe…
β€’ ? + bind_param() β†’ anti SQL Injection
β€’ htmlspecialchars() β†’ anti XSS
β€’ require_once per inlcudere istruzione file essenziali
β€’ Uso sessione per memorizzare dati dell'utente che altrimenti sarebbero persi nel paasaggio da una pagina all'altra del sito
β€’ header("Location: …") reindirizza ad un'altra pagina web, non deve essere preceduta da istruzioni di ouput HTML e deve essere seguitadall'istruzione exit;
β€’ $_POST = per inserimento (busta chiusa riservatezza)  |  $_GET = per ricerca (cartolina aperta dato inserito visibile nell'URL
β€’ L'array associativo Γ¨ un array in cui non esiste un legame tra la posizione di un valore ed il valore stesso, ma un legame diretto tra un'etichetta (chiave) e il dato contenuto (valore).