Visualizzazione risultati 1 fino 25 di 25

Discussione: verifica i valori vuoti

  1. #1
    battimani non è connesso Neofita
    Data registrazione
    19-11-2009
    Messaggi
    8

    Predefinito verifica i valori vuoti

    Salve a tutti.
    Sto usando questa condizione:
    Codice PHP:
    if( empty($_POST['cognome']) or ($_POST['nome']) )
    ma funziona solo la prima parte.

    In pratica se il campo cognome e nome non è scritto, devo far visualizzare un form.
    Mentre se sono stati inseriti o il cognome o il nome, deve andare avanti.

    Nel mio if però viene verificata solo la prima condizione, quella del cognome e non la seconda.
    Quindi se qualcuno scrive solo il nome il campo viene considerato vuoto e va al form.
    Spero sia tutto chiaro.

    Come posso fare ? Grazie

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,175

    Predefinito

    Codice PHP:
    if( empty($_POST['cognome']) or empty($_POST['nome']) )
    In ogni caso, non so se lo hai fatto ma io controllerei prima di questo codice se le variabili esistono, con la isset().

    Ciao!

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

    Predefinito

    empty si può utilizzare su array associativi e nel qual caso non esista non genera errore... Però il form per inviare quei parametri avrà bisogno dell'attributo name cognome e nome come sono stati scritti nell'array $_POST.
    L'array $_POST inizialmente è vuoto mentre l'array associativo $_POST['cognome '] o $_POST['nome'] esisterà solo se il form lo invia.
    Ovvio che ambedue i dati vanno verificati con empty.. Comunque anche una stringa che inizia con 0 è considerato vuoto :)
    Codice PHP:
    if(!empty($_POST['cognome']) || !empty($_POST['nome'])) {
    //code
    }
    anche se in realtà dovresti creare qualcosa del genere poiché non sai a priori quali dati saranno disponibili
    Codice PHP:
    $cognome = '';
    $nome = '';
    if(!empty(
    $_POST['cognome'])) {
    $cognome ='il tuo cognome è' . $_POST['cognome'];
    }
    if(!empty(
    $_POST['nome'])) {
    $nome = 'il tuo nome è' . $_POST['nome'];
    } elseif (
    strlen($cognome) > 1) {
    //vai avanti
    } else {
    // mostra il form
    }
    Ho aggiunto la negazione e ciò si traduce se esiste uno o l'atro (o entrambi) vado avanti altrimenti mostro il form.. Andrebbe inserito il minimo e il massimo dei caratteri consentiti
    Ultima modifica di darbula : 25-11-2018 alle ore 22.56.50

  4. #4
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Grazie per le risposte.
    Ho provato così:
    Codice PHP:
    if(isset($_POST['cognome']) or isset($_POST['nome']))
    {
    echo
    "Il form ha inviato il valore ".$_POST['cognome'];
    echo
    "<br />Il form ha inviato il valore ".$_POST['nome'];
    }

    if( empty(
    $_POST['cognome']) or empty($_POST['nome']) )
    {
    ecc. ecc.
    Mi verifica entrambi cognome e nome, ma per andare avanti devono essere presenti entrambi.
    Invece vorrei che bastasse la presenza di uno dei due valori, cioè se è presente il cognome o il nome, vai avanti ... altrimenti torna al form.

    Con il suggerimento di darbula non ottengo niente.
    Forse sbaglio qualcosa ... adesso sono di fretta. Stasera ci riguardo meglio.
    Grazie a tutti per l'aiuto e la pazienza

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

    Predefinito

    In realtà ti sei risposto da solo dicendo:
    se è presente il cognome o il nome, vai avanti ... altrimenti torna al form
    traducilo in inglese:
    if surname is given or name is given then go ahead, else back to the form
    e da inglese a "PHP-ese" il passo è breve:
    Codice PHP:
    if (!empty($_POST['cognome']) or !empty($_POST['nome'])) {
    // vai avanti
    }
    else {
    // torna al form
    }
    Se poi vuoi aggiungere anche un controllo preliminare con isset male non fa, ma il punto fondamentale è la logica.

    I suggerimenti che do più spesso:


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

    Predefinito

    Il form html invia comunque i dati quando azionato dall'invio (che possonono essere vuoti entrambi o con valore e uno vuoto).
    Dunque devi utilizzare empty poiché controlla se è un valore vuoto ( anche se inizia con 0 è vuoto).
    isset verifica che sia stata creata quella variabile anche se con il valore vuoto.
    Adesso sai il funzionamento del form e di entrambe le funzioni (leggi maggiori dettagli nel DOC online di php.net).
    Nota* copia a mano il mio codice non con copia incolla ( quasi sicuramente ci sono caratteri invisibili che interrompono il mio script).
    Nel mio codice hai due vai avanti se esiste il nome creo la variabile $nome altrimenti se esiste solo $cognome va nel codice vai avanti ($cognome esiste solo se trova corrispondenza nella prima if).
    Ultima modifica di darbula : 27-11-2018 alle ore 01.53.13

  7. #7
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Il form html invia comunque i dati quando azionato dall'invio (che possonono essere vuoti entrambi o con valore e uno vuoto).
    Dunque devi utilizzare empty poiché controlla se è un valore vuoto ( anche se inizia con 0 è vuoto).
    isset verifica che sia stata creata quella variabile anche se con il valore vuoto.
    Adesso sai il funzionamento del form e di entrambe le funzioni (leggi maggiori dettagli nel DOC online di php.net).
    Nota* copia a mano il mio codice non con copia incolla ( quasi sicuramente ci sono caratteri invisibili che interrompono il mio script).
    Nel mio codice hai due vai avanti se esiste il nome creo la variabile $nome altrimenti se esiste solo $cognome va nel codice vai avanti ($cognome esiste solo se trova corrispondenza nella prima if).
    Ho provato come hai detto, ma non funziona. Eppure mi sembra a posto.
    Codice PHP:
    <?php
    if(isset($_POST['cognome']) or isset($_POST['camera']))
    {
    echo
    "Il form ha inviato il valore ".$_POST['cognome'];
    echo
    "<br />Il form ha inviato il valore ".$_POST['camera'];
    }
    $cognome= '';
    $camera= '';
    if (!empty(
    $_POST['cognome']))
    {
    $cognome='il tuo cognome è' . $POST['cognome'];
    }
    if (!empty(
    $_POST['camera']))
    {
    $camera='la camera è' . $POST['camera'];
    }
    elseif (
    strlen($cognome) >1)
    {

    $cognome =$mysqli->escape_string($_POST['cognome']);
    $camera =$mysqli->escape_string($_POST['camera']);
    $sql = "SELECT * FROM residenti WHERE cognome_res LIKE '$cognome%' AND camera_res LIKE '$_POST[camera]%' ORDER BY cognome_res ASC";

    $res = $mysqli->query($sql);

    // se trova qualcosa va avanti
    if($res->num_rows > 0)
    {
    echo
    '
    Grazie a tutti

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

    Predefinito

    Ci sono molte imprecisioni nel codice. Dovresti inoltre curare l'indentazione.

    Inizialmente hai detto che la ricerca deve avvenire se sono stati inseriti il cognome oppure la camera. Nella query, però, richiedi implicitamente che siano inseriti entrambi:
    Codice:
    SELECT * FROM residenti WHERE cognome_res LIKE '$cognome%' AND camera_res LIKE '$_POST[camera]%' ORDER BY cognome_res ASC";
    dovresti quindi chiarire se intendi richiedere almeno uno dei due o entrambi.

    I suggerimenti che do più spesso:


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

    Predefinito

    Guarda se volevi questo con dati variabili derivanti dal form e in base a ciò effettui la query.
    Codice PHP:
    <?php
    header
    ("Content-type: text/html; charset=UTF-8");

    //Se esiste
    if(!empty($_POST['cognome']) || !empty($_POST['camera'])) {
    $p_sql = '';

    //Codice connessione database

    //Creazione query con uno o due parametri
    //Ordinamento Cognome ascendente
    if(!empty($_POST['camera'])) {
    $camera = $mysqli->escape_string($_POST['camera']);
    $s_sql = " `camera_res` LIKE '$camera%'";
    }
    if(!empty(
    $_POST['cognome'])) {
    $cognome = $mysqli->escape_string($_POST['cognome']);
    if(!empty(
    $_POST['camera'])) {
    $s_sql = ' AND' . $s_sql;
    }
    $p_sql = " `cognome_res`
    LIKE '
    $cognome%'$s_sql ORDER BY `cognome_res` ASC";
    $s_sql = '';
    }


    echo (
    htmlentities("SELECT * FROM `residenti` WHERE$p_sql$s_sql",ENT_COMPAT|ENT_HTML401,'UTF-8'));
    } else {
    //mostra il form
    echo '<!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>campi variabili</title>
    </head>
    <body>
    <form action="" method="POST">
    <input type="text" name="cognome" />
    <input type="text" name="camera" />
    <input type="submit" />
    </body>
    </form>
    </html>'
    ;
    }
    Precisazione nel tuo codice non ti vedo usare fetch_assoch()

  10. #10
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Grazie infinite darbula.
    Il tuo elaborato funziona.
    La ricerca è corretta, come volevo.
    Però mi segnala Notice: Undefined variable: s_sql
    per la riga :
    Codice PHP:
    LIKE '$cognome%'$s_sql ORDER BY `cognome_res` ASC";
    Perchè ?
    Mentre per il resto invece non rileva nessuna anomalia e va bene.
    Grazie ancora

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

    Predefinito

    Suggerirei una stesura più chiara e lineare del codice, usando nomi significativi per gli identificatori ed un'indentazione appropriata:
    Codice PHP:
    // Se sono stati inseriti il cognome o la camera, va avanti...
    if (!empty($_POST['cognome']) || !empty($_POST['camera'])) {
    // Connessione alla base di dati
    // $mysqli = ...

    // Legge le clausole
    $conditions = array();
    if (!empty(
    $_POST['cognome'])) {
    $cognome = $mysqli->escape_string($_POST['cognome']);
    $conditions[] = "cognome_res LIKE '$cognome%'";
    }
    if (!empty(
    $_POST['camera'])) {
    $camera = $mysqli->escape_string($_POST['camera']);
    $conditions[] = "camera_res LIKE '$camera%'";
    }

    // Costruisce la query
    $query = "SELECT * FROM residenti WHERE " . implode(" AND ", $coditions) . " ORDER BY cognome_res ASC";

    // Mostra il testo della query costruita
    echo $query;
    }

    // ... altrimenti mostra il form
    else {
    // Mostra il form
    }

    I suggerimenti che do più spesso:


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

    Predefinito

    @pierinik scusami ho commesso due errori, devi aggiungere $s_sql = ''; subito dopo //se esiste e prima di $p_sql mentre il secondo errore del tag di chiusura </form> deve essere prima di </body>
    Ultima modifica di darbula : 28-11-2018 alle ore 21.38.46

  13. #13
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Grazie mzanella.
    L'ultimo script che mi hai consigliato è più problematico, nel senso che mi presenta molti errori e non fa la ricerca.
    Rimmarei sul precedente che funziona bene e serve solo di qualche aggiustamento.
    L'errore che ti facevo notare
    Notice: Undefined variable: s_sql
    si verifica solo in locale, su altervista funziona senza errori.
    Avrei bisogno però di sistemare lo script anche in locale, perchè ho bisogno di averlo senza la rete.
    Grazie per la continua assistenza

  14. #14
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Non l'avevo visto.
    Citazione Originalmente inviato da darbula Visualizza messaggio
    @pierinik scusami ho commesso due errori, devi aggiungere $s_sql = ''; subito dopo //se esiste e prima di $p_sql mentre il secondo errore del tag di chiusura </form> deve essere prima di </body>
    Ho fatto come hai detto, ma la storia non è cambiata.
    Però come dicevo, solo in locale, mentre su altervista funziona anche senza la correzione.
    Grazie ancora

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

    Predefinito

    L'ultimo script che mi hai consigliato è più problematico, nel senso che mi presenta molti errori e non fa la ricerca.
    Certo che non fa la ricerca, come vedi contiene una echo per mostrare il testo della query. L'interrogazione vera e propria spetta a te decidere dove e quando eseguirla.
    Riguardo ai "molti errori" che nomini, ho scritto per sbaglio $coditions senza "n", anziché $conditions, alla riga 18. Sistemato questo, non ci sono errori né sintattici né semantici. Se pensi che ci siano altri errori ti invito a riportarmeli.

    I suggerimenti che do più spesso:


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

    Predefinito

    Ho aggiunto error_reporting e sistemato il documento html.

    Prima di creare qualsiasi script ci sta dietro una logica, se ho due parametri a disposizione ma mi basta anche che sia presente uno si traduce in tre query simili ma differenti ... Se cognome esiste avrò la possibilità di ordinare ascendentemente anche i dati (è vero in due query) mentre se esiste solo camera e in mamcanza di ordinamemto di default il risultato è in ordine ascendente.

    Di seguito riporto il codice privo di errore e indentato a mano
    [/php]<?php
    error_reporting(-1);

    header("Content-type: text/html; charset=UTF-8");

    //Se esiste
    if(!empty($_POST['cognome']) || !empty($_POST['camera'])) {
    $s_sql = '';
    $p_sql = '';

    //Codice connessione database

    //Creazione query con uno o due parametri
    //Ordinamento Cognome ascendente
    if(!empty($_POST['camera'])) {
    $camera = $mysqli->escape_string($_POST['camera']);
    $s_sql = " `camera_res` LIKE '$camera%'";
    }
    if(!empty($_POST['cognome'])) {
    $cognome = $mysqli->escape_string($_POST['cognome']);
    if(!empty($_POST['camera'])) {
    $s_sql = ' AND' . $s_sql;
    }
    $p_sql = " `cognome_res`
    LIKE '$cognome%'$s_sql ORDER BY `cognome_res` ASC";
    $s_sql = '';
    }


    echo (htmlentities("SELECT * FROM `residenti` WHERE$p_sql$s_sql",ENT_COMPAT|ENT_HTML401,'UTF-8'));
    } else {
    //mostra il form
    echo '<!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>campi variabili</title>
    </head>
    <body>
    <form action="" method="POST">
    <input type="text" name="cognome" />
    <input type="text" name="camera" />
    <input type="submit" />
    </form>
    </body>
    </html>';
    }[/php]
    Purtroppo sono le tue modifiche al codice che ti danno errore essendo che io inizializzo entrambe le due variabili in un valore vuoto.

  17. #17
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Thumbs up

    Grazie darbula,
    adesso va tutto bene.
    Ero io che facevo confusione ...
    Un grande grazie per la cortese pazienza.

  18. #18
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Salve a tutti,
    continuo la discussione perchè ho fatto una piccola modifica alla query creata da darbula e per maggiore comprensione sull'argomento.
    In pratica ho aggiunto una condizione.
    Devo verificare che la colonna appello sia uguale a 1 che in altre parole mi da una conferma sulla presenza/assenza di chi cerco.
    Codice PHP:
    $sql = (htmlentities("SELECT * FROM `residenti` WHERE $p_sql$s_sql AND appello=1 ",ENT_COMPAT|ENT_HTML401,'UTF-8'));
    $result=$mysqli->query($sql);
    // se dalla ricerca risulta assente
    if ( mysqli_num_rows($result) == 0) { ...
    Qui però ricevo un errore in quanto la ricerca produce un risultato in contraddizione.
    mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given
    Non so come fare per sistemare la cosa.
    Ovviamente se tolgo la mia condizione nella query AND appello=1 tutto funziona.
    E il controllo mysqli_num_rows mi rileva solo chi esiste nel database.
    Io vorrei fare una cosa più fine e verificare anche se chi trova è anche presente.
    Grazie per l'attenzione e l'aiuto

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

    Predefinito

    Aggiunto come primo parametro colonna appello con il valore 1 (spero che la colonna tu l'hai creata di tipo int e non varchar, chat o similari), ho modificato da echo adesso creo effettivamente l'istruzione sql.

    Codice PHP:
    <?php
    header
    ("Content-type: text/html; charset=UTF-8");

    //Se esiste
    if(!empty($_POST['cognome']) || !empty($_POST['camera'])) {
    $s_sql = '';
    $p_sql = '';

    //Codice connessione database

    //Creazione query con uno o due parametri
    //Ordinamento Cognome ascendente
    if(!empty($_POST['camera'])) {
    $camera = $mysqli->escape_string($_POST['camera']);
    $s_sql = " AND `camera_res` LIKE '$camera%'";
    }
    if(!empty(
    $_POST['cognome'])) {
    $cognome = $mysqli->escape_string($_POST['cognome']);
    $p_sql = " AND `cognome_res`
    LIKE '
    $cognome%'$s_sql ORDER BY `cognome_res` ASC";
    $s_sql = '';
    }


    $sql = "SELECT * FROM `residenti` WHERE appello=1$p_sql$s_sql";
    } else {
    //mostra il form
    echo '<!doctype html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>campi variabili</title>
    </head>
    <body>
    <form action="" method="POST">
    <input type="text" name="cognome" />
    <input type="text" name="camera" />
    <input type="submit" />
    </form>
    </body>
    </html>'
    ;
    }

  20. #20
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Grazie darbula, per la pazienza e la risposta.

    Devo dire che se correggo la query come mi hai indicato:
    Codice PHP:
    $sql = "SELECT * FROM `residenti` WHERE appello=1$p_sql$s_sql";
    Mi segnala subito
    mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given
    nella riga dell'istruzione
    Codice PHP:
    if ( mysqli_num_rows($result) == 0) {
    anche per le ricerche prima andavano bene.

    Aggiungo che se modficio anche la parte di script, come mi hai mandato:
    Codice PHP:
    //Creazione query con uno o due parametri
    //Ordinamento Cognome ascendente
    if(!empty($_POST['camera'])) {
    $camera = $mysqli->escape_string($_POST['camera']);
    $s_sql = " `camera_res` LIKE '$camera%' ";
    }
    if(!empty(
    $_POST['cognome'])) {
    $cognome = $mysqli->escape_string($_POST['cognome']);
    /*
    if(!empty($_POST['camera'])) {
    $s_sql = ' AND' . $s_sql;
    }
    */
    $p_sql = " `cognome_res`
    LIKE '
    $cognome%'$s_sql ORDER BY `cognome_res` ASC";
    $s_sql = '';
    }
    Non mi funziona più bene la ricerca.

    Riassumendo. Così funziona:
    Codice PHP:
    <?php

    //Se esiste

    if(!empty($_POST['cognome']) || !empty($_POST['camera'])) {
    $s_sql = '';
    $p_sql = '';

    //Creazione query con uno o due parametri
    //Ordinamento Cognome ascendente
    if(!empty($_POST['camera'])) {
    $camera = $mysqli->escape_string($_POST['camera']);
    $s_sql = " `camera_res` LIKE '$camera%' ";
    }
    if(!empty(
    $_POST['cognome'])) {
    $cognome = $mysqli->escape_string($_POST['cognome']);
    if(!empty(
    $_POST['camera'])) {
    $s_sql = ' AND' . $s_sql;
    }
    $p_sql = " `cognome_res`
    LIKE '
    $cognome%'$s_sql ORDER BY `cognome_res` ASC";
    $s_sql = '';
    }

    $sql = "SELECT * FROM `residenti` WHERE $p_sql$s_sql";
    $result=$mysqli->query($sql);

    // se dalla ricerca l'assegnatario risulta assente

    if ( mysqli_num_rows($result) == 0) {
    Se aggiungo appello=1 nella query non va.
    Inoltre ho corretto la struttura del parametro colonna appello del valore 1, mettendolo a INT.
    In effetti inizialmente avevo pensato di impostarlo come varchar perchè volevo mettere presente o assente o quello che mi serviva sapere, poi ho cambiato idea perchè è più comodo usare i numeri. Così mi sono codificato 1 per presente, 2 per viaggio, 3 per uscita e così via ...

    Scusa se ti faccio impazzire e grazie ancora per la comprensione

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

    Predefinito

    Ti basi sul codice vecchio dove non avevo inserito spazio bianco AND spazio bianco per tutti e due i parametri.
    Soluzione copia l'ultimo codice che ho scritto.
    Praticamente fai una query sbagliata e essa diventa un booleano falso..
    Dopo la query utilizza (che per te è $result quindi mysqli_error dopo di esso) mysqli_error http://php.net/manual/en/function.mysql-error.php
    Ultima modifica di darbula : 01-12-2018 alle ore 11.17.00

  22. #22
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    OK. Come al solito hai ragione.
    Grande. Funziona tutto.
    Gentilissimo, grazie

  23. #23
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    darbula scusa il disturbo. Nella query
    Codice PHP:
    $sql = "SELECT * FROM `residenti` WHERE appello=1$p_sql$s_sql";
    volevo aggiungere anche la condizione 2 della colonna appello.
    In altre parole mi sono accorto che potrei avere bisogno di aver elencata anche questa condizione.
    Quindi appello=1 oppure appello=2, ma non so come farlo.
    Grazie e buona serata

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

    Predefinito

    Codice PHP:
    $sql = "SELECT * FROM `residenti` WHERE (appello=1 OR appello=2) $p_sql$s_sql";
    Fammi sapere.

  25. #25
    pierinik non è connesso Utente
    Data registrazione
    26-03-2010
    Messaggi
    122

    Predefinito

    Mitico. Funziona alla grande.
    Grazie mille.

Regole di scrittura

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