I moduli HTML per­met­to­no agli utenti di inserire dati di­ret­ta­men­te tramite un sito web, che possono poi essere salvati in un database. Rap­pre­sen­ta­no quindi l’in­ter­fac­cia tra il sito e il database, in modo che input come nomi, indirizzi e-mail o commenti vengano raccolti e gestiti in modo si­ste­ma­ti­co. In questa guida ti mostriamo come salvare con PHP le in­for­ma­zio­ni pro­ve­nien­ti da un modulo HTML in un database MySQL/MariaDB.

Managed Database Services
Con­cen­tra­ti sul tuo progetto, noi pensiamo al resto
  • Partner IONOS Cloud
  • Soluzioni fles­si­bi­li e su misura
  • Data center situati in Europa

Requisiti

Per salvare in modo af­fi­da­bi­le i dati pro­ve­nien­ti da un modulo HTML in un database MySQL o MariaDB, ti serve un ambiente che soddisfi i seguenti requisiti:

  • Server web con supporto PHP: un server web Apache o NGINX con PHP in­stal­la­to e attivato, così che gli script lato server possano elaborare le in­for­ma­zio­ni del modulo
  • Co­no­scen­ze di base in PHP e SQL: co­no­scen­ze fon­da­men­ta­li di PHP e SQL per creare il col­le­ga­men­to tra modulo e database e inserire cor­ret­ta­men­te i dati
  • Accesso alla con­fi­gu­ra­zio­ne del server web: pos­si­bi­li­tà di accesso al server web, così da poter eseguire script PHP, creare tabelle nel database ed even­tual­men­te con­fi­gu­ra­re i permessi
N.B.

Apache, MySQL/MariaDB e PHP fanno parte di un’in­stal­la­zio­ne standard e sono già in ese­cu­zio­ne. Se il tuo server è stato creato con un’in­stal­la­zio­ne minimale, devi in­stal­la­re e con­fi­gu­ra­re Apache, MySQL/MariaDB e PHP prima di poter procedere.

Inserire in­for­ma­zio­ni da un modulo HTML in MySQL/MariaDB: come fare

Per questo tutorial creiamo un sito web per un ri­sto­ran­te fittizio. L’obiettivo è dare ai clienti la pos­si­bi­li­tà di lasciare re­cen­sio­ni di­ret­ta­men­te tramite il sito. Ti mostriamo come i moduli HTML vengano elaborati da uno script PHP e come i dati inseriti vengano salvati in un database MySQL o MariaDB.

Primo passaggio: crea il database

Nel primo passaggio creiamo un database, così puoi ar­chi­via­re tutte le in­for­ma­zio­ni del modulo HTML nel database. Per farlo, accedi in­nan­zi­tut­to al client MySQL/MariaDB dalla riga di comando:

mysql -u root -p
bash

Crea ora un database per le re­cen­sio­ni uti­liz­zan­do il comando SQL CREATE DATABASE :

CREATE DATABASE reviews;
bash

Passa quindi a questo database:

USE reviews;
bash

Per il nostro esempio, per sem­pli­fi­ca­re creeremo una sola tabella. Questa tabella avrà i seguenti tre campi:

  • Un campo ID: questo campo verrà impostato su AUTO_INCREMENT. Questo parametro fa sì che un campo venga aumentato au­to­ma­ti­ca­men­te di uno per ogni nuovo record, in modo che ogni voce riceva un valore univoco.
  • Nome della persona che lascia la re­cen­sio­ne: qui viene uti­liz­za­to un campo di testo con una lunghezza fino a 100 caratteri.
  • Una va­lu­ta­zio­ne con stelle: una va­lu­ta­zio­ne numerica da 1 a 5, con il tipo di dati TINYINT.
  • Controlla i dettagli: un campo di testo memorizza dettagli o commenti alle va­lu­ta­zio­ni ed è di­men­sio­na­to con VARCHAR(4000) in modo da poter contenere circa 500 parole.

Crea ora la tabella con CREATE TABLE:

CREATE TABLE user_review (
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reviewer_name VARCHAR(100),
star_rating TINYINT,
details VARCHAR(4000)
);
bash

