« Ritorna al blog
Ritorna alla lista completa degli articoli
Mettiti alla prova: processare i dati di un modulo
PHP - SFIDE - gennaio 17, 2022In questo esercizio costruiremo un modulo per l'invio dei dati con i controlli più usati, mantenendo i dati immessi anche dopo l'invio. Non ci occuperemo della verifica dei dati prima dell'inserimento in un ipotetico database ma come vengono processati e quali vengono inviati a seconda delle scelte dell'utente.
Il modulo comprende dei dati obbligatori e dei dati facoltativi. Bisogna fare attenzione ai controlli a scelta multipla in quanto vengono trattati come vettori o array. Nell'esercizio viene già programmato il controllo dei campi obbligatori, la verifica del formato dell'email e della sicurezza di una password.
Lo scopo è visualizzare, attraverso un ciclo foreach, i dati inviati dall'utente per avere un quadro generale, come avviene solitamente in fase di debug o test. Per prima cosa bisogna copiare il file seguente:
start.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Questionario</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
</head>
<body>
<?php
function display_error_msg($msg)
{
$error = !(empty($msg)) ? '<div class="text-danger fw-bold"><i class="bi bi-exclamation-circle-fill"></i> ' . $msg . '</div>' : '';
return $error;
}
function display_valid_msg($msg)
{
$valid = !(empty($msg)) ? '<div class="text-success fw-bold"><i class="bi bi-check-circle-fill"></i> ' . $msg . '</div>' : '';
return $valid;
}
function required_field($field)
{
$field = !empty($field) ? display_valid_msg("completato") : display_error_msg("obbligatorio");
return $field;
}
function required_email($email)
{
$res = !empty($email) ? "" : display_error_msg("obbligatorio");
if ($res == "") {
$email = filter_var($email, FILTER_VALIDATE_EMAIL) ? display_valid_msg("completato") : display_error_msg("formato non valido");
} else {
$email = $res;
}
return $email;
}
function required_password($pwd)
{
$errore = '';
if (strlen($pwd) < 8) {
$errore .= display_error_msg("Password troppo corta!");
}
if (!preg_match("#[0-9]+#", $pwd)) {
$errore .= display_error_msg("La password deve includere almeno un numero!");
}
if (!preg_match("#[a-zA-Z]+#", $pwd)) {
$errore .= display_error_msg("La password deve includere almeno una lettera!");
}
return empty($errore) ? display_valid_msg("completato") : $errore;
}
// Campi obbligatori
$form_email = "";
$required_email = '';
$form_password = "";
$required_password = "";
$form_titolo_studio = "";
$required_titolo_studio = "";
$form_films_preferiti = array();
$required_films_preferiti = '';
$form_sesso = array();
$required_sesso = "";
$form_hobby = array();
$required_hobby = "";
// Campi non obbligatori
$form_marketing = array();
$form_gradimento = 0;
$form_note = "";
// Stampa dei dati
$riepilogo = "";
// POST
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Invio del form - Processo i dati
if (isset($_POST["submit"])) {
// Variabili del form
$form_email = $_POST["form_email"];
$form_password = $_POST["form_password"];
$form_titolo_studio = $_POST["form_titolo_studio"];
$form_films_preferiti = !empty($_POST["form_films_preferiti"]) ? $_POST["form_films_preferiti"] : array();
$form_sesso = !empty($_POST["form_sesso"]) ? $_POST["form_sesso"] : array();
$form_hobby = !empty($_POST["form_hobby"]) ? $_POST["form_hobby"] : array();
$form_marketing = !empty($_POST["form_marketing"]) ? $_POST["form_marketing"] : array();
$form_gradimento = $_POST["form_gradimento"];
$form_note = $_POST["form_note"];
// Verifica campi obbligatori
$required_email = required_email($form_email);
$required_password = required_password($form_password);
$required_titolo_studio = required_field($form_titolo_studio);
$required_films_preferiti = required_field($form_films_preferiti);
$required_sesso = required_field($form_sesso);
$required_hobby = required_field($form_hobby);
// Invio del form - Processo i dati
$riepilogo .= '<hr>';
foreach ($_POST as $item => $value) {
// da completare
}
$riepilogo .= '<hr>';
}
}
?>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="py-5 text-center">
<h2>Questionario</h2>
<p class="lead">Processare i dati di un modulo.</p>
</div>
<!-- riepilogo formattato dei dati inviati in caso di invio -->
<?php echo $riepilogo; ?>
<!-- riepilogo in formato dump dei dati inviati in caso di invio -->
<?php echo !(empty($_POST)) ? "<pre>" . var_dump($_POST) . "</pre>" : ""; ?>
<form id="form" name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset>
<legend>Campi obbligatori</legend>
<div class="row">
<div class="form-group col-md-6 mb-3">
<label for="form_email">Email</label>
<input type="text" class="form-control" id="form_email" name="form_email" aria-describedby="email" placeholder="Email..." value="<?php echo $form_email; ?>">
<small class="form-text text-muted">Non condividere la tua email.</small>
<?php echo $required_email; ?>
</div>
<div class="form-group col-md-6 mb-3">
<label for="form_password">Password</label>
<input type="password" class="form-control" id="form_password" name="form_password" placeholder="Password..." value="<?php echo $form_password; ?>">
<small class="form-text text-muted">Non condividere mai la tua password.</small>
<?php echo $required_password; ?>
</div>
</div>
<div class="row">
<div class="form-group col-md-3 mb-3">
<label for="form_titolo_studio">Titolo di studio</label>
<select class="form-select" id="form_titolo_studio" name="form_titolo_studio">
<option <?php echo $form_titolo_studio == "" ? "selected" : ""; ?> value="">Selezionare</option>
<option <?php echo $form_titolo_studio == "diploma" ? "selected" : ""; ?> value="diploma">Diploma</option>
<option <?php echo $form_titolo_studio == "laurea" ? "selected" : ""; ?> value="laurea">Laurea</option>
<option <?php echo $form_titolo_studio == "specialistica" ? "selected" : ""; ?> value="specialistica">Specialistica</option>
</select>
<?php echo $required_titolo_studio; ?>
</div>
<div class="form-group col-md-3 mb-3">
<label for="form_films_preferiti">Film preferiti</label>
<select multiple="multiple" class="form-select" id="form_films_preferiti" name="form_films_preferiti[]">
<option <?php echo in_array("spiderman", $form_films_preferiti) ? "selected" : ""; ?> value="spiderman">Spiderman</option>
<option <?php echo in_array("matrix", $form_films_preferiti) ? "selected" : ""; ?> value="matrix">Matrix</option>
<option <?php echo in_array("alice_paese_meraviglie", $form_films_preferiti) ? "selected" : ""; ?> value="alice_paese_meraviglie">Alice nel paese delle meraviglie</option>
<option <?php echo in_array("la_bugia", $form_films_preferiti) ? "selected" : ""; ?> value="la_bugia">La bugia</option>
<option <?php echo in_array("terminator", $form_films_preferiti) ? "selected" : ""; ?> value="terminator">Terminator</option>
</select>
<div class="form-text text-muted">Premi CTRL per selezionarne di più</div>
<?php echo $required_films_preferiti; ?>
</div>
<div class="form-group col-md-3 mb-3">
<label class="form-label">Sesso</label>
<div class="form-check">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="form_sesso[]" id="maschio" value="maschio" <?php echo in_array("maschio", $form_sesso) ? 'checked' : ''; ?>>
Maschio
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="form_sesso[]" id="femmina" value="femmina" <?php echo in_array("femmina", $form_sesso) ? 'checked' : ''; ?>>
Femmina
</label>
</div>
<?php echo $required_sesso; ?>
</div>
<div class="form-group col-md-3 mb-3">
<label class="form-label">I tuoi hobby preferiti</label>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="calcio" id="form_calcio" name="form_hobby[]" <?php echo in_array("calcio", $form_hobby) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_calcio">
Calcio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="tennis" id="form_tennis" name="form_hobby[]" <?php echo in_array("tennis", $form_hobby) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_tennis">
Tennis
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="nuoto" id="form_nuoto" name="form_hobby[]" <?php echo in_array("nuoto", $form_hobby) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_nuoto">
Nuoto
</label>
</div>
<?php echo $required_hobby; ?>
</div>
</div>
</fieldset>
<fieldset>
<legend>Campi facoltativi</legend>
<div class="row">
<div class="form-group col-md-6 mb-3">
<label class="form-label">Marketing</label>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="form_invio_email_promozionali" name="form_marketing[]" value="invio_email_promozionali" <?php echo in_array("invio_email_promozionali", $form_marketing) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_invio_email_promozionali">Mandami email promozionali</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="form_contattami_per_altri_questionari" name="form_marketing[]" value="contattami_per_altri_questionari" <?php echo in_array("contattami_per_altri_questionari", $form_marketing) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_contattami_per_altri_questionari">Contattami per altri questionari</label>
</div>
</div>
<div class="form-group col-md-6">
<label for="form_gradimento" class="form-label">Gradimento del questionario da zero a 100</label>
<input type="range" class="form-range" min="0" max="100" step="1" id="form_gradimento" name="form_gradimento" value="<?php echo $form_gradimento; ?>">
</div>
</div>
<div class="row">
<div class="form-group col-md-12 mb-3">
<label for="form_note">Note</label>
<textarea class="form-control" id="form_note" name="form_note" rows="3"><?php echo $form_note; ?></textarea>
</div>
</div>
<div class="d-grid gap-2 mb-3">
<button type="submit" name="submit" class="btn btn-primary">Invia</button>
</div>
</fieldset>
</form>
</div>
</div>
</div>
<!-- Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
Dovete concentrarvi sul commento "da completare". Prima di cimentarvi nello scrivere il codice necessario, provate prima l'invio del modulo. Viene già fatta un'anteprima dei dati attraverso la funzione var_dump().
Il risultato che bisognerà raggiungere è il seguente:
Per maggiori dettagli guardate anche le immagini caricate per questo articolo.
finish.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Questionario</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
</head>
<body>
<?php
function display_error_msg($msg)
{
$error = !(empty($msg)) ? '<div class="text-danger fw-bold"><i class="bi bi-exclamation-circle-fill"></i> ' . $msg . '</div>' : '';
return $error;
}
function display_valid_msg($msg)
{
$valid = !(empty($msg)) ? '<div class="text-success fw-bold"><i class="bi bi-check-circle-fill"></i> ' . $msg . '</div>' : '';
return $valid;
}
function required_field($field)
{
$field = !empty($field) ? display_valid_msg("completato") : display_error_msg("obbligatorio");
return $field;
}
function required_email($email)
{
$res = !empty($email) ? "" : display_error_msg("obbligatorio");
if ($res == "") {
$email = filter_var($email, FILTER_VALIDATE_EMAIL) ? display_valid_msg("completato") : display_error_msg("formato non valido");
} else {
$email = $res;
}
return $email;
}
function required_password($pwd)
{
$errore = '';
if (strlen($pwd) < 8) {
$errore .= display_error_msg("Password troppo corta!");
}
if (!preg_match("#[0-9]+#", $pwd)) {
$errore .= display_error_msg("La password deve includere almeno un numero!");
}
if (!preg_match("#[a-zA-Z]+#", $pwd)) {
$errore .= display_error_msg("La password deve includere almeno una lettera!");
}
return empty($errore) ? display_valid_msg("completato") : $errore;
}
// Campi obbligatori
$form_email = "";
$required_email = '';
$form_password = "";
$required_password = "";
$form_titolo_studio = "";
$required_titolo_studio = "";
$form_films_preferiti = array();
$required_films_preferiti = '';
$form_sesso = array();
$required_sesso = "";
$form_hobby = array();
$required_hobby = "";
// Campi non obbligatori
$form_marketing = array();
$form_gradimento = 0;
$form_note = "";
// Stampa dei dati
$riepilogo = "";
// POST
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Invio del form - Processo i dati
if (isset($_POST["submit"])) {
// Variabili del form
$form_email = $_POST["form_email"];
$form_password = $_POST["form_password"];
$form_titolo_studio = $_POST["form_titolo_studio"];
$form_films_preferiti = !empty($_POST["form_films_preferiti"]) ? $_POST["form_films_preferiti"] : array();
$form_sesso = !empty($_POST["form_sesso"]) ? $_POST["form_sesso"] : array();
$form_hobby = !empty($_POST["form_hobby"]) ? $_POST["form_hobby"] : array();
$form_marketing = !empty($_POST["form_marketing"]) ? $_POST["form_marketing"] : array();
$form_gradimento = $_POST["form_gradimento"];
$form_note = $_POST["form_note"];
// Verifica campi obbligatori
$required_email = required_email($form_email);
$required_password = required_password($form_password);
$required_titolo_studio = required_field($form_titolo_studio);
$required_films_preferiti = required_field($form_films_preferiti);
$required_sesso = required_field($form_sesso);
$required_hobby = required_field($form_hobby);
// Invio del form - Processo i dati
$riepilogo .= '<hr>';
foreach ($_POST as $item => $value) {
// da completare
if ($item == "submit") continue;
if (is_array($_POST[$item])) {
foreach ($_POST[$item] as $key => $value) {
$riepilogo .= "<b>" . $item . " " . ++$key . "</b>:" . " " . $value . "<br>";
}
} else {
$riepilogo .= "<b>" . $item . "</b>:" . " " . $value . "<br>";
}
}
$riepilogo .= '<hr>';
}
}
?>
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="py-5 text-center">
<h2>Questionario</h2>
<p class="lead">Processare i dati di un modulo.</p>
</div>
<!-- riepilogo formattato dei dati inviati in caso di invio -->
<?php echo $riepilogo; ?>
<!-- riepilogo in formato dump dei dati inviati in caso di invio -->
<?php echo !(empty($_POST)) ? "<pre>" . var_dump($_POST) . "</pre>" : ""; ?>
<form id="form" name="form" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset>
<legend>Campi obbligatori</legend>
<div class="row">
<div class="form-group col-md-6 mb-3">
<label for="form_email">Email</label>
<input type="text" class="form-control" id="form_email" name="form_email" aria-describedby="email" placeholder="Email..." value="<?php echo $form_email; ?>">
<small class="form-text text-muted">Non condividere la tua email.</small>
<?php echo $required_email; ?>
</div>
<div class="form-group col-md-6 mb-3">
<label for="form_password">Password</label>
<input type="password" class="form-control" id="form_password" name="form_password" placeholder="Password..." value="<?php echo $form_password; ?>">
<small class="form-text text-muted">Non condividere mai la tua password.</small>
<?php echo $required_password; ?>
</div>
</div>
<div class="row">
<div class="form-group col-md-3 mb-3">
<label for="form_titolo_studio">Titolo di studio</label>
<select class="form-select" id="form_titolo_studio" name="form_titolo_studio">
<option <?php echo $form_titolo_studio == "" ? "selected" : ""; ?> value="">Selezionare</option>
<option <?php echo $form_titolo_studio == "diploma" ? "selected" : ""; ?> value="diploma">Diploma</option>
<option <?php echo $form_titolo_studio == "laurea" ? "selected" : ""; ?> value="laurea">Laurea</option>
<option <?php echo $form_titolo_studio == "specialistica" ? "selected" : ""; ?> value="specialistica">Specialistica</option>
</select>
<?php echo $required_titolo_studio; ?>
</div>
<div class="form-group col-md-3 mb-3">
<label for="form_films_preferiti">Film preferiti</label>
<select multiple="multiple" class="form-select" id="form_films_preferiti" name="form_films_preferiti[]">
<option <?php echo in_array("spiderman", $form_films_preferiti) ? "selected" : ""; ?> value="spiderman">Spiderman</option>
<option <?php echo in_array("matrix", $form_films_preferiti) ? "selected" : ""; ?> value="matrix">Matrix</option>
<option <?php echo in_array("alice_paese_meraviglie", $form_films_preferiti) ? "selected" : ""; ?> value="alice_paese_meraviglie">Alice nel paese delle meraviglie</option>
<option <?php echo in_array("la_bugia", $form_films_preferiti) ? "selected" : ""; ?> value="la_bugia">La bugia</option>
<option <?php echo in_array("terminator", $form_films_preferiti) ? "selected" : ""; ?> value="terminator">Terminator</option>
</select>
<div class="form-text text-muted">Premi CTRL per selezionarne di più</div>
<?php echo $required_films_preferiti; ?>
</div>
<div class="form-group col-md-3 mb-3">
<label class="form-label">Sesso</label>
<div class="form-check">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="form_sesso[]" id="maschio" value="maschio" <?php echo in_array("maschio", $form_sesso) ? 'checked' : ''; ?>>
Maschio
</label>
</div>
<div class="form-check">
<label class="form-check-label">
<input type="radio" class="form-check-input" name="form_sesso[]" id="femmina" value="femmina" <?php echo in_array("femmina", $form_sesso) ? 'checked' : ''; ?>>
Femmina
</label>
</div>
<?php echo $required_sesso; ?>
</div>
<div class="form-group col-md-3 mb-3">
<label class="form-label">I tuoi hobby preferiti</label>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="calcio" id="form_calcio" name="form_hobby[]" <?php echo in_array("calcio", $form_hobby) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_calcio">
Calcio
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="tennis" id="form_tennis" name="form_hobby[]" <?php echo in_array("tennis", $form_hobby) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_tennis">
Tennis
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="nuoto" id="form_nuoto" name="form_hobby[]" <?php echo in_array("nuoto", $form_hobby) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_nuoto">
Nuoto
</label>
</div>
<?php echo $required_hobby; ?>
</div>
</div>
</fieldset>
<fieldset>
<legend>Campi facoltativi</legend>
<div class="row">
<div class="form-group col-md-6 mb-3">
<label class="form-label">Marketing</label>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="form_invio_email_promozionali" name="form_marketing[]" value="invio_email_promozionali" <?php echo in_array("invio_email_promozionali", $form_marketing) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_invio_email_promozionali">Mandami email promozionali</label>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="form_contattami_per_altri_questionari" name="form_marketing[]" value="contattami_per_altri_questionari" <?php echo in_array("contattami_per_altri_questionari", $form_marketing) ? 'checked' : ''; ?>>
<label class="form-check-label" for="form_contattami_per_altri_questionari">Contattami per altri questionari</label>
</div>
</div>
<div class="form-group col-md-6">
<label for="form_gradimento" class="form-label">Gradimento del questionario da zero a 100</label>
<input type="range" class="form-range" min="0" max="100" step="1" id="form_gradimento" name="form_gradimento" value="<?php echo $form_gradimento; ?>">
</div>
</div>
<div class="row">
<div class="form-group col-md-12 mb-3">
<label for="form_note">Note</label>
<textarea class="form-control" id="form_note" name="form_note" rows="3"><?php echo $form_note; ?></textarea>
</div>
</div>
<div class="d-grid gap-2 mb-3">
<button type="submit" name="submit" class="btn btn-primary">Invia</button>
</div>
</fieldset>
</form>
</div>
</div>
</div>
<!-- Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>