Visualizzazione risultati 1 fino 12 di 12
Like Tree1Likes
  • 1 Post By darbula

Discussione: verifica campi vuoti

  1. #1
    Guest

    Predefinito verifica campi vuoti

    Salve a tutti,

    Superato il primo scoglio della memorizzazione campi nel db ora c'è un secondo scoglio da superare. Sto cercando di applicare dei controlli se li possiamo chiamare di sicurezza affinchè tutti i campi vengono compilati e non lasciati vuoti. Mi hanno consigliato su questo forum di adoperare empty. Ho buttato giù qualcosa del genere. Ecco l'esempio:

    Codice PHP:

    <?php


    require_once("connettimysqli.php");
    require_once(
    "data.php");
    echo
    "</hr>";
    if(!empty(
    $_POST)){


    $id = mysqli_real_escape_string($con, $_POST['id']);
    $cognome = mysqli_real_escape_string($con, $_POST['cognome']);
    $nome = mysqli_real_escape_string($con, $_POST['nome']);
    $username = mysqli_real_escape_string($con, $_POST['username']);

    $avviso = "Attenzione il campo non deve essere vuoto";

    echo
    '<div id ="messaggio">';

    if (empty(
    $cognome))
    echo
    $messaggio;


    $query=("INSERT INTO utenti (cognome, nome, username) VALUES('$cognome','$nome','$username')");
    $result=mysqli_query($con,$query);

    if(
    $result){
    echo(
    "<p> Inserimento avvenuto correttamente <p>");
    } else{
    echo(
    "Inserimento non eseguito. Errore: ".mysqli_error($con));
    }
    }
    ?>
    </div>
    </body>
    </html>
    Come potete vedere questa è la parte interessata:

    Codice PHP:

    $avviso
    = "Attenzione il campo non deve essere vuoto";

    echo
    '<div id ="messaggio">';

    if (empty(
    $cognome))
    echo
    $messaggio;
    Però sembra non funzionare, in quanto mi fa memorizzare lo stesso i campi vuoti senza far comparire il messaggio di errore ??? Come posso migliorarlo ??? Grazie a voi.

  2. #2
    Guest

    Predefinito

    Ciao, non so se il modo in cui hai fatto possa essere giusto ma a me suona strano.
    Dovresti modificare specificando le variabili che vuoi controllare:
    Codice PHP:
    if(!empty($_POST['cognome'])){...}
    E cosi via.

  3. #3
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Prima di controllare che un valore in un vettore sia vuoto, devi controllare che esso sia definito:
    Codice PHP:
    if (isset($_POST['cognome']) && !empty($_POST['cognome'])) { ... }

  4. #4
    Guest

    Predefinito

    Grazie ad entrambi vi faccio sapere.

  5. #5
    Guest

    Predefinito verifica campi vuoti

    Ho provato in questa maniera qua:

    Codice PHP:
    if (isset($_POST['cognome']) && !empty($_POST['cognome'])) {echo $messaggio;}
    Ho provato a lasciare un campo vuoto ma ovviamente mi continua a memorizzare anche se vuoto inviandomi "Inserimento avvenuto correttamente" e non il messaggio che mi dice "campo necessario". ora pensavo di fare una cosa, in teoria per far funzionare questo bisognerebbe disabilitare il tasto "Invio dati" con disabled e quando tutti i campi sono completati riabilitarlo, ma a questo punto è inutile fare la verifica dei campi vuoti. o sbaglio ????

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    L'uso di isset ed empty era il suggerimento, i risultati che osservi dipendono da come li hai integrati nel codice.

    Riguardo all'uso di disabled, immagino tu indenda usare JavaScript per controllare in tempo reale e lato client che tutti i campi siano compilati. È più semplice usare l'attributo required negli elementi di input.
    Ciò nondimeno i controlli lato server con PHP sono comunque necessari: un utente malevolo potrebbe inviare una richiesta POST alla pagina PHP senza passare per il modulo HTML (dunque ignorando eventuali controlli HTML/JavaScript), oppure disabilitare JavaScript.

  7. #7
    Guest

    Predefinito

    Il problema è che qualsiasi variante ci metto tranne required che funziona a meraviglia, ho fatto degli esperimenti ma praticamente acqua fresca non gli fa niente e quindi passa lla registrazione. Mentre se adopero required l'unica cosa che non mi piace molto è il fumetto che appare quando salti il campo, allora sarebbe perfetto se non ci fosse il fumetto. Un ultima cosa, pensavo il disabled si potesse adperare anche in php e non solo in java :P Quindi l'idea di disabilitarlo è deceduta :P preferisco required se non ci sono altre soluzioni al momento. Grazie.

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    praticamente $_POST solo è sempre definito "0" quindi ho nel tuo form html aggiungi il submit con name e value mentre in php verifichi prima $_POST['name'] se viene inviato il valore, dopo verifichi che il cognome non sia vuoto,dopo che il nome non sia vuoto ecc. e per ultimo le variabili che contengono i dati per mysql. ps. si può utilizzare benissimo soltanto la funzione empty() vuoto anche su una variabile non valorizzata, cioè non è vietato e non produce errore.
    mzanella likes this.

  9. #9
    Guest

    Predefinito

    Grazie delle info darbula, ci proverò e ti dirò se ci sono riuscito. Oggi e domani è un miracolo che ho tutto il tempo per me per stare al pc. In genere non dico sempre ma spesso sono impegnato in cucina a cucinare :P Ecco perchè ogni volta mi tocca re-iniziare da capo, perchè interrompo duecentomila volte. Probabilmente se l'avessi fatto tutti i giorni sarei una spada ora e non domanderei :P

  10. #10
    L'avatar di tdef
    tdef non è connesso Utente giovane
    Data registrazione
    12-12-2011
    Residenza
    Udine
    Messaggi
    81

    Predefinito

    Attenzione nell'uso di empty() http://de2.php.net/manual/it/function.empty.php
    Nel controllo dell'array post si va facilmente in errore perché il protocollo http non passa tutto.
    In particolare: una input text con value vuoto viene passato effettivamente come valore vuoto ( esistente ma vuoto ) una checkbox o radiobutton non verificato non passa proprio, cioè si comporta come se la variabile non esiste.
    In un array di campi ( text, button, checkbox, ecc. ) vale sempre il campo ( o i campi ) valorizzato quindi se:
    Codice HTML:
    <input type="text" name="campo[]" value="">
    <input type="text" name="campo[]" value="">
    <input type="text" name="campo[]" value="">
    <input type="text" name="campo[]" value="">
    <input type="text" name="campo[]" value="">
    <input type="text" name="campo[]" value="">
    e riempite solo il secondo e l'ultimo campo, l'array risultante sarà comunque $_POST['campo'][0] e $_POST['campo'][1] perché sono gli unici valorizzati.
    E non come si può pensare un array di 6 valori di cui solo due valorizzati.

    Nel tuo caso, come si legge nel manuale del PHP ciò che fai non viene verificato:
    Codice PHP:
    if (isset($_POST['cognome']) && !empty($_POST['cognome'])) { ... }
    perché se $_POST['cognome'] è uguale a un valore vuoto il primo caso viene verificato ( isset() è verificato comunque ) ma poi deve essere verificato pure empty(), ma in questo caso empty è vero in quanto per una variabile vuota empty() risponde true ( sì, la variabile è vuota! ). Quindi non passa perché isset( true) AND !empty(true).
    La via migliore per la verifica? Prova con i filtri il cui risultato sarà sempre FALSE o il valore cercato.
    Nel tuo caso se vuoi verificare se cognome esiste ed è conforme a quanto richiesto:
    Codice PHP:
    function verificaNome( $valore ) {
    $options = array ( 'flags' => array( 'FILTER_FLAG_STRIP_LOW', 'FILTER_FLAG_STRIP_HIGH' ));
    $valore = filter_var( $valore, FILTER_SANITIZE_STRING, $options );
    return
    ucwords( $valore );
    }
    // verificaNome()

    if ( filter_has_var( INPUT_POST, 'cognome' ) && filter_has_var( INPUT_POST, 'cognome' ) != '' ){
    $cognome = filter_input( INPUT_POST, 'cognome', FILTER_CALLBACK, array('options' => array( 'options' => 'verificaNome' ));
    }
    Praticamente funziona così:
    la selezione ( if ) verifica se la variabile esiste e se non è vuota, se validata ne controlla comunque la validità passandola alla funzione di callback che torna un valore con le iniziali maiuscole, ( che so se inserisci rossi, torna Rossi ) o false se sbagliato ( tipo: '1#@()]' ).
    $cognome ha la forma di un array, quindi $cognome['cognome']. In genere uso una forma più complessa che mi torna un intero array nella forma $input['nomi dei campi controllati'].
    Riferimenti:
    http://de2.php.net/manual/en/function.filter-input.php
    Tower Defense giochi in Flash

  11. #11
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    La via migliore per la verifica? Prova con i filtri il cui risultato sarà sempre FALSE o il valore cercato.
    ...
    la selezione ( if ) verifica se la variabile esiste e se non è vuota, se validata ne controlla comunque la validità passandola alla funzione di callback che torna un valore con le iniziali maiuscole, ( che so se inserisci rossi, torna Rossi ) o false se sbagliato ( tipo: '1#@()]' ).
    Il filtro non restituisce false quando il valore è "sbagliato", bensì quando fallisce.
    Ad esempio la stringa "a\nb\nc" filtrata diventa "abc", nonostante sia "sbagliata".
    Non solo, ma FILTER_FLAG_STRIP_LOW e FILTER_FLAG_STRIP_HIGH servono ad effettuare lo strip di caratteri non stampabili, ad esempio "\n" o "\t", non di caratteri non alfanumerici. Ad esempio la stringa "1#@()]" filtrata resta invariata.

    Inoltre, usando ucwords si assume che tutti abbiamo un cognome che inizi con la lettera maiuscola. Cognomi (stranieri) legittimi, come macGregor o mcCaileb, vengono quindi storpiati.

    Il secondo operando dell'and è ridondante: filter_has_var restituisce un booleano, se il primo operando è valutato vero, allora lo è anche il secondo (in quanto != '' equivale a != false in questo contesto).
    Codice PHP:
    if ( filter_has_var( INPUT_POST, 'cognome' ) && filter_has_var( INPUT_POST, 'cognome' ) != '' )

    perché se $_POST['cognome'] è uguale a un valore vuoto il primo caso viene verificato ( isset() è verificato comunque ) ma poi deve essere verificato pure empty(), ma in questo caso empty è vero in quanto per una variabile vuota empty() risponde true ( sì, la variabile è vuota! ). Quindi non passa perché isset( true) AND !empty(true).
    A parte la ridondanza di isset (ringrazio darbula per la segnalazione ), questo è esattamente il comportamento desiderato: se il cognome è vuoto, il controllo non passa (e verrà segnalato un opportuno errore), altrimenti si entra nel corpo dell'if e si procede con l'elaborazione.
    Ultima modifica di mzanella : 18-05-2016 alle ore 16.09.01 Motivo: erratum

  12. #12
    Guest

    Predefinito

    Sì ma c'è un problema di fondo. Quando si fa girare il programma (vecchio termine che si adoperava con il dos scusate) la scheda all'inizio rimarrà sempre campo vuoto e quindi l''errore su presenterà sempre. O meglio nel mio caso non si presenta affatto nemmeno dopo aver premuto "l'invio dati". Come risolverlo ???? Mi hanno suggerito sempre in questa discussione di adoperare l'opzione required x ogni campo. E così in effetti funziona e non ti lascia nessun campo vuoto. Perchè sei costretto a riempirli tutti.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •