Visualizzazione risultati 1 fino 14 di 14

Discussione: Problema con le sessioni PHP

  1. #1
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Question Problema con le sessioni PHP

    Salve a tutti!

    Sto progettando il sito web del mio studio ma ho un problemino con il modulo di invio della mail di prenotazione.
    Il problema è che una volta mandata la mail ed ottenuta la frase di conferma che va a sostituire il form, ogni volta che si refresha la pagina viene inviata una nuova e-mail. Così mi sono detto: usiamo le sessioni! Ma adesso non manda proprio più niente... Sapreste dirmi cosa sto sbagliando?
    Il codice che ho usato è il seguente:


    Codice PHP:
    <div id="article1">

    <?php
    if ($_POST['invia']) {
    if (
    $_SESSION['appenainviato']="YES") {
    echo 
    "Grazie. Ti risponderemo al pi&ugrave; presto per metterci d'accordo sulla data e l'ora! :)";

    } else {

    $destinatario="CENSURAINDIRIZZO";
    $oggetto ="Nuova richiesta";
    $info="$persone<br>$esperienza<br>$descrizione<br>$link<br>$note";
    $da="$nome  $mail";
    mail ($destinatario$oggetto$info$da);
    echo 
    "Grazie. Ti risponderemo al pi&ugrave; presto per metterci d'accordo sulla data e l'ora! :)";
    session_start();
    $_SESSION['appenainviato']="YES";
    }

    } else {

    ?>

    <form name='modulo' action='<?php echo $_SERVER['PHP_SELF']; ?>' method='POST' accept-charset='UTF-8' autocomplete='off'>
    <fieldset>
    <legend id='titoloform'><b>Prenota ora una sessione in studio!</b></legend>
    <input type='text' name='nome' placeholder='Come ti chiami? *' size='44' required>
    <br>
    <input type='email' name='mail' placeholder='Il tuo indirizzo e-mail? *' size='44' required>
    <br>
    <input type='text' name='persone' placeholder='Solista o gruppo? Solo voce o anche strumenti? *' size='44' required>
    <br>
    <input type='radio' name='esperienza' value='Esperto' checked>Hai già esperienza in studio
    <br>
    <input type='radio' name='esperienza' value='PrimaVolta'>'Whoo, questa sar&agrave; la mia prima volta in studio!'
    <br>
    <input type='text' name='descrizione' placeholder='Parlaci del tuo progetto... *' size='44' required>
    <br>
    <input type='url' name='link' placeholder='Se vuoi puoi già inviarci una strumentale!' size='44'>
    <br>
    <input type='text' name='note' placeholder='Note aggiuntive (?)' size='44'>
    <br>
    <div id='allineamentopulsante'><input type='submit' name='invia' value='Invia!'></div>
    </fieldset>
    </form>

    <?php
    }
    ?>

    </div>
    Un'ultima cosa: ho notato che la mail mi arriva vuota con solo le scritte "<br>" come testo anziché "accapi", quindi, a parte il fatto che devo trovare un altro modo per mandare accapo, questo significa che le variabili PHP non riprendono quelle degli attributi "name" dei tag "input" dell'HTML senza usare il GET?
    Ultima modifica di karl94 : 31-03-2016 alle ore 01.49.22 Motivo: Formattazione

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

    Predefinito

    L'errore che salta subito agli occhi è l'uso di "=" anziché "==" in un if:
    Codice PHP:
    if ($_SESSION['appenainviato']="YES") { 
    che dovrebbe invece essere
    Codice PHP:
    if ($_SESSION['appenainviato'] == "YES") { 
    ho notato che la mail mi arriva vuota con solo le scritte "<br>" come testo anziché "accapi", quindi, a parte il fatto che devo trovare un altro modo per mandare accapo
    Se stai inviando la mail come testo semplice (come mi sembra sia), il ritorno a capo è ottenuto col carattere '\n'.


    questo significa che le variabili PHP non riprendono quelle degli attributi "name" dei tag "input" dell'HTML senza usare il GET
    Cosa intendi esattamente? I vettori $_GET e $_POST vengono popolati automaticamente in base al tipo di richiesta con le coppie nome-valore (name-value) ricevute da un form...


    Ad ogni modo, sicuro di voler utilizzare le sessioni per questo scopo? È normale che ricaricando una pagina il modulo venga re-inviato (è esattamente quello lo scopo di ricaricare la pagina, inoltre il browser avvisa l'utente del re-invio dei dati quando il metodo è POST).
    Non sarebbe più semplice reindirizzare l'utente alla pagina dopo aver inviato la mail?

  3. #3
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Predefinito

    L'intento sarebbe quello di creare un sito con meno cambi di pagina possibile, infatti le diverse "pagine" per ogni sezione del sito non sono altro che dei diversi div che sostituiscono quello visualizzato precedentemente a seconda di quale pulsante viene cliccato sulla navigation bar subito sotto l'header: le uniche due pagine che ho creato sono index.php e main.css! La soluzione delle sessioni mi piace abbastanza, perché non ti convince granché?

    Per quanto riguarda le variabili... Saranno stati tre anni che non avevo più a che fare col PHP (ho un attimo accantonato l'hobby della progettazione web) e volevo provare se dando un attributo del tipo name="nomeacaso" e poi utilizzando la variabile $nomeacaso prendesse lo stesso valore, ma mi sta tornando in mente che ci voglia qualcosa di simile a una definizione come $nomeacaso=$_GET['nomeacaso'], vero?

  4. #4
    darbula non è connesso AlterGuru
    Data registrazione
    24-04-2011
    Messaggi
    1,791

    Predefinito

    @maznella Se stai inviando la mail come testo semplice (come mi sembra sia), il ritorno a capo è ottenuto col carattere '\n'. Ma deve specificare come enctype text/plain nel modulo html, ne consegue che $_POST sarà vuoto se non esiste chiave=valore o con l'aggiunta di & tra più valori, Dovrebbe recuperare con file_get_contents('php://input'); ad esempio se il browser invia via post delle stringhe (non è un invio ma un recupero in questo esempio,perché i dati devono essere inviati con urlencode) nome=giorgio&mail=mail@mail.com&persone=solista e così via. Sarebbe corretto verificare l'esistenza con isset poi controllare l'output dell'utente. $persone non esiste ma esiste $_POST['persone'] solo quando non utilizzi enctype text/plain

  5. #5
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Predefinito

    Dunque.
    Con le variabili ho risolto.
    Ho messo == al posto di = ma la cosa non funziona comunque: se ricarico insistentemente la pagina mi arrivano millemila mail tutte uguali (sto facendo questa cosa delle sessioni proprio per evitare qualche simpatico troll).

    Inoltree... Teoricamente la quarta variabile inserita nella funzione mail() non dovrebbe specificare le informazioni del mittente? Perché mi vengono inserite nella mail come testo?
    Ultima modifica di pebblefable : 30-03-2016 alle ore 22.08.08

  6. #6
    darbula non è connesso AlterGuru
    Data registrazione
    24-04-2011
    Messaggi
    1,791

    Predefinito

    credo che semplicemente venga creata una sessione diversa da quella che ti aspetti tu. con session è solo un array è non un cookie in questo caso.La sessione è un cookie usa la funzione set_cookie per crearla.
    EDIT:pensandoci bene non è questo il problema puoi risolvere come descritto più avanti anche perché secondo me non valga la pena capire cosa volessi fare con quel script.
    ps. puoi racchiudere il codice php dentro [php]codice[/php] le input html con name e valore creano $_POST[un_nome] ti consiglio di verificare tutte le variabili POST con
    Codice PHP:
    if(isset($_POST['un_nome'],$_POST['2_nome'])){
    codice da controllare solo quando si verifica questo evento

    il quarto parametro come dice mail nel manuale dovrebbe trattarsi di intestazioni addizionali. http://php.net/manual/en/function.mail.php
    Ultima modifica di darbula : 30-03-2016 alle ore 23.07.41

  7. #7
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Predefinito

    Ma no, la sessione non era un particolare cookie che, però, viene memorizzato sul server?
    Perché il problema dei cookie è che sono disabilitabili, le sessioni no!

  8. #8
    darbula non è connesso AlterGuru
    Data registrazione
    24-04-2011
    Messaggi
    1,791

    Predefinito

    no mi sono espresso male, quando php ha abilitato PHPSESSID è usi $_SESSION crea il cookie PHPSESSID ma non quello che hai impostato tu. Il cookie viene spedito dal server ed è compito del browser ri inviarlo.
    Ad esempio entro in form.php se riempio i campi e invio (quindi faccio una richiesta) il server risponde con il cookie. La scadenza di una sessione se non è specificata è sino alla chiusura/inattività di quel fenomeno.
    Ultima modifica di darbula : 30-03-2016 alle ore 23.07.01

  9. #9
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Predefinito

    Quindi il mio problema si può risolvere impostando la durata in maniera particolare (tipo una decina-ventina di minuti) o faccio prima a usare un cookie vero e proprio?

  10. #10
    darbula non è connesso AlterGuru
    Data registrazione
    24-04-2011
    Messaggi
    1,791

    Predefinito

    facciamo prima a modificare lo script e farti fare copia/incolla. Al momento non ho tempo. Spero che ti aiutano il più presto possibile.

  11. #11
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Predefinito

    Ultimo aggiornamento e poi smetto di rompere, almeno per stasera...

    Ho modificato il codice in questa maniera ma non invia proprio alcuna mail:

    Codice PHP:
    if ($_POST['invia']) {
                            if (!isset(
    $_COOKIE[$appenainviato])) {
                                echo 
    "Grazie. Ti risponderemo al pi&ugrave; presto per metterci d'accordo sulla data e l'ora! :)";
                            } else {
                                
    $nome=$_POST['nome'];
                                
    $mail=$_POST['mail'];
                                
    $persone=$_POST['persone'];
                                
    $esperienza=$_POST['esperienza'];
                                
    $descrizione=$_POST['descrizione'];
                                
    $link=$_POST['link'];
                                
    $note=$_POST['note'];
                                    
    $destinatario="pebble@gravelrecords.com";
                                    
    $oggetto="Nuova richiesta da $nome";
                                    
    $info='$persone  $esperienza "/n" $descrizione "/n" $link "/n" $note';
                                    
    $da="$nome  $mail";
                                    
    mail ($destinatario$oggetto$info$da);
                                    echo 
    "Grazie. Ti risponderemo al pi&ugrave; presto per metterci d'accordo sulla data e l'ora! :)";
                                    
    $cookie_name="appenainviato";
                                    
    $cookie_value="YES";
                                    
    setcookie($cookie_name$cookie_value);
                            }
                        } else { 

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

    Predefinito

    La soluzione delle sessioni mi piace abbastanza, perché non ti convince granché?
    In effetti dipende da cosa vuoi ottenere.
    Usando sessioni (e/o cookies) in questo modo, non solo impedisci il re-invio del modulo al ricaricamento della pagina... ma impedisci al client anche invii successivi di nuovi moduli, finché la sessione (o il cookie) non scade.
    Con un re-indirizzamento, invece, impedisci il re-invio dei dati al ricaricamento, ma consenti al client di inviare un nuovo modulo successivamente (che di solito è il comportamento atteso). Non hai bisogno di creare una nuova pagina, il re-indirizzamento può portare alla pagina stessa.


    Ma deve specificare come enctype text/plain nel modulo html ne consegue che $_POST sarà vuoto se non esiste chiave=valore o con l'aggiunta di & tra più valori, Dovrebbe recuperare con file_get_contents('php://input');
    Non c'è motivo di specificare text/plain come enctype nel modulo HTML. Content-type dell'email ed enctype di un modulo sono concetti ortogonali tra loro.


    se ricarico insistentemente la pagina mi arrivano millemila mail tutte uguali (sto facendo questa cosa delle sessioni proprio per evitare qualche simpatico troll).
    Hai chiamato session_start prima di accedere al vettore $_SESSION?


    Edit: Rispondendo anche all'ultimo messaggio:
    Codice PHP:
    if (!isset($_COOKIE[$appenainviato])) { 
    Probabilmente intendevi
    Codice PHP:
    if (!isset($_COOKIE["appenainviato"])) { 
    Inoltre:
    Codice PHP:
    $info='$persone  $esperienza "/n" $descrizione "/n" $link "/n" $note'
    dovrebbe essere
    Codice PHP:
    $info="$persone  $esperienza \n $descrizione \n $link \n $note"
    Ultima modifica di mzanella : 30-03-2016 alle ore 23.58.32

  13. #13
    pebblefable non è connesso Neofita
    Data registrazione
    02-08-2015
    Messaggi
    11

    Predefinito

    Già ieri sera avevo provato con
    Codice PHP:
    if (!isset($_COOKIE["appenainviato"])) { 
    ma non è cambiato niente..

    Forse è perché avevo scritto /n anziché \n (?)

    Comunque sì, mi avete convinto: il reinvio è meglio. Ma come lo organizzo? Cioè, uno ce n'è già per dare la possibilità alla pagina di inviare gli input via e-mail, quello che mi consigliate di fare adesso è di fare un altro reinvio ancora dopo un tot. di secondi alla pagina principale?

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

    Predefinito

    C'è ancora qualcosa che non va nella chiamata a mail, nel quarto parametro, che dovrebbe seguire la struttura di un'intestazione:
    Codice PHP:
    $da "From: $nome <$mail>"
    Riguardo al re-invio, assumendo che tu voglia limitarti ad una sola pagina (index.php), puoi provare qualcosa del genere:
    Codice PHP:
    // Sends email, then redirects
    if (isset($_POST['invia'])) {
        ...
        
    mail(...);
        
    header('Location:index.php?action=mail_sent');
    }

    // Prints information message, if email was sent
    if (isset($_GET['action']) && $_GET['action'] == 'mail_sent') {
        echo 
    "Grazie. Ti risponderemo al pi&ugrave; presto per metterci d'accordo sulla data e l'ora! :)";
    }

    // Regular HTML form
    ... 
    In alternativa puoi mostrare il messaggio ed attendere qualche secondo prima del re-indirizzamento (con JavaScript), rendere l'operazione asincrona, od utilizzare pagine diverse.

Tags for this Thread

Regole di scrittura

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