• User

    Utilizzo metodo GET e POST

    Salve ragazzi. Avrei bisogno del vostro aiuto. Vorrei sapere se sia possibile utilizzare in una stessa pagina HTML, in cui vi sia incorporato linguaggio PHP, sia il metodo POST che il metodo GET, magari uno per un modulo e l'altro per un altro modulo.

    Trattasi di una pagina di registrazione al mio sito che sto costruendo e mi servirebbe da una parte acquisire i dati tramite le textbox per scriverli nel db (quindi metodo POST), mentre dall'altra inviare la mail di conferma con il solito URL avente il codice finale che mi riconduce alla pagina desiderata (e quindi metodo GET).

    Ho provato a farlo funzionare, mettendo tutte le textbox in un modulo con metodo POST mentre il pulsante d'invio in un altro modulo con metodo GET, ma nel momento in cui invio la registrazione mi resetta i valori in tutte le textbox, non inviandomi alcuna email.

    Come posso fare?


  • User

    Non c'è proprio nessuno che riesce a risolvere la questione?


  • User Attivo

    Posta il codice.
    :fumato:


  • User

    @vnt54 said:

    Posta il codice.
    :fumato:

    Certo 😉
    Allora la parte relativa all'inserimento dati da textbox è la seguente:

    if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
    $insertSQL = sprintf("INSERT INTO utenti (user_name, password, mail) VALUES (%s, %s, %s)",
    GetSQLValueString($_POST['ID_reg'], "text"),
    GetSQLValueString($_POST['password1'], "text"),
    GetSQLValueString($_POST['mail_reg'], "text"));
    $insertGoTo = "Ringraziamento post registrazione.php";
    mysql_select_db($database_connx_db, $connx_db);
    $Result1 = mysql_query($insertSQL, $connx_db) or die(mysql_error());

    e i tag per le varie textbox sono le seguenti:

    <form id="form1" name="form1" method="post" action="<?php echo $editFormAction; ?>">
    <p>
    <label>Inserisce l'ID Utente: <br />
    <br />
    <input type="text" name="ID_reg" id="ID_reg" />
    </label>
    <input type="text" name="ID_vis" id="ID_vis" />
    </p>
    <p> </p>
    <p>Inserisci
    la t password: </p>
    <p><span id="pass_reg">
    <input type="password" name="password1" id="password1" />
    <span class="passwordRequiredMsg">È obbligatorio specificare un valore.</span><span class="passwordMinCharsMsg">Numero minimo di caratteri non raggiunto.</span><span class="passwordMaxCharsMsg">Numero massimo di caratteri superato.</span></span></p>
    <p>Conferma la password inserita:</p>
    <p><span id="pass_conf">
    <input type="password" name="password2" id="password2" />
    <span class="confirmRequiredMsg">È obbligatorio specificare un valore.</span><span class="confirmInvalidMsg">I valori non corrispondono.</span></span> </p>
    <p> </p>
    <p>Inserisci il tuo indirizzo e-mail: </p>
    <p><span id="mail_reg">
    <input type="text" name="mail_reg" id="mail_reg" />
    <span class="textfieldRequiredMsg">È obbligatorio specificare un valore.</span><span class="textfieldInvalidFormatMsg">Formato non valido.</span></span></p>
    <p>Conferma il tuo indirizzo e-mail:</p>
    <p><span id="spryconfirm1">
    <input type="text" name="mail_conf" id="mail_conf" />
    <span class="confirmRequiredMsg">È obbligatorio specificare un valore.</span><span class="confirmInvalidMsg">I valori non corrispondono.</span></span></p>
    <p> </p>
    <p>
    <input type="hidden" name="MM_insert" value="form1" />
    </p>
    </form>
    (Come si può notare, tutto questo nella form 1).

    Fino ad ora è stata usata la variabile POST per acquisire i valori dalle textbox.

    Adesso voglio implementare un "button" con la funzione mail() per inviare una mail alla casella di posta del registrato ed inviarne un link che lo indirizzerà ad una pagina particolare.
    La mia intezione è aggiungere una query_string al link, inviandola con il metodo GET alla nuova pagina. Quest'ultima, oltre a mostrare un messaggio di ringraziamento, confronterà la querystring con un valore in database, attivando l'utente. Per fare tutto questo, però, è necessario creare un nuovo modulo che abbia come metodo il GET e non il POST usato fin'ora.

    Il codice da me elaborato è il seguente (ma non funziona:crying: perchè non invia niente e mi ritorna sulla pagina del modulo di registrazione):

    $destinatario = $_POST['mail_reg'];
    $oggetto = "Conferma Registrazione";
    $name = $_POST['ID_reg'];
    $codice= funzione(); (una che restituisce il codice casuale)

    $messaggio = "Bla Bla bla..... clicca sul seguente link:
    h..p://....Reg_convalidata.php/?cod=$codice" ;

    mail($destinatario,$oggetto,$messaggio);

    Come fare? 😞


  • User Attivo

    Il codice è tuo o l'hai preso da qualche parte?


  • User Attivo

    Uhm..
    Io non ho capito molto bene quello che devi fare, ossia stai facendo un modulo di registrazione con relativo link di attivazione, il resto poi non mi è chiaro.
    Perchè non cambi un pò logica ? Tu fai registrare l'utente con i dati raccolti tramite POST. Lo inserisci nel db con un campo impostato su 0. Se la query ha successo generi il codice casuale e invii il link di attivazione all'utente.


  • User

    @tigrone said:

    Il codice è tuo o l'hai preso da qualche parte?

    No no è mio... uso Dreamweaver e quindi alcuni codici li genera lui in automatico quando modifico qualcosa in "Progettazione"... E poi non avrebbe senso postare il codice di qualcun altro se il problema è mio, non credi? 😉

    @supercapocc said:

    Uhm..
    Io non ho capito molto bene quello che devi fare, ossia stai facendo un modulo di registrazione con relativo link di attivazione, il resto poi non mi è chiaro.
    Perchè non cambi un pò logica ? Tu fai registrare l'utente con i dati raccolti tramite POST. Lo inserisci nel db con un campo impostato su 0. Se la query ha successo generi il codice casuale e invii il link di attivazione all'utente.

    Ma è quello che voglio fare io! Forse ieri scrivevo velocemente perchè andavo di fretta e non mi sono spiegato bene. In altre parole, quando l'utente si registra inserendo i suoi dati nei vari moduli di testo, oltre ad inviare i dati in questione al db, questo ne conterrà uno (ad esempio "convalidato") che è impostato su 0. All'atto della pressione del pulsante, voglio che venga inviata una email di conferma contenente l'indrizzo di attivazione, che a sua volta conterrà alla fine un codice casuale. Voglio però che questo codice casuale sia memorizzato nel db in un opportuno campo (chiamato magari "cod_convalida") E' chiaro che in questo caso, affinchè il codice sia visibile nell'URL, devo inviarlo tramite metodo GET.
    A questo punto, cliccando sulla URL nell'email, si sarà reindirzzati alla pagina nuova (es. una pagina di ringraziamento) e qui voglio che ci sia un modulo in grado di catturare il codice casuale sorgente del link (e quindi per farlo devo utilizzare sempre GET con $_GET seguito dal nome della variabile, giusto?) e se il valore preso è uguale a quello inserito in "cod_convalida" (sfruttando l'esempio di prima) allora nel campo "convalidato" (sempre in riferimento a quanto detto prima) relativo a quell'utente comparirà 1 anzichè 0.
    A questo punto l'utente è registrato e vorrei che venga reindirizzato automaticamente alla pagina iniziale del mio sito (es. "Index.php"), sfruttando la funzione "header()" (però sempre a patto che in "convalidato" figuri 1).
    Detto ciò, credo che sia stato più chiaro rispetto a ieri e mi scuso per la mia non-chiarezza :rollo:. Io credo che il discorso fili però, come accennai ieri, trovo difficoltà nel far coniugare bene il metodo POST con quello GET. Adesso lascio la parola a voi e spero riusciate a risolvere questo dilemma. :ciauz:


  • User Attivo

    OK, allora adesso abbiamo fatto un pò di chiarezza, mi resta da capire il problema del conflitto tra $_GET e $_POST, cmq mi ti dico come faccio io.

    Pagina di registrazione :

    [PHP]
    if($submit)
    {
    // intercetto i valori dei campi
    $email = $_POST['email'];
    $password = $_POST['password'];
    // facciamo dei controlli per verificare la validità del dato con funzioni personalizzate
    $password = $validate->password($password);
    // se ok passo tutto al db
    $sql = 'INSERT INTO table_utenti (email, password, active) VALUES ("'.mysql_real_escape($email).'", "'.mysql_real_escape(md5($password)).'", 0)';
    my_sql_query($sql);
    $user_id = mysql_insert_id();
    // genero codice causale
    $code = generate_random_code();
    // in una tabella separata inserisco i dati per l'attivazione
    $sql = 'INSERT INTO table_activation (user_id, code, active) VALUES ('.$user_id.', "'.$code.'", 0)';
    my_sql_query($sql);
    // mando mail all'utente
    $subject = 'Attivazione';
    $to = $email;
    $message = 'Ciao , per attivarti clicca su questo link http://www.tuosito.com/activation.php?code='.$code;
    $headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    mail($to, $subject, $headers);
    }
    [/PHP]

    Per quanto riguarda la pagina di attivazione

    [PHP]
    if(!isset($_GET['code'])) exit();
    $code = (string)$_GET['code'];
    $sql = 'SELECT user_id, active FROM activation_table WHERE code = "'.$code.'"';
    $result = mysql_query($sql);
    if(mysql_num_rows($result) < 1) exit('codice non valido');
    else
    {
    $row = mysql_fetch_row($result);
    if($row['active'] == 1) exit('utente già attivato');
    else
    {
    $sql = 'UPDATE activation_table SET active = 1 WHERE user_id = ' .$row['user_id'];
    mysql_query($sql);
    $sql = 'UPDATE user_table SET active = 1 WHERE user_id = ' .$row['user_id'];
    mysql_query($sql);
    }
    }
    [/PHP]

    Avrò fatto sicuramente qualche errore di sintassi ma la logica c'è.

    Ciao


  • User

    @supercapocc said:

    OK, allora adesso abbiamo fatto un pò di chiarezza, mi resta da capire il problema del conflitto tra $_GET e $_POST, cmq mi ti dico come faccio io.

    Pagina di registrazione :

    [PHP]
    if($submit)
    {
    // intercetto i valori dei campi
    $email = $_POST['email'];
    $password = $_POST['password'];
    // facciamo dei controlli per verificare la validità del dato con funzioni personalizzate
    $password = $validate->password($password);
    // se ok passo tutto al db
    $sql = 'INSERT INTO table_utenti (email, password, active) VALUES ("'.mysql_real_escape($email).'", "'.mysql_real_escape(md5($password)).'", 0)';
    my_sql_query($sql);
    $user_id = mysql_insert_id();
    // genero codice causale
    $code = generate_random_code();
    // in una tabella separata inserisco i dati per l'attivazione
    $sql = 'INSERT INTO table_activation (user_id, code, active) VALUES ('.$user_id.', "'.$code.'", 0)';
    my_sql_query($sql);
    // mando mail all'utente
    $subject = 'Attivazione';
    $to = $email;
    $message = 'Ciao , per attivarti clicca su questo link h..p://....tuosito.com/activation.php?code='.$code;
    $headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    mail($to, $subject, $headers);
    }
    [/PHP]

    Per quanto riguarda la pagina di attivazione

    [PHP]
    if(!isset($_GET['code'])) exit();
    $code = (string)$_GET['code'];
    $sql = 'SELECT user_id, active FROM activation_table WHERE code = "'.$code.'"';
    $result = mysql_query($sql);
    if(mysql_num_rows($result) < 1) exit('codice non valido');
    else
    {
    $row = mysql_fetch_row($result);
    if($row['active'] == 1) exit('utente già attivato');
    else
    {
    $sql = 'UPDATE activation_table SET active = 1 WHERE user_id = ' .$row['user_id'];
    mysql_query($sql);
    $sql = 'UPDATE user_table SET active = 1 WHERE user_id = ' .$row['user_id'];
    mysql_query($sql);
    }
    }
    [/PHP]

    Avrò fatto sicuramente qualche errore di sintassi ma la logica c'è.

    Ciao

    Premetto che è da poco che mi cimento con PHP, però l tuo modo di spiegare è veramente esaustivo. Grazie :). E colgo l'occasione per scusarmi di eventuali errori presenti nelle precedenti risposte che ho dato 😊.. Ma d'altro canto è solo sbagliando che s'impara 😉 In ogni caso, le uniche 2 cose che non mi sono chiare della tua ultima risposta sono:

    1. la creazione di una nuova tabella per l'attivazione è solo una questione di ordine e semplicità o c'è altro da sapere?
    2. ho letto googlando che affinchè si possa usare la variabile $_GET nella pagina di arrivo è necessario trasmettere l'informazione dalla pagina di partenza con il metodo GET. E' qui che risiede il mio vero problema, ossia coniugare l'ultilizzo del GET insieme a quello del POST: come mai tu nella pagina di attivazione l'hai fatto senza trasmetterlo in GET?

    Grazie ancora per la disponibilità Supercapocc 🙂


  • User Attivo
    1. Un database deve essere ottimizzato, quindi ogni tabella deve avere la sua funzione. Il codice di attivazione una volta utilizzato non servirà più, quindi facciamo una tabella apposita.

    2. No, $_GET si deve usare nella pagina di arrivo. $_GET , in inglese afferrare, prendere. Non significa trasmettere.
      Nella pagina di partenza strutturi il link della pagina di arrivo, passandogli una coppia chiave-valore che sarà recuperata in seguito.

    [PHP]
    tuosito.com/activation.php?code='.$code;
    [/PHP]

    Ciao e buon PHP.


  • User

    @supercapocc said:

    1. Un database deve essere ottimizzato, quindi ogni tabella deve avere la sua funzione. Il codice di attivazione una volta utilizzato non servirà più, quindi facciamo una tabella apposita.
    1. No, $_GET si deve usare nella pagina di arrivo. $_GET , in inglese afferrare, prendere. Non significa trasmettere.
      Nella pagina di partenza strutturi il link della pagina di arrivo, passandogli una coppia chiave-valore che sarà recuperata in seguito.

    [PHP]
    tuosito.com/activation.php?code='.$code;
    [/PHP]

    Ciao e buon PHP.

    Ti ho capito perfettamente 🙂 Comunque ho provato a metter su quanto mi hai consigliato ( con le opprtune modifiche di sintassi). Anche se ho ovviato alla non-funzionalità di "mysql_insert_id ()" impostando l'incremento automatico direttamente nel db (non riesco proprio a capire perchè non andasse quella benedetta funzione :x) sono nuovamente in un vicolo cieco: il campo attivato è irremovibile sullo 0 e non riesco proprio a capire cos'è che non va.:?

    Ecco il codice: (Supercapocc mi sono tenuto a grandi linee sul tuo codice almeno per testarne un po' la funzionalita. Quando finalmente avrò capito dove sta l'errore apporterò le opportune modifche)

    [PHP]
    <?
    if(isset($_GET['cod'])) // (senza la "e" perchè è così che lo trasmetto)
    {$code = (string) $_GET['cod'];}
    $sql = 'SELECT id, attivato FROM attivazione WHERE code='.$code.'';
    $result = mysql_query($sql);
    if(mysql_num_rows($result) < 1) exit('codice non valido');
    $row = mysql_fetch_row($result);
    if($row['attivato'] == 1) exit('utente già attivato');
    else{ $sql = 'UPDATE attivazione SET attivato=1 WHERE id ='.$row['id'];
    mysql_query($sql,$conn_db) or die(mysql_error());}
    ?>
    [/PHP]


  • User

    Fattooooooooooo! 😄 Dopo tante peripezie, migliaia di prove e riprove (tanto che se fosse esistito come servere reale, il mio localhost sarebbe andato in fumo :rollo:), alla fine ci sono riuscitoooo! 🙂 ammetto che i controlli che avevo fatto in precedenza erano proprio scadenti. Così ho deciso di scandagliare funzione per funzione, eseguirla correttamente ed alla fine, usando un inglesismo... IT WORKS! 😄

    E a proposito di inglese, Supercapocc ci tenevo a precisare che GET può assumere molteplici significati a seconda del contesto in cui viene usato. Rimanendo d'accordo con te nel fatto che il suo significato più ricorrente sia comparabile al CATCH (afferrare), in alcuni casi può assumere anche il significato di GIVE (dare) o FETCH (portare). Da qui la mia indecisione sul fatto di dover anche trasmettere con GET (nozione che, ripeto, è stata acquisita googlando).
    Comunque ti ringrazio tantissimo per avermi dato un enorme aiuto postandomi lo schema del codice. Mi è stato di stimolo per imparare meglio il PHP.
    Non mi rimane che dirti: alla prossima! 😉 Ciaoooo!


  • User

    Ciao icex,

    non so come hai risolto visto che non hai postato il codice però avresti potuto fare una cosa molto seplice:

    1. Una form con i dati che ti interessava registrare nel database.
    2. Registrare una sessione
    3. Comporre una mail assegnando ad un qualcosa tipo "autorizzati" (?autorizzati=QuaIDDiSessione) l'id di sessione registrato e che è registarto nel database
    4. Inviare la mail
    5. Quando l'utente apre la mail e si trova sul sito un update del campo con l'id di sessione portandolo a 0 e quello con l'id di autentificazione portandolo a 1

    5 Semplici passaggi che consentono di registrare un utente senza dover fare voli pindarici o andare da Bologna a Milano senza passare prima da Tokyo come hai fatto tu.

    Ciao


  • User

    @supercapocc said:

    1. Un database deve essere ottimizzato, quindi ogni tabella deve avere la sua funzione. Il codice di attivazione una volta utilizzato non servirà più, quindi facciamo una tabella apposita.
    1. No, $_GET si deve usare nella pagina di arrivo. $_GET , in inglese afferrare, prendere. Non significa trasmettere.
      Nella pagina di partenza strutturi il link della pagina di arrivo, passandogli una coppia chiave-valore che sarà recuperata in seguito.

    [PHP]
    tuosito.com/activation.php?code='.$code;
    [/PHP]

    Ciao e buon PHP.

    A cosa serve una tabella apposita totalmente inutile ?

    Quando registri un utente nel tabella utenti, user, users o vatteloapesc devi mettere due campi che sono: SIDREGISTRATION e ACTIVATION. Quando l'utente si registra il primo contiene l'id di sessione e l'altro uno 0. Al momento in cui la mail viene autenticata il primo contiene uno 0 e il secondo un 1; attivazione fatta fine del discorso.

    Una tabella relazionale come dici tu è improponibile.

    Pensa a questo scenario: Ho un database dove in una tabella registro gli utenti, un'altra se sono attivi o no, un'altra per i permessi e una per le relazioni con i contenuti che immettono e una per i contenuti. Vuoi forse dirmi che ogni volta che devo andare a guardare chi ha immesso cosa devo anche controllare se si è autenticato ? Giammai. Se non si è autenticato non immette un bel niente quindi non ho niente da controllare.

    L'ottimizzazione delle tabelle come dici tu, nei database relazionali, non riguarda certamente un campo com il SID di autenticazione. Si usa dividere i dati degli utenti su più tabelle per non stressare i database in base a quelli che possono variare nel tempo e quelli che non verieranno mai o quelli che possono aggiungersi (post, ordini evasi in un ecommerce, articoli inviati in un cms, altre forme di archivio).

    Tra le altre cose usando una tabella come dici tu ogni volta che un utente si autentica dovresti prima fare una query sulla tabella utenti poi se la coppia username=>password è corretta una seconda query sulla tabella dei codici di attivazione. E' semplicemente una scemenza enorme.

    [php]
    $strQuery = "SELECT username, password, activation FROM users WHERE userID = $userID";
    [/php]

    Semplice, chiara e concisa