Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    47

    Gestire gli errori tornando sul form chiamante

    Ciao a tutti, ho un form per l'inserimento e l'aggiornamento di dati. Alla conferma viene lanciato uno script che provvede all'inserimento o all'aggiornamento del record.
    Ho letto che i controlli lato client in javascript possono essere facilmente bypassabili e quindi vorrei inserire una serie di controlli sui dati in questo script.
    In caso di controlli non superati come posso fare per tornare al form chiamante e contemporaneamente, su questo, mandare il messaggio con l'errore individuato.
    E più in generale qual'è la tecnica migliore per gestire queste cose?
    Grazie per i vostri consigli.

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Puoi usare questo come linea guida:

    Form nella pagina form.php
    Codice PHP:
    <?php session_start(); //questo va tassativamente all'inizio della pagina, prima di qualsiasi altra cosa ?>
    <form name="form1" method="post" action="script.php">
        Nome: <input type="text" name="nome" value="<?php isset($_SESSION['nome']) ? echo $_SESSION['nome'] : '' ?>" />
        <div style="color red"><?php isset($_SESSION['errore']) ? echo $_SESSION['errore'] : '' ?></div>

        Età: <input type="text" name="eta" value="<?php isset($_SESSION['eta']) ? echo $_SESSION['eta'] : '' ?>" />
        <div style="color red"><?php isset($_SESSION['errore']) ? echo $_SESSION['errore'] : '' ?></div>
        <input type="submit" name="submit" value="Invia" />
    </form>

    script.php
    Codice PHP:
    <?php
    session_start
    ();
    // reset eventuali errori precedenti
    unset($_SESSION['nome']);
    unset(
    $_SESSION['eta']);
    unset(
    $_SESSION['errore']);

    // verifica se è stato inserito un nome oppure no (campo nome obbligatorio)
    if ( ! isset($_POST['nome']) || $_POST['nome'] == '' )
    {
        
    // imposto solo l'età, se sono qui di sicuro nel campo nome non c'era scritto niente
        
    $_SESSION['eta'] = $_POST['eta'];
        
    $_SESSION['errore'] = 'Il campo nome è obbligatorio';

        
    header('Location: http://localhost/form.php');
    }
    // verifica se è stato inserita l'età oppure no (campo età obbligatorio)
    else if ( ! isset($_POST['eta']) || $_POST['eta'] == '' )
    {
        
    // imposto solo il nome, se sono qui di sicuro nel campo eta non c'era scritto niente
        
    $_SESSION['nome'] = $_POST['nome'];
        
    $_SESSION['nome'] = 'Il campo età è obbligatorio';

        
    header('Location: http://localhost/form.php');
    }
    else
    {
        
    // tutto ok, i campi sono stati compilati
    }
    ?>
    Non l'ho testato ma salvo qualche errore di battitura dovrebbe funzionare.
    Ultima modifica di Alhazred; 12-03-2016 a 20:35

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    47
    Grazie!
    L'ho provato però mi da questo errore: Parse error: syntax error, unexpected 'echo' (T_ECHO)
    su questa riga: <div style="color red"><?php isset($_SESSION['errore']) ? echo $_SESSION['errore'] : '' ?></div>

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Vero, è così
    Codice PHP:
    <div style="color: red"><?php echo isset($_SESSION['errore']) ? $_SESSION['errore'] : ''?></div>

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    47
    Grazie ancora!
    Solo che ora questa istruzione non intercetta il campo vuoto e quindi mi va ad inserire un record con chiave vuota (ma_des è la chiave principale della tabella):
    if ( ! isset($_POST['ma_des']) || $_POST['ma_des'] == '' )
    {
    $_SESSION['errore'] = 'Descrizione obbligatoria';
    header('Location: materie.php?ma_des=' . $ma_des);
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    47
    In particolare ho verificato che se sul form nel campo scrivo qualcosa e lo cancello con il backspace mi inserisce un record con chiave vuota. Ma il test lo faccio proprio per non inserire una record con chiave vuota...
    Ultima modifica di chigibi; 16-03-2016 a 19:32

  7. #7
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Io ti ho dato un'indicazione per quella che era la tua domanda: gestire errori e ritornare al form ripopolando i campi, non hai chiesto come fare la validazione.
    Per esempio usa trim() per essere sicuri che un solo spazio possa farti saltare il controllo == ''

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    47
    Ciao Alhazred, se ho chiesto è perchè mi avevi postato anche lo script e quindi pensavo di utilizzarlo. Avevo già provato anche con il trim() ma non intercetto ugualmente il campo vuoto. Sto facendo molte prove e guardando vari post ma c'è qualcosa che mi sfugge.
    Continuerò a fare altre prove.
    Grazie.

  9. #9
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Dipende da come hai usato il trim e dove lo hai messo, comunque, qui sotto trovi il codice un po' sistemato e funzionante.
    Chiaramente non usarlo così com'è, perché non è esaustivo, per esempio non verifica se nel campo età ci metti un numero (come dovresti) oppure qualsiasi altra cosa, verifica solo se il campo è compilato o no.

    form.php
    Codice PHP:
    <?php session_start(); ?>
    <form name="form1" method="post" action="script.php">
        Nome: <input type="text" name="nome" value="<?php echo isset($_SESSION['nome']) ? $_SESSION['nome'] : '' ?>" />
        <div style="color: red"><?php echo isset($_SESSION['errore_nome']) ? $_SESSION['errore_nome'] : '' ?></div>

        Età: <input type="text" name="eta" value="<?php echo isset($_SESSION['eta']) ? $_SESSION['eta'] : '' ?>" />
        <div style="color: red"><?php echo isset($_SESSION['errore_eta']) ? $_SESSION['errore_eta'] : '' ?></div>
        <input type="submit" name="submit" value="Invia" />
    </form>

    script.php
    Codice PHP:
    <?php
    session_start
    ();
    // reset eventuali errori precedenti
    unset($_SESSION['nome']);
    unset(
    $_SESSION['eta']);
    unset(
    $_SESSION['errore_nome']);
    unset(
    $_SESSION['errore_eta']);

    // dirà se sono stati rilevati problemi nella validazione
    $errori false;

    // verifica se è stato inserito un nome oppure no (campo nome obbligatorio)
    if ( ! isset($_POST['nome']) || trim($_POST['nome']) == '' )
    {
        
    $_SESSION['eta'] = $_POST['eta'];
        
    $_SESSION['errore_nome'] = 'Il campo nome è obbligatorio';
        
        
    // trovato un problema
        
    $errori true;
    }
    // verifica se è stato inserita l'età oppure no (campo età obbligatorio)
    if ( ! isset($_POST['eta']) || trim($_POST['eta']) == '' )
    {
        
    $_SESSION['nome'] = $_POST['nome'];
        
    $_SESSION['errore_eta'] = 'Il campo età è obbligatorio';

        
    // trovato un problema
        
    $errori true;
    }

    if ( ! 
    $errori )
    {
        echo 
    "tutto ok";
    }
    else
    {
        
    header('Location: http://localhost/form.php');
    }
    ?>

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    47
    Ti ringrazio ancora una volta per il codice che mi posti, però vorrei capire in cosa sbaglio per non ripetere lo stesso errore. E cioè se è un problema di controlli o altro. Infatti guardando il tuo script vedo che usi un solo header alla fine.
    Nel mio script quando trovo un errore imposto la variabile di sessione errore e subito punto al form, se invece i controlli sono superati inserisco (o aggiorno, è lo stesso form) il record e poi esco con header puntando però non al form ma ad un altro script (che poi è l'elenco dei record inseriti).
    A me succede che non vengono intercettati gli errori. Che il problema sia dovuto all'header? Se elimino quello finale e faccio un echo vedo che i controlli funzionano. Aggiungendo l'header in coda sembra che quello precedente non funziona. Forse non ce ne possono essere più di uno? In questo caso potrei metterne uno solo in coda parametrizzando il contenuto?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.