Visualizzazione dei risultati da 1 a 5 su 5

Discussione: Iscrizione Newsletter

  1. #1

    Iscrizione Newsletter

    Ciao a tutti,

    sto muovendo i miei primi passi col PHP incontrando ovviamente i primi problemi...

    Volendo realizzare un sistema semplice di iscrizione ad una newsletter con tanto di verifica inviata via email ed iscrizione ad un database MySql stavo studiando lo script postato sul sito Web PHP Easy Step:

    http://www.phpeasystep.com/phptu/24.html

    In pratica partendo da un modulo HTML dove si inseriscono i propri dati si manda il tutto ad uno script in PHP che ricava le informazioni dai campi e li invia in una tabella temporanea di un database assieme ad un codice temporaneo generato in maniera casuale e criptato con lo strumento md5. Fatto questo, lo script invia un messaggio email a chi si vuole iscrivere obbligandolo a confermare la volontà di iscriversi tramite un link che riporta al suo interno lo stesso codice temporaneo:
    Codice PHP:
    <?php
    include('config.php');

    // table name 
    $tbl_name=temp_members_db;

    // Random confirmation code 
    $confirm_code=md5(uniqid(rand()));

    // values sent from form 
    $name=$_POST['name'];
    $email=$_POST['email'];

    // Insert data into database 
    $sql="INSERT INTO $tbl_name(confirm_code, name, email)VALUES('$confirm_code', '$name', '$email')";
    $result=mysql_query($sql);

    // if succesfully inserted data into database, send confirmation link to email 
    if($result){

    // ---------------- SEND MAIL FORM ----------------

    // send e-mail to ...
    $to=$email;

    // Your subject
    $subject="Messaggio di conferma iscrizione Newsletter";

    // From
    $header="from: Newsletter<no_reply@prova.it>";

    // Your message
    $message="Messaggio di conferma iscrizione Newsletter \r\n";
    $message.="Clicca sul link per confermare la tua registrazione alla Newsletter. \r\n";
    $message.="http://www.prova.it/confirmation.php?passkey=$confirm_code";

    // send email
    $sentmail mail($to,$subject,$message,$header);

    }

    // if not found 
    else {
    echo 
    "Indirizzo email non trovato nel nostro database";
    }

    // if your email succesfully sent
    if($sentmail){
    echo 
    "Un messaggio di conferma e' stato inviato al tuo indirizzo email.";
    }
    else {
    echo 
    "Impossibile inviare il messaggio di conferma al tuo indirizzo di posta elettronica.";
    }
    ?>
    Facendo clic sul link dell'email, un altro script in PHP va a vedere se nella tabella temporanea del database esiste il codice e se lo trova sposta i dati dell'iscritto in una tabella definitiva del database e li cancella dalla tabella temporanea:

    Codice PHP:
    <?php
    include('config.php');

    // Passkey that got from link 
    $passkey=$_POST['passkey'];

    $tbl_name1="temp_members_db";

    // Retrieve data from table where row that match this passkey 
    $sql1="SELECT * FROM $tbl_name1 WHERE confirm_code ='$passkey'";
    $result1=mysql_query($sql1);

    // If successfully queried 
    if($result1){

    // Count how many row has this passkey
    $count=mysql_num_rows($result1);

    // if found this passkey in our database, retrieve data from table "temp_members_db"
    if($count == 1){

    $rows=mysql_fetch_array($result1);
    $name=$rows['name'];
    $email=$rows['email'];

    $tbl_name2="registered_members";

    // Insert data that retrieves from "temp_members_db" into table "registered_members" 
    $sql2="INSERT INTO $tbl_name2(name, email)VALUES('$name', '$email')";
    $result2=mysql_query($sql2);
    }

    // if not found passkey, display message "Wrong Confirmation code" 
    else {
    echo 
    "Codice di conferma non valido";
    }

    // if successfully moved data from table"temp_members_db" to table "registered_members" displays message "Your account has been activated" and don't forget to delete confirmation code from table "temp_members_db"
    if($result2){

    echo 
    "La tua registrazione e' stata attivata";

    // Delete information of this user from table "temp_members_db" that has this passkey 
    $sql3="DELETE FROM $tbl_name1 WHERE confirm_code = '$passkey'";
    $result3=mysql_query($sql3);

    }
    }
    ?>
    Funzione tutto alla grande fino alla verifica del codice: la tabella temporanea con i dati degli iscritti ricavati dal modulo viene popolata correttamente e viene aggiunto il codice random. Il messaggio email viene inviato correttamente e contiene il medesimo codice alfanumerico ma quando si fa clic sul link di conferma nell'email appare il messaggio di codice non valido e i dati non vengono passati nella tabella definitiva del database.

    La cosa ancora più grave per me inesperto e che la prima volta, e solo la prima, tutto ha funzionato a dovere ma poi più nulla nel senso che solo il primo ipotetico iscritto ha portato a termine con successo l'iscrizione alla newsletter e i dati sono stati correttamente spostati dalla prima alla seconda tabella del database. Inoltre se lascio vuoto il valore della variabile
    Codice PHP:
    $confirm_code ''
    tutto funziona e quindi il problema sta nel metodo di confronto del codice random.

    Qualcuno mi sa dare una spiegazione?
    E già che ci siamo, quanto è affidabile un simile sistema di iscrizione?
    Me ne sapete consigliare uno più performante?

    Ringraziandovi in anticipo, mi scuso se nel caso si sia già parlato di questo argomento.

  2. #2
    Se passi i parametri sull'URL devi recuperarli tramite GET e non POST:

    Modifica:

    Codice PHP:
    $passkey=$_POST['passkey']; 
    in:

    Codice PHP:
    $passkey=$_GET['passkey']; 
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3

    Grazie

    Grazie per la rapida risposta... che figura...

    Avevo cambiato da GET in POST per evitare che si leggesse il codice nella barra del browser...

    Che mi dici sulla sicurezza? Devo aggiungere i controlli sui campi del Form, vero?

    Sei stato gentilissimo.

  4. #4
    E' sicuramente sempre necessario verificare eventuali parametri passati dall'utente. Puoi utilizzare la funzione filter_var() col filtro FILTER_VALIDATE_EMAIL per verificare la mail:

    Codice PHP:
    if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
        
    // Email non valida

    Con le espressioni regolari puoi controllare che il nome non contenga caratteri non permessi preg_match() e la funzione mysql_real_escape_string() per filtrare i dati da inserire sul DB
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Grazie infinite, Satifal.
    Mi hai dato più di uno spunto x studiare

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.