« Ritorna al blog

Ritorna alla lista completa degli articoli

Mettiti alla prova: processare i dati di un modulo

PHP - SFIDE - gennaio 17, 2022

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

Mettiti alla prova: processare i dati di un modulo

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>
Mettiti alla prova: processare i dati di un modulo
Mettiti alla prova: processare i dati di un modulo