Strumenti: XAMPP (Apache + MySQL + PHP) | Progetto: Catalogo Prodotti
index.html Homeinserimento.html Form inserimentoricerca.html Form ricercalogin.html Form login
connessione.php Apre il DBinserimento.php Salva datiricerca.php Legge datilogin.php Autentica, crea sessionelogout.php Distrugge sessione
web_appprodotti: id, nome, descrizione, prezzo, immagineutenti: id, username, password(hash), tipo
C:\xampp\htdocs\progetto\immagini\ Foto prodottihttp://localhost/progetto/
inserimento.html$_POSTINSERT β¦ VALUES (?, ?, ?)bind_param("ssd", β¦)execute() salva nel DBricerca.htmlricerca.php?nome=laptop$_GET['nome']SELECT * FROM prodotti WHERE nome = ?bind_param("s", $nome)fetch_assoc() + while$_POST['nome'] β valore del campo con name="nome".fetch_assoc(), $row["prezzo"] β valore colonna prezzo.
| π¨ 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'] |
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>";
}
?>
login.php verifica con password_verify().$_SESSION['id'], $_SESSION['ruolo'].PHPSESSID (numero armadietto).session_destroy() svuota l'armadietto.login.html β formlogin.php β verifica password, crea $_SESSION
session_start(); come prima rigaif (!isset($_SESSION['id'])) { header("Location: login.html"); exit; }
session_destroy();header("Location: index.html"); exit;
header() o session_start().<?php come primo carattere, niente spazi prima, evita righe vuote dopo ?>, sempre exit dopo header().
β¦ WHERE nome = '$nome' Γ¨ pericoloso. Usa ? + bind_param().
htmlspecialchars().echo htmlspecialchars($row["nome"]); converte <script> in codice innocuo.
.htaccess in immagini/: blocca .php.image/jpeg, image/png, image/gif, image/webp.uniqid('img_', true) . '.' . $estensione.move_uploaded_file() (unico metodo sicuro).
$_POST / $_GETconnessione.php β $conn?bind_param()execute()fetch_assoc()| 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.. |
? + bind_param() β anti SQL Injectionhtmlspecialchars() β anti XSSrequire_once per inlcudere istruzione file essenzialiheader("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