• User Attivo

    Strano problema con semplice form

    Ciao a tutti volevo chiedervi un parere riguardo a queste segnalazioni nel file error del mio sito e di cui non ne vengo a capo.
    Riguardano un semplice form di raccolta dati (4 campi obbligatori) ed invio a indirizzo mail.
    Mi causa problemi gravi in quanto dopo ogni tanto per sicurezza il servizio mail viene disattivato se qualcuno scrive dal sito gli da errore.
    Pirma avevo un form con un check dei dati obbligatori in php che dava molti più errori ora ne ho messo uno in js e all'inizio non dava errori ma oggi si è ripresentato il problema.
    Allora gli errori nel file di log sono 2 tipi:
    Undefined index: nome (input da compilare) in /home/miosito/public_html/inviomail.php on line (dalla linea 106 alla linea 123)
    Undefined variable: messaggio (text area facoltativa) in /home/miosito/public_html/inviomail.php on line 139 (solo sulla linea 139)
    Le linee di codice in questione sono:

    [PHP]
    <?php
    linea 106 $nome=$_POST['nome'];
    $cognome=$_POST['cognome'];
    $email=$_POST['email'];
    $cell=$_POST['cell'];
    $eta=$_POST['eta'];
    $genitore=$_POST['genitore'];
    $regione=$_POST['regione'];
    $citta=$_POST['citta'];
    $cap=$_POST['cap'];
    $provincia=$_POST['provincia'];
    $sesso=$_POST['sesso'];
    $altezza=$_POST['altezza'];
    $occhi=$_POST['occhi'];
    $capelli=$_POST['capelli'];
    $book=$_POST['book'];
    $settore=$_POST['settore'];
    $occupazione=$_POST['occupazione'];
    linea 123 $note=$_POST['note'];
    $to = "mailaziendale.it";
    $messaggio.="$nome ha inviato un messaggio da Google.
    I suoi dati sono:\n
    Nome: $nome\n
    Cognome: $cognome\n
    Email: $email\n
    Cellulare: $cell\n
    Eta: $eta Genitore: $genitore\n
    Regione: $regione Citta: $citta\n
    Cap: $cap Provincia: $provincia\n
    Sesso: $sesso\n
    Altezza: $altezza Occhi: $occhi\n
    Capelli: $capelli\n
    Book: $book Settore: $settore\n
    Occupazione attuale: $occupazione\n
    linea 139 Note: $note\n ";
    if (mail($to,"$cognome $nome",$messaggio,"From: $email\n")) {
    echo "Candidatura inviata correttamente, grazie $nome!";
    } else {
    echo "Si è verificato un problema. Non preoccuparti, inviaci Nome Cognome Cellulare ed Età a:mailaziendale.it. Grazie.";
    }
    ?>
    [/PHP]

    Forse sembra potrebbe dipendere da questa riga:
    [PHP]if (mail($to,"$cognome $nome",$messaggio,"From: $email\n")) {[/PHP]
    in quanto dice credo (se la mail è composta da cognome nome e messaggio) ma se nel messaggio uno non scrive nulla forse viene a mancare questa variabile?
    Diciamo da come sembra a me, dia un errore se si lascia un campo vuoto e si invia alla action, in realtà i campi obbligatori su cui effettua il controllo sono solo 4 Nome Cognome Cellulare ed Età.
    Il form funziona bene ma in realtà sotto sotto da registra questo errore.
    Il controllo del modulo è il seguente:

    
    <script type="text/javascript">
    function controllo(){
    with(document.modulo) {
    
    if(nome.value=="") {
    alert("Errore: compilare il campo NOME");
    nome.focus();
    return false;
    }
    if(cognome.value=="") {
    alert("Errore: compilare il campo COGNOME");
    cognome.focus();
    return false;
    }
    if(cell.value=="") {
    alert("Errore: compilare il campo CELLULARE");
    cell.focus();
    return false;
    }
    if(eta.value=="") {
    alert("Errore: compilare il campo ETA'");
    eta.focus();
    return false;
    }
    }
    
    return true;
    }
    </script> 
    
    

    Sapete come potrei rimediare?
    Grazie mille ciao a tutti!


  • User Attivo

    Inizializza le variabili, se è possibile che queste abbiano contenuto vuoto.

    Una cosa del genere:

    [php]$nome = (isset($_POST['nome'])) ? trim($_POST['nome']) : '';[/php]
    ecc..

    Se ti capita di doverli usare per query in database, aggiungi anche:
    [php]if (!get_magic_quotes_gpc()) {
    $nome = addslashes($nome);
    //ecc...
    }[/php]

    Infine, anche se esegui i controlli con javascript, farei anche un check lato PHP. Se per qualsiasi ragione riescono a bypassare il check javascript (disabilitato?), non puoi inviare la mail ad indirizzo NULL. Così come, anche se non inseriscono un campo vuoto, non basta quel controllo javascript per capire se quella inserita ha le connotazioni di un email.

    Trovi qui i vari controlli che potresti utilizzare (codice pagina registrati.php):
    giorgiotave.it/forum/scripting-e-risorse-utili/83033-tutorial-area-privata.html

    Buona fortuna!


  • User Attivo

    Ciao gigi grazie per la risposta. Allora i form che uso sono due in uno ho provato questo metodo:

    
    $nome="";
    $cognome="";
    $email="";
    $cell="";
    $eta="";
    
    

    ecc,ecc... E poi

    
    if(isset($_POST['nome'])){ $nome = $_POST['nome']; }
    if(isset($_POST['cognome'])){ $cognome = $_POST['cognome']; }
    if(isset($_POST['email'])){ $nome = $_POST['email']; }
    if(isset($_POST['cell'])){ $cell = $_POST['cell']; }
    if(isset($_POST['eta'])){ $eta = $_POST['eta']; }
    
    

    Terminando poi con l'invio di tutto.
    Sull altro form ho provato il metodo che mi hai gentilmente suggerito tu...tutti e due funzionano ma stranamente in tutti e due mi riportano l'errore sulla stessa riga
    [20-Apr-2015 15:34:16 Europe/London] PHP Notice: Undefined variable: messaggio in /home/user/public_html/noindex/miosito/action.php on line 140

    La riga in questione è una semplice teext area per le note aggiuntive facoltative

    
    Note: $note\n ";
    
    

    Non si trova nella parte dove riceve la variabile dal post, si trova nella parte dove compone il messaggio con tutte le variabili...
    Sai da cosa potrebbe dipendere?


  • User Attivo

    Inoltre dal provider mi han detto che per evitare gli errrori che dopo un po disabilitano il servizio mail (), non dovrei usare mail php ma usare smtp.....:?


  • User Attivo

    L'errore ti dice cosa non va, è lo stesso del precedente: hai richiamato una variabile non definita. Devi crearla comunque se la utilizzi, o fare un check.

    Occhio, scrivere:
    $nome="";
    if(isset($_POST['nome'])){ $nome = $_POST['nome']; }

    è come scrivere semplicemente:
    $nome = (isset($_POST['nome'])) ? trim($_POST['nome']) : '';

    Qui definisci una variabile a seconda della condizione iniziale (isset($_POST['nome'])), dopo il ? hai l'assegnazione della variabile, se vera (esiste) gli dai il valore inviato, se no (dopo i : l'assegnazione se è falsa, cioè se non esiste il $_POST relativo) gli da valore "".

    L'uso di mail() sembra dare problemi di sicurezza, per questo potrebbero bloccarlo.
    Puoi provare una delle classi già in rete per riformulare il tuo invio di mail.
    Dai un occhiata qui:


  • User Attivo

    Grazie, ma per l'smtp dovrò studiare un po' , ora non saprei proprio come utilizzarle queste classi :mmm:
    Per l'errore invece me lo da sia con il tuo metodo sia con l'altro.
    Questa è la riga che causa il problema ed in cui ho usato la funzione da te suggerrita

    $note = (isset($_POST['note'])) ? trim($_POST['note']) : '';
    

    Sulle altre variabili con il tuo metodo non da più errori, ma su questa textarea continua a dare errore...solo in questa.


  • User Attivo

    Vedi questa è l'ultima riga che compone il messaggio. Se la lascio così

    Note: $note";
    

    Mi da errore solo sulla riga 140
    Se lo scrivo così

    Note: $note
    ";
    

    Mi da errore sia sulla riga 140 che 141


  • User Attivo

    Questo è il codice della action
    [PHP]<?php

    $nome = (isset($_POST['nome'])) ? trim($_POST['nome']) : '';
    $cognome = (isset($_POST['cognome'])) ? trim($_POST['cognome']) : '';
    $email = (isset($_POST['email'])) ? trim($_POST['email']) : '';
    $cell = (isset($_POST['cell'])) ? trim($_POST['cell']) : '';
    $eta = (isset($_POST['eta'])) ? trim($_POST['eta']) : '';
    $genitore = (isset($_POST['genitore'])) ? trim($_POST['genitore']) : '';
    $regione = (isset($_POST['regione'])) ? trim($_POST['regione']) : '';
    $citta = (isset($_POST['citta'])) ? trim($_POST['citta']) : '';
    $cap = (isset($_POST['cap'])) ? trim($_POST['cap']) : '';
    $provincia = (isset($_POST['provincia'])) ? trim($_POST['provincia']) : '';
    $sesso = (isset($_POST['sesso'])) ? trim($_POST['sesso']) : '';
    $occupazione = (isset($_POST['occupazione'])) ? trim($_POST['occupazione']) : '';
    $note = (isset($_POST['note'])) ? trim($_POST['note']) : '';
    $to = "miamail.com";
    $messaggio.="$nome ha inviato i suoi dati dal sito.
    I suoi dati sono:\n
    Nome: $nome\n
    Cognome: $cognome\n
    Email: $email\n
    Cellulare: $cell\n
    Eta: $eta Genitore: $genitore\n
    Regione: $regione Citta: $citta\n
    Cap: $cap Provincia: $provincia\n
    Sesso: $sesso\n
    Occupazione attuale: $occupazione\n
    Note: $note
    ";
    if (mail($to,"$cognome $nome",$messaggio,"From: $email\n")) {
    echo "Dati inviati correttamente, grazie $nome!";
    } else {
    echo "Si è verificato un problema. Non preoccuparti, inviaci Nome Cognome Cellulare ed Età a: miamail.com Grazie.";
    }

    ?>[/PHP]


  • User Attivo

    Se fai un echo di $note che ti dice?
    Se elimini il richiamo nel $messaggio ?


  • User Attivo

    Se lo elimno dal messaggio da errore alla linea precedente...... :arrabbiato:


  • User Attivo

    Il fatto è che da errore dove lascio la chiusura del messaggio ";
    Se metto la chiusura in una riga da sola da errore in quella riga


  • User Attivo

    Ora ho tolto il punto da
    [PHP]$messaggio.="$nome ha inviato
    [/PHP]
    e non mi da più l'errore...per ora.
    Poteva essere quello il problema o andava lasciato?


  • User Attivo

    oh madonnina....ora il form funziona, non da errore sul file di log, ma lascia il campo email vuoto e lo sostituisce con il nome.....


  • User Attivo

    No ok sistemato il problema.
    Ora mi rimane solo il dubbio di quel punto che ho tolto, andava lasciato?


  • User Attivo

    Non l'avevo notato, effettivamente era un problema. Nel senso che il punto serve per aggiungere ad una variabile già dichiarata del contenuto. Tu la variabile messaggio non l'avevi dichiarata prima, quindi andava in errore. Giusto toglierlo.

    Esempio di utilizzo:
    $descrizione = "Orologio ";
    $descrizione .= "in oro ";
    $descrizione .= "20 carati";

    echo $descrizione; // Output: Orologio in oro 20 carati

    Occhio: se hai aggiornamenti a distanza di tempo così breve, puoi utilizzare la funzione "modifica" dell'ultimo post già inviato per evitare di allungare la discussione e i post presenti con messaggi mono-riga. 😄

    Credo hai risolto. Se hai intenzione di lavorare molto con PHP, ripassa le basi (ogni tanto toccherebbe anche a me che ho queste sviste), perché trick come quello del punto sono molto utili (così come considerare che esistono anche altri tipi di concatenazioni).

    Buona fortuna!


  • User Attivo

    Ahahahahahha sì in effetti ho scritto un po' "alla whatsapp" giustissima osservazione! 😄
    Ah bene a sapersi l'utilizzo del punto nelle variabili.
    Sì in effetti dovrei studiacchiare un po' le basi.....
    Grazie mille gigi per le dritte ed il tempo.
    Ciao alla prossima grazie!