Stanze riservate con password
27/09/2014 21:43:02 e modificato da gdr-online.com il 14/10/2020 08:12:20
dramsstaff ha scritto: Ho avuto diversi dubbi riguardo l'action
L'action deve puntare alla pagina a cui spedire i dati, la parte difficile di ciò sta nel fatto che la url è dinamica e dipende dalla chat in cui stai, in quel momento, cercando di accedere.
Per farla semplice, dovrebbe essere impostato in questo modo:
<form action="main.php?dir=<?php echo gdrcd_filter('url', $_GET['dir']); ?>" method="post" target="_self">
In questa maniera ogni chat privata si vedrà puntare l'action corretto (nel tuo caso il form è inglobato già in un istruzione php, di conseguenza la sintassi varia un pochino, ma vedrai più avanti).
A questo punto passiamo al codice vero e proprio.
Nella pagina frame_chat.inc.php, nelle righe iniziali c'è una richiesta al database che recupera già dei dati per quella precisa stanza (https://github.com/GDRCD/GDRCD/blob/master/pages/frame_chat.inc.php#L6 ↗).
Modificala aggiungendo all'elenco dei parametri il campo password che useremo per fare la verifica.
Adesso vediamo di revisionare un pochino il tuo codice ;-)
//se e' privata e l'utente non ha titolo di leggerla
if ($allowance === FALSE) {
// Procedura, solo se è stato inviata una password da confrontare
if (!empty($_POST['password'])) {
// la password corrisponde a quella impostata per questa locazione?
if ($_POST['password'] == $info['password']) {
// Sembra tutto ok, aggiungiamo il nome del personaggio all'elenco invitati
gdrcd_query("UPDATE mappa SET invitati = '". $info['invitati'] .','. gdrcd_capital_letter(strtolower(gdrcd_filter('in', $_SESSION['login']))) ."' WHERE id = ". $_SESSION['luogo'] ." LIMIT 1");
// Tuttavia assicuriamoci che il record sia effettivamente stato scritto sul db
if (gdrcd_query('affected')) {
// solo a questo punto lo dichiaro in grado di accedere
$allowance = true;
}
}
}
// Se il personaggio non è autorizzato mostriamo il form
if ($allowance != true) {
// Form
echo '<div class="warning">'.$MESSAGE['chat']['whisper']['privat'].'</div>
<br><br>
<div>Farsi riconoscere<br>
<form action="main.php?dir='. gdrcd_filter('url', $_GET['dir']) .'" method="post" target="_self">
<input type="text" name="password" value=""><br>
<input type="submit" value="Entra"><input type="reset" value="Ripeti">
</form></div>';
// Altrimenti Lo invitiamo ad accedere ;)
// (ovvero un trucco per fargli ricaricare la pagina così che lo riconosca come capace di accedere).
} else {
echo "Benvenuto nella cosca ". $_SESSION['login'] ."<br />",
'<a href="main.php?dir='. gdrcd_filter('url', $_GET['dir']) .'">Prosegui Oltre</a>';
}
}
Fammi sapere come va, ma soprattutto se sono chiari i procedimenti ;)
edit: ricorda che il forum di gdr-online sostituisce gli apici, e devi sostituirli tutti prima di poter provare il codice.
28/09/2014 01:02:42
Spiegazioni chiarissime, grazie davvero! ho impostato il codice sostituendo gli apici e riporto l'esito :-)
inizialmente mi ha dato un errore di sintassi e quindi ho tolto l'ultima parentesi graffa, quindi ho visualizzato il tutto correttamente. Si può inserire la pass, se è sbagliata lo spazio ritorna bianco semplicemente, se è corretta si passa allo step successivo, ossia si ricarica la pagina e c'è il link Prosegui oltre.
Cliccando su Prosegui Oltre mi rimanda alla chat privata che ora visualizzo benissimo, preciso che ho dovuto impostare un proprietario fisso, nel nostro caso un pg di Gestione, altrimenti continuava a rimandarmi alla pagina con l'inserimento della pass.
L'unico problemino l'ho trovato qui:
GDRCD MySQLi Error [File: frame_chat.inc.php; Line: 38]
Error Code: 1064
Error String: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server
version for the right syntax to use near 'affected' at line 1
Error Detail: affected
per farlo sparire ho tolto questa riga di codice qui:
if (gdrcd_query('affected'))
ma ovviamente immagino che se l'hai inserita nel codice mi serve :)
poi volevo chiederti un'altra cosa, è possibile inserire l'opzione che prevede di rimuovere il pg dall'elenco invitati nel momento in cui esce dalla chat, o almeno nel momento in cui effettua il logout dal sito?
perchè vedo che pur uscendo dal gioco, quando si rientra si ha ancora libero accesso alla chat riservata e vorrei che invece gli fosse sempre necessario rieffettuare la procedura di accesso.
28/09/2014 19:35:29
dramsstaff ha scritto: Spiegazioni chiarissime, grazie davvero!
Non c'è di che ;)
inizialmente mi ha dato un errore di sintassi e quindi ho tolto l'ultima parentesi graffa
La parentesi era legata al controllo che c'è ad inizio spezzone, pensavo avessi copiato in maniera incompleta il pezzo di codice, ma hai risolto da sola. Well Done!
L'unico problemino l'ho trovato qui:
GDRCD MySQLi Error ...
per farlo sparire ho tolto questa riga di codice qui:
if (gdrcd_query('affected'))
Quella riga lì serve a verificare che la richiesta al database abbia aggiornato correttamente l'elenco degli invitati.
Comunque l'errore è mio, dimenticavo che la tipologia di richiesta va specificata come secondo parametro, così:
if (gdrcd_query(null, 'affected'))
poi volevo chiederti un'altra cosa, è possibile inserire l'opzione che prevede di rimuovere il pg dall'elenco invitati nel momento in cui esce dalla chat, o almeno nel momento in cui effettua il logout dal sito?
Si può ma, se può interessarti il mio consiglio, secondo me non è un problema che ricordi il pg nella lista invitati fino a quando la password rimane la stessa.
Di conseguenza, tornando allo spezzone di codice iniziale nel ref_header, potresti fare che, quando il proprietario decide di cambiare la password nella stanza, l'elenco degli invitati venga svuotato: in questo modo tutti dovranno reinserire la nuova password prima di poter accedere.
Se l'idea non è ciò che vuoi ottenere allora si, dovresti rimuovere il nome del pg nell'elenco invitati delle chat in cui ha effettuato l'accesso al logout.
29/09/2014 12:44:41
Reintegrata la parte di codice corretta e va tutto alla grande! :-)
Riguardo all'elenco invitati effettivamente che un pg possa rientrare sempre nella chat di cui la prima volta ha dimostrato di conoscere la parola d'ordine, finchè non viene cambiata, è logico anche secondo me, ma da quanto ho inteso parlando con alcuni utenti della land sembra che questo passaggio di dover inserire la parola d'ordine ogni volta renda molto l'ambientazione, non so come spiegarlo, fa una certa scena insomma :-) E ne sono contenta perchè era proprio l'effetto che volevamo ottenere.
Quindi mi sono scervellata per tentare di capire come svuotare questo elenco invitati, la tua soluzione di togliere il nome del pg dall'elenco nel momento in cui effettua il logout è perfetta, ma non so come impostare il codice, o quantomeno la parte iniziale del codice, quella in cui si inserisce la clausola del "se il tal pg è uscito", perchè la seconda parte suppongo mi basti copiarla dal "caccia", quindi risettando l'elenco invitati senza il nome del pg che ha effettuato il logout (fermami se dico follie, please!) e qui confido nel tuo, ennesimo, aiuto...
Ho azzardato qualche altro tentativo, quindi impostando un orario in cui l'elenco invitati si dovrebbe svuotare per esempio, ma pur riuscendo a creare un codice sintatticamente corretto non dava effetti e anche se li avesse dati sarei rimasta soddisfatta per metà, perchè sarebbe stata una soluzione decisamente un pò "arrabattata"!
29/09/2014 21:37:28
Si tratta di studiare per bene una richiesta al database che:
a) Trovi tutte le stanze in cui è presente il nome del personaggio come invitato.
b) Aggiorni la lista invitati di ognuno di quei record rimuovendo il nome del personaggio che sta effettuando il logout.
Per trovare tutte le righe coinvolte in cui c'è il nickname del personaggio che sta effettuando il logout dobbiamo ricorrere ad una ricerca per pattern tramite l'operatore LIKE http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like ↗, al fine di trovare tutte quelle liste dove il contenuto parziale corrisponde a nomepersonaggio,.
La virgola viene aggiunta da gdrcd per separare la lista di nomi ed è utile includerla a nostra volta nella ricerca per evitare di trovare false corrispondenze (Ad esempio se un personaggio si chiama Sam e un altro Samuel, la ricerca di Sam troverebbe anche le righe di Samuel se non usassimo la virgola a definire la fine del nickname).
Di conseguenza sappiamo già come impostare la nostra clausola WHERE adesso:
WHERE invitati LIKE '%nome,%'
Trattandosi quindi di aggiornare una riga esistente, ciò a cui dobbiamo ricorrere è una query di UPDATE http://dev.mysql.com/doc/refman/5.0/en/update.html ↗
La tabella di riferimento in cui è presente la colonna invitati è la tabella mapp, quindi la parte iniziale della nostra query comincerà con:
UPDATE mappa
Quanto all'eliminazione del record, mysql ci mette a disposizione la funzione REPLACE http://dev.mysql.com/doc/refman/4.1/en/string-functions.html#function_replace ↗ per effettuare la ricerca e la sostituzione di una stringa in una colonna, in questo modo possiamo sostituire il nome del personaggio con una stringa nulla e rimuoverlo dalla lista.
SET invitati = REPLACE(invitati, 'nome,', '')
Adesso che abbiamo visto logicamente come comporre la query è arrivato il momento di mettere insieme le varie parti:
UPDATE mappa SET invitati = REPLACE(invitati, 'nome,', '') WHERE invitati LIKE '%nome,%'
Finalmente ecco la query di aggiornamento, ora però occorre fare l'ultimo passaggio e spostarla dalla progettazione logica a quella pratica, inserendo il nome del personaggio uscente come variabile e inserendo la query all'interno dell'apposita istruzione di GDRCD ;)
gdrcd_query("UPDATE mappa SET invitati = REPLACE(invitati, '". gdrcd_filter('in', $_SESSION['login']) .",', '') WHERE invitati LIKE '%". gdrcd_filter('in', $_SESSION['login']) .",%'");
Quanto alla posizione di questa query nel codice, non è importante, puoi scriverla in un qualsiasi punto (purché all'esterno di un qualsiasi blocco condizionale) finché si trova prima dell'istruzione gdrcd_close_connection.
Spero di averti aiutato a comprendere qualcosina in più, fammi sapere come va ;-)
29/09/2014 23:21:52
Appena finite tutte le prove del codice, innanzitutto grazie mille per la tua disponibilità, non solo nella formulazione del codice ma anche, e soprattutto, per non averlo postato e basta ma per il tuo gentilissimo intento di farmi capire come ci sei arrivato a quella stringa conclusiva. :-)
Sinceramente io non avrei mai potuto farla da me, ma quantomeno colgo l'occasione per tentare di capire qualcosina in più!
Riguardo all'esito delle prove... il codice l'ho inserito e fa delle cose ma in modo originale diciamo :-)
In sostanza invece di cancellare il nome del pg nel momento in cui fa il logout, lo cancella nel momento in cui un altro pg inserisce la password ed entra nella chat.
Sostanzialmente il primo pg non vede differenze, può continuare a scrivere ma se fa un Aggiorna o esce dalla chat, pur senza lasciare la land, viene chiuso fuori.
Se invece qualcuno presente nella lista invitati fa il logout non viene tolto dall'elenco.
Giusto per essere certi che non abbia dimenticato di inserire nulla nel codice, dovevo mettere solo quella stringa giusto? o impostare altro?
29/09/2014 23:35:34
La mentalità alla base dell'open source si può riassumere in tre parole chiave: cooperazione, condivisione e conoscenza.
Da parte mia cerco sempre di formulare interventi che mirino ad insegnare a chi non sa e mi fa piacere che tu abbia trovato il topic utile non soltanto al raggiungimento del tuo scopo ;-)
Quanto alla query non le va associato nessun controllo in quanto se il personaggio non risulta invitato in nessuna chat non verrà aggiornata nessuna riga.
Il problema che hai descritto mi perplime un pochino e mi porta a chiederti se hai copiato il pezzo di codice soltanto nel file logout.php (come dovrebbe essere) o anche in altri posti.
Il file di logout non viene chiamato accidentalmente: se lo visiti esci dal sito quindi mi suona strano che la query intervenga a modo suo, in caso controlla se nelle varie prove che hai fatto hai lasciato qualche rimasuglio di codice che potrebbe portarti al comportamento strano che hai esposto.
30/09/2014 00:06:29
oh mannaggia, io mica l'ho messo nel logout.php, l'ho messo da tutt'altra parte!! ho infilato quella stringa di codice in frame_chat..
scusami, ora è in logout, precisamente sotto la tua modifica per aggiornare l'ora di uscita di un pg, quasi all'inizio insomma.
Ma ancora mi dà quel problema, se entra un pg l'altro viene cancellato.
se può servire qualche dettaglio più preciso per capire l'inghippo dimmi cosa controllare :-)
30/09/2014 00:24:32
Nella pagina precedente ti ho fatto scrivere questo pezzo di codice nel frame_chat:
// Sembra tutto ok, aggiungiamo il nome del personaggio all'elenco invitati
gdrcd_query("UPDATE mappa SET invitati = '". $info['invitati'] .','. gdrcd_capital_letter(strtolower(gdrcd_filter('in', $_SESSION['login']))) ."' WHERE id = ". $_SESSION['luogo'] ." LIMIT 1");
Mi viene da supporre che $info['invitati'] non venga valorizzata come dovrebbe e risulta pertanto scritta nella query come valore vuoto.
Il mio consiglio è di provare a modificare la query in questo modo:
gdrcd_query("UPDATE mappa SET invitati = CONCAT(invitati, ',". gdrcd_capital_letter(strtolower(gdrcd_filter('in', $_SESSION['login']))) ."') WHERE id = ". $_SESSION['luogo'] ." LIMIT 1");
In pratica tramite l'istruzione CONCAT() di mysql ho indicato alla query di usare la colonna invitati direttamente nella stessa query invece di inserirla "dall'esterno" come nella query precedente. (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat)
A fronte di questo mi è venuto in mente anche un ulteriore correzione da applicare nell'ultima query che hai messo nel logout.php
gdrcd_query("UPDATE mappa SET invitati = REPLACE(invitati, '". gdrcd_filter('in', $_SESSION['login']) .",', '') WHERE invitati LIKE '%". gdrcd_filter('in', $_SESSION['login']) .",%' OR invitati LIKE '". gdrcd_filter('in', $_SESSION['login']) .",%' OR invitati LIKE '%,". gdrcd_filter('in', $_SESSION['login']) ."'");
La modifica sta nell'ultima parte della query, nelle clausole di ricerca, ed è dipesa dal fatto che il nominativo del personaggio può trovarsi in 3 posizioni differenti in una lista e la semplice clausola di ricerca scritta in precedenza non sarebbe stata in grado di rintracciare tutti i casi che, nello specifico, possono verificarsi quando il nome è..
..all'inizio della lista, apparendo quindi così: nome,personaggio2,personaggio3
..in mezzo: personaggio2,nome,personaggio3
..oppure alla fine: personaggio2,personaggio3,nome
30/09/2014 14:08:44
Buongiorno, ho inserito il nuovo codice e purtroppo non ci sono state variazioni, ma dopo diverse prove credo di aver trovato l’inghippo. In sostanza il comando funziona, tranne che per gli ultimi arrivati, nel senso che se in un elenco ci sono 3 nomi chi e' entrato per primo e chi e' entrato per secondo viene cancellato dalla lista nel momento del logout, chi e' entrato per ultimo no.
Alla buona ho fatto una prova, direttamente sul Database ho messo una virgola dopo l’ultimo nome in elenco e così anche quel pg e' stato cancellato dall’elenco al suo logout, con il problema però che a quel punto in elenco era rimasta solo una virgola che ha bloccato l’accesso a chi tentava di inserire la pass. La prova però mi ha fatto immaginare che magari si potrebbe ovviare al problema modificando questa parte
CONCAT(invitati, ',". gdrcd_capital_letter(strtolower(gdrcd_filter('in', $_SESSION['login']))) ."')
E anche questa
REPLACE(invitati, '". gdrcd_filter('in', $_SESSION['login']) .",', '')
Facendo si che il nome del pg non sia solo anticipato dalla virgola, come in CONCAT, e non sia solo seguito dalla virgola come in REPLACE. Quindi ho modificato le stringe facendo si che il nome sia sempre seguito e anticipato dalla virgola, così: ,nome,
L’elenco degli invitati in questo formato non e' fantastico, viene fuori qualcosa di questo tipo
,nome1,,nome2,,nome3,
ma sembra funzionare :-)
Non so se questa soluzione può creare bug in altre circostanze, continuerò a fare prove per assicurarmi di non aver creato più guai che vantaggi e attendo il tuo parere su questa mia “rudimentale” modifica :-)
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Foundation Galactic Frontier ↗
RAID Shadow Legends ↗
Neverness to Everness ↗
Fallen Gods ↗
CRSED: F.O.A.D. ↗
New Orleans ↗
AlterEgo ↗
Project Entropy ↗