Secondo passaggio: crea l’utente

Per motivi di sicurezza è con­si­glia­bi­le creare un utente univoco per ogni database, so­prat­tut­to quando si accede a questo database da un sito web.

Il seguente comando di MariaDB crea un utente chiamato review_site con la password JxSLRkdutW e gli concede l’accesso al database con le re­cen­sio­ni:

GRANT ALL ON reviews.* TO review_site@localhost IDENTIFIED BY 'JxSLRkdutW';
bash

Se utilizzi MySQL, nelle versioni attuali il comando GRANT ... IDENTIFIED BY ... non è più con­si­glia­to. Invece, è pre­fe­ri­bi­le creare prima l’utente con CREATE USER e poi usare GRANT:

CREATE USER 'review_site'@'localhost' IDENTIFIED BY 'JxSLRkdutW';
GRANT ALL PRIVILEGES ON reviews.* TO 'review_site'@'localhost';
FLUSH PRIVILEGES;
bash

Terzo passaggio: crea il modulo HTML per il sito web

Nel passaggio suc­ces­si­vo creiamo il modulo di va­lu­ta­zio­ne per le re­cen­sio­ni dei clienti. A questo scopo, crea un file chiamato reviews.html nel tuo spazio web e aprilo per la modifica. Per creare ad esempio il file in /var/www/html con l’editor di testo nano, il comando è:

sudo nano /var/www/html/reviews.html
bash

Ora inserisci il seguente contenuto in questo file:

<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Valutazione del ristorante </title>
</head>
<body>
<p>Come ti sei trovato da noi?</p>
<form action="addreview.php" method="POST">
Il tuo nome: <input type="text" name="reviewer_name"><br><br>
Quante stelle ci daresti?
<select name="star_rating">
<option value="1">1 stella</option>
<option value="2">2 stelle</option>
<option value="3">3 stelle</option>
<option value="4">4 stelle</option>
<option value="5">5 stelle</option>
</select><br><br>
La tua valutazione: <br>
<textarea name="details" rows="10" cols="30"></textarea><br><br>
<input type="submit" value="Submit" name="submit">
</form>
</body>
</html>
html

Di seguito trovi alcuni aspetti da tenere presenti per questo semplice modulo HTML:

  • Questo modulo utilizza il metodo POST per passare i dati allo script PHP addreview.php.
  • Il nome di ogni campo di input verrà uti­liz­za­to nel passaggio suc­ces­si­vo come nome della variabile PHP. Di norma è con­si­glia­bi­le usare per questi valori il nome del campo della tabella del database.
  • Non fidarti mai dell’input degli utenti. In questo esempio, per la va­lu­ta­zio­ne con le stelle ci serve un numero da 1 a 5. Se chie­des­si­mo agli utenti di inserire ma­nual­men­te la va­lu­ta­zio­ne, po­treb­be­ro fornire un valore non valido. È quindi meglio chiedere loro di scegliere valori pre­de­fi­ni­ti da un menu a discesa.

Quarto passaggio: crea lo script PHP

Nell’ultimo passaggio creiamo lo script PHP che inserisce i dati del modulo HTML nel database. A questo scopo, sta­bi­li­sci una con­nes­sio­ne a MySQL o MariaDB, in­ter­cet­ta l’input degli utenti dal modulo e salvalo nella tabella creata in pre­ce­den­za. Crea in­nan­zi­tut­to un file addreview.php nel tuo spazio web e aprilo per la modifica. Qui verrà inserito il codice PHP. Per creare il file in /var/www/html usando nano, il comando è:

sudo nano /var/www/html/addreview.php
bash

Ogni script PHP deve iniziare con il tag di apertura PHP:

<?php
php

Aggiungi quindi un blocco di con­nes­sio­ne MySQL/MariaDB con l’indirizzo del server (localhost), il nome del database, il nome utente del database e la relativa password.

$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db = "reviews";
php

La seguente sezione di codice consente di stabilire una con­nes­sio­ne al database usando la funzione mysqli_connect. Inoltre, lo script re­sti­tui­sce un errore se la con­nes­sio­ne non riesce:

$dbconnect = mysqli_connect($hostname, $username, $password, $db);
if (mysqli_connect_errno()) {
die("Database connection failed: " . mysqli_connect_error());
}
php

Nel passaggio suc­ces­si­vo re­cu­pe­ria­mo i dati inseriti dall’utente tramite il modulo HTML e li me­mo­riz­zia­mo in variabili PHP, così da poterli poi usare per l’ela­bo­ra­zio­ne e l’in­se­ri­men­to nel database:

if (isset($_POST['submit'])) {
$reviewer_name = $_POST['reviewer_name'];
$star_rating = $_POST['star_rating'];
$details = $_POST['details'];
php

Suc­ces­si­va­men­te, i dati inseriti dall’utente devono essere scritti nel database. A questo scopo creiamo una query SQL INSERT che prende i valori dalle variabili PHP e li inserisce nei campi cor­ri­spon­den­ti della tabella user_review. Per evitare SQL in­jec­tions uti­liz­zia­mo qui i prepared statement:

$stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
$stmt->execute();
php

Aggiungi un’istru­zio­ne PHP if-else che mostri un messaggio di errore se il processo non va a buon fine. Se il processo viene concluso, ringrazia l’utente per la sua va­lu­ta­zio­ne:

if ($stmt->execute()) {
echo "Grazie per la tua valutazione.";
} else {
die("Si è verificato un errore.");
}
$stmt->close();
}
php

Infine, chiudi l’istru­zio­ne if aperta e aggiungi un tag PHP di chiusura:

}
?>
php
N.B.

Se ricevi il messaggio di errore “Con­nes­sio­ne al database non riuscita: accesso per l’utente ‘review_site’@‘localhost’ negato (con password: SÌ)”, puoi testare le cre­den­zia­li provando ad accedere a MySQL/MariaDB dalla riga di comando con il comando mysql -u review_site -p.

Quinto passaggio: testa lo script

Per testare lo script, visita reviews.html in un browser e invia quindi una va­lu­ta­zio­ne di esempio. Suc­ces­si­va­men­te accedi al database delle re­cen­sio­ni con il client MySQL/MariaDB dalla riga di comando:

mysql -u root -p reviews
bash

Usa SELECT * FROM user_review per vi­sua­liz­za­re l’intero contenuto della tabella:

MariaDB [reviews]> SELECT * FROM user_review;
+----+---------------+-------------+---------------------------------------------------------+
| id | reviewer_name | star_rating | details                                                 |
+----+---------------+-------------+---------------------------------------------------------+
|  1 | Ben           |           5 | Pizza squisita!                                        |
|  2 | Eleonora        |           1 | La pizza non è così buona.                                  |
+----+---------------+-------------+---------------------------------------------------------+
2 rows in set (0.00 sec)
bash

Lo script PHP completo è il seguente:

<?php
// Dati di connessione al database
$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db       = "reviews";
// Stabilire la connessione al database
$dbconnect = new mysqli($hostname, $username, $password, $db);
// Controllare la connessione
if ($dbconnect->connect_error) {
    die("Connessione al database non riuscita: " . $dbconnect->connect_error);
}
// Eseguire solo se il modulo è stato inviato
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) {
    // Convalidare i dati inseriti (controllo minimo)
    $reviewer_name = trim($_POST['reviewer_name'] ?? '');
    $star_rating   = intval($_POST['star_rating'] ?? 0);
    $details       = trim($_POST['details'] ?? '');
    // Validazione semplice
    if ($reviewer_name === '' || $star_rating < 1 || $star_rating > 5 || $details === '') {
        die("Compila correttamente tutti i campi.");
    }
    // Creare prepared statement
    $stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
    
    if ($stmt === false) {
        die("Errore del database: " . $dbconnect->error);
    }
    $stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
    // Eseguire lo statement
    if ($stmt->execute()) {
        echo "Grazie per la tua valutazione.";
    } else {
        die("Si è verificato un errore: " . $stmt->error);
    }
    $stmt->close();
}
// Chiudere la connessione
$dbconnect->close();
?>
php
Vai al menu prin­ci­pa­le