- Home
- Categorie
- Coding e Sistemistica
- PHP
- Utilizzo metodo GET e POST
-
Il codice è tuo o l'hai preso da qualche parte?
-
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.
-
@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 . 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.
-
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
-
@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:
- la creazione di una nuova tabella per l'attivazione è solo una questione di ordine e semplicità o c'è altro da sapere?
- 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
-
-
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.
-
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.
-
-
@supercapocc said:
- 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.
- 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]
-
Fattooooooooooo! Dopo tante peripezie, migliaia di prove e riprove (tanto che se fosse esistito come servere reale, il mio localhost sarebbe andato in fumo ), 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!
-
Ciao icex,
non so come hai risolto visto che non hai postato il codice però avresti potuto fare una cosa molto seplice:
- Una form con i dati che ti interessava registrare nel database.
- Registrare una sessione
- Comporre una mail assegnando ad un qualcosa tipo "autorizzati" (?autorizzati=QuaIDDiSessione) l'id di sessione registrato e che è registarto nel database
- Inviare la mail
- 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
-
@supercapocc said:
- 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.
- 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