[GDRCD5] Form assegnazione esperienza a più utenti
[GDRCD5] Form assegnazione esperienza a più utenti postato il 26/09/2011 23:10:36 nel forum programmazione, open source e hosting
Ok, la domanda è stupida e me ne rendo conto... ma non riesco a raccapezzarmi >.<
Allora, la questione è questa: praticamente vorrei creare un form che permetta l'assegnazione di punti esperienza a più utenti, facendo in modo che l'unico modo per assegnare px non sia quello di andare in scheda per scheda. Non sapendo materialmente come fare, però, ho provato a fare questa cosa qui, prendendo ad esempio il sistema di invio messaggi, per la variabile iniziale
<?php /* Assegnamento PX*/
if ($_POST['op']=="assegna"){
if((is_numeric($_POST['px'])===TRUE)&&($_SESSION['permessi']>=GAMEMASTER)){
$check_dest=explode(',',gdrcd_filter('get',$_POST['destinatario']));
$destinat=trim($check_dest[0]);
$result=gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".gdrcd_filter('num',$_POST['px'])." WHERE nome = '".$destinat."'", 'result');
...
sotto ho questo form per l'invio dei dati
<div class="form_gioco">
<form action="main.php?page=servizi_assegnazione_px"
method="post">
<div class="form_label"><?php print gdrcd_filter('out',$MESSAGE['interface']['sheet']['px']['why']);?></div>
<div class="form_field"><input name="causale" /></div>
<div class="form_label"><?php print gdrcd_filter('out',$MESSAGE['interface']['sheet']['px']['px']);?></div>
<div class="form_field"><input name="px" value="0" /></div>
<div class="form_label"><?php print gdrcd_filter('out',$MESSAGE['interface']['user']['stats']['character']);?></div>
<div class='form_field'>
<input type="text"
name="destinatario"
value="<?php echo gdrcd_filter('get',$_POST['destinatario']); ?>" />
</div>
<input type="hidden" value="assegna" name="op" />
<div class="form_submit">
<input type="submit" value="<?php print gdrcd_filter('out',$MESSAGE['interface']['forms']['submit']); ?>" />
<input type="hidden"
value="<?php print gdrcd_filter('get',$_POST['destinatario']); ?>"
name="pg" />
</div>
</form>
ora, quale è la questione? la questione è che i dati me li invia, mi aggiorna l'esperienza e tutto... ma solo relativamente ad un utente solo. Andando un po a tentativi, pensavo fosse necessario, semplicemente, copia incollare più volte i form label e form field, ma chiaramente, così non và... e così facendo l'esperienza me la aggiorna solo all'ultimo utente.
Come devo costruire il form, quindi (e anche la query iniziale, suppongo) per fare in modo che mi aggiorni il dato dell'esperienza anche a più pg e non solo uno?
Preciso che mio interesse è mantenere la struttura
CAUSALE
PX
PG
CAUSALE
PX
PG
CAUSALE
PX
PG
e via dicendo, così da poter eventualmente assegnare, ai vari, diversi pg, un numero di px diverso e con causali diverse.
grazie per ogni eventuale risposta :)
Pagine → 1 2
26/09/2011 23:59:10
nicodem ha scritto: ... non ho capito!
Dal codice che hai riportato:
$destinat=trim($check_dest[0]);
$result=gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".gdrcd_filter('num',$_POST['px'])." WHERE nome = '".$destinat."'", 'result');
Fai effettivamente solo il primo destinatario. Quei "..." per cosa stanno?
Ci vorrebbe un ciclo for per tutti i valori che hai ottenuto splittando rispetto alla virgola.
i puntini stanno a significare "il codice continua" xD
ti ripeto.... purtroppo sto andando a tentativi, lo ammetto <.<
ho anche provato a mettere, dove dici tu
$destinat=gdrcd_filter('get',$_POST['destinatario']);
ma la questione non cambia.
Metto in altri termini la questione: vorrei fare in modo che tramite il form sotto si possano assegnare punti esperienza a più pg, i cui nomi sono da specificare in diversi form field, sul tipo di quelli presenti nel form :)
solo che non mi riesce di capire come si fa <.<"
27/09/2011 00:00:14 e modificato da leoblacksoul il 27/09/2011 00:05:51
eh, se vuoi fare una cosa limitata la logica è quella. Cioè gli metti fissi, chessò, 5 posti per dare esperienza a 5 utenti (come avevi pensato tu, basta copiare 5 volte i campi). Ovviamente la chiave sta nel dare nomi diversi a tutti gli elementi, altrimenti si sovrascrvono a vicenda quando arrivano su PHP (ecco perchè si setta solo l'ultimo).
Volendolo fare un po' più avanzato, ci metti un pochino di javascript; parti da un solo elemento per assegnare exp, e poi cliccando un bottone aggiungi altri campi uguali (ma con id e name diversi!) al volo, usando javascript.
Ecco un esempio, l'avevo usato come guida la prima volta che avevo provato ad aggiungere dinamicamente elementi con javascript. Se usi Jquery è infinitamente più semplice, questo esempio è javascript puro: http://www.webdeveloper.com/forum/showthread.php?t=71813 ↗
EDIT: Per gestire comodamente la cosa su PHP quando ti arrivano i dati, basta che dai dei nomi di questo tipo ai tuoi campi:
<input name="exp[1][pg]" />
<input name"exp[1][px]" />
<input name="exp[1][causale]"/>
ovviamente facendo andare avanti il numero per ogni gruppo di campi. Così su PHP ti ritroverai con la variabile $_POST['exp'] che sarà un array, che contiene in ogni suo elemento un altro array; il quale avrà gli elementi 'pg', 'px' e 'causale' che contengono i tuoi dati
27/09/2011 00:23:47
la soluzione tramite JS sembra interessante... appena fatta quella "brutale" tramite php la provo u.u
ho provato a cambiare i nomi come suggerito, ma... non mi aggiorna l'esperienza ç_ç" ho anche provato a cambiare la query iniziale come suggerito da nicodem, ma la questione non cambia. Forse che il problema sia in come è scritto il "submit"?
27/09/2011 00:38:51
provo a farti un esempio di codice, nella versione base senza JS.
<?php
if(isset($_POST['submit'])){
if(($_SESSION['permessi']>=GAMEMASTER)){
foreach($_POST['exp'] as $item){
$pg=gdrcd_filter('get',$item['pg']);
$exp=gdrcd_filter('get',$item['px']);
$caus=gdrcd_filter('get',$item['causale']);
//Qui usa $pg, $px e $caus per costruire la tua query di inserimento punti EXP
}
}
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<fieldset>
<legend>Utente1</legend>
<label>Nome Utente: </label><input type="text" name="exp[1][pg]" />
<label>Esperienza: </label><input type="text" name="exp[1][px]" />
<label>Causale</label><input type="text" name="exp[1][causale]" />
</fieldset>
<fieldset>
<legend>Utente2</legend>
<label>Nome Utente: </label><input type="text" name="exp[2][pg]" />
<label>Esperienza: </label><input type="text" name="exp[2][px]" />
<label>Causale</label><input type="text" name="exp[2][causale]" />
</fieldset>
<input type="hidden" name="submit" value="1" />
<input type="submit" name="Invia" />
</form>
27/09/2011 12:59:28
grazie mille a tutti! ho risolto! *_*
ho messo la prima parte del codice così:
<?php
if(isset($_POST['submit'])){
if(($_SESSION['permessi']>=GAMEMASTER)){
foreach($_POST['exp'] as $item){
$pg=gdrcd_filter('get',$item['pg']);
$exp=gdrcd_filter('get',$item['px']);
$caus=gdrcd_filter('get',$item['causale']);
$result=gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".gdrcd_filter('num',$exp)." WHERE nome = '".$pg."'", 'result');
/*Registro l'operazione*/
$query = "INSERT INTO log (nome_interessato, autore, data_evento, codice_evento ,descrizione_evento) VALUES ('".gdrcd_capital_letter(gdrcd_filter('in',$pg))."', '".$_SESSION['login']."', NOW(), ".PX.", '(".gdrcd_filter('num',$exp).' px) '.$caus."')"; mysql_query($query);
print '<div class="warning">'.gdrcd_filter('out',$MESSAGE['warning']['done']).'</div>';
} else {
print '<div class="warning">'.gdrcd_filter('out',$MESSAGE['warning']['camt_do']).'</div>';
}
/*Avviso l'utente*/
if ($_SESSION['login']!=$_POST['nome']){
$query="INSERT INTO messaggi (mittente, destinatario, spedito, testo, oggetto) VALUES ('".$_SESSION['login']."', '".$pg."', NOW(), 'Ti sono stati assegnati ".gdrcd_filter('num',$exp).' px con la seguente motivazione: '.$caus."', '".gdrcd_filter('in',$MESSAGE['interface']['skills']['oggetto'])."')";
}
mysql_query($query);
}
}
}
?>
Solo, senza quelle parti che ho messo in grassetto. Credo di non sapermici raccapezzare con le parentesi, ma.... vabbè xD
altra cosa che ho cambiato è stato indicare, nel form, come action l'indirizzo del form [insomma: action="main.php?page=servizi_assegnazione_px"], invece che come indicato da Leo (la pagina mi dava errore). Curiosità "formativa": come mai? E in quali casi si usa come action quanto indicato da Leo?
27/09/2011 13:23:19 e modificato da vino_veritas il 27/09/2011 13:24:33
$_SERVER['PHP_SELF'] è semplicemente l'indirizzo dello script attualmente in esecuzione. Tu invece hai bisogno della stringa di query (per intenderci, quella a partire dal punto interrogativo in poi nell'action); leo intendeva che dovevi utilizzare nell'action:
$_SERVER["PHP_SELF"] . "?page=servizi_assegnazione_px"
:-)
27/09/2011 14:26:42
vino_veritas ha scritto: $_SERVER['PHP_SELF'] è semplicemente l'indirizzo dello script attualmente in esecuzione. Tu invece hai bisogno della stringa di query (per intenderci, quella a partire dal punto interrogativo in poi nell'action); leo intendeva che dovevi utilizzare nell'action:
$_SERVER["PHP_SELF"] . "?page=servizi_assegnazione_px"
:-)
Interessante... non lo sapevo! (me scema)
grazie ancora a tutti ^^ ora che ho risolto nel modo più brutale, provo anche ad ingegnarmi con la soluzione tramite JS :D
27/09/2011 15:27:37
Sviste notturne v.v
Stai attenta che gli utenti inseriti nel form esistano. Il tuo codice non tiene conto di eventuali errori, se qualcuno inserisce un utente inesistente viene comunque registrata l'assegnazione nei log.
La parte che hai messo in grassetto non ci stava perchè stai cercando di mettere un else dopo un foreach.
$_POST['nome'] cos'è? Nel nostro form non c'è nessun campo chiamato così. Per avvisare ogni utente che gli è stata aggiunta esperienza devi fare quel controllo dentro al foreach, con la condizione if($_SESSION['login']!=$item['pg']). Possibilmente mettendo il mysql_query dentro all'if, non fuori.
27/09/2011 17:33:35 e modificato da irenes il 27/09/2011 17:40:56
leoblacksoul ha scritto: Sviste notturne v.v
Stai attenta che gli utenti inseriti nel form esistano. Il tuo codice non tiene conto di eventuali errori, se qualcuno inserisce un utente inesistente viene comunque registrata l'assegnazione nei log.
La parte che hai messo in grassetto non ci stava perchè stai cercando di mettere un else dopo un foreach.
$_POST['nome'] cos'è? Nel nostro form non c'è nessun campo chiamato così. Per avvisare ogni utente che gli è stata aggiunta esperienza devi fare quel controllo dentro al foreach, con la condizione if($_SESSION['login']!=$item['pg']). Possibilmente mettendo il mysql_query dentro all'if, non fuori.
$_POST['nome'] è un refuso del vecchio codice :) non avevo notato la sua presenza, grazie per avermelo fatto notare! :)
allora, a questo punto, visto che ci sono, domando: come fare per tenere conto di eventuali errori, magari avvisando dell'inesistenza del pg di cui si è sbagliato a scrivere il nome? v.v
e poi c'è una questione che ho potuto verificare ora, purtroppo <.<
allora: se uno dei field dove vanno messi i nomi dei pg resta vuoto (ovvero, in esempio: io ho due field in cui mettere potenzialmente due nomi di pg, ma ne sfrutto solo uno), mi "parte" lo stesso un aggiornamento del log sul DB, ovviamente aggiornamento a... nessuno, visto che il pg non esiste. Il fatto è che mi parte anche il messaggio automatico di avviso di ricezione px, ovviamente. Peccato che, oltre ad inserire il messaggio in DB, non esistendo il pg, il sistema messaggi segnali la presenza di un messaggio a tutta l'utenza, senza che però qualcuno, aprendo la posta, si ritrovi il messaggio xD
27/09/2011 19:25:51 e modificato da leoblacksoul il 27/09/2011 19:28:01
Ovviamente XD
Questo bug che hai trovato è un conseguenza diretta dell'assenza del controllo degli errori che abbiamo menzionato.
Fare il controllo è molto semplice, basta fare una query per controllare che il pg esista prima di tutto. Per evitare il caos, te lo scrivo in una funzione a parte, anche se gdrcd fa scarso uso (nullo?) di funzioni all'interno dei suoi file inclusi.
function userExists($user){
$MySql="SELECT nome FROM personaggio WHERE nome='".$user."'";
$res=gdrcd_query($MySql);
if(!empty($res))
return true;
return false;
}
if(isset($_POST['submit'])){
if(($_SESSION['permessi']>=GAMEMASTER)){
foreach($_POST['exp'] as $item){
$pg=gdrcd_filter('get',$item['pg']);
$exp=gdrcd_filter('get',$item['px']);
$caus=gdrcd_filter('get',$item['causale']);
if(userExists($pg)){
$result=gdrcd_query("UPDATE personaggio SET esperienza = esperienza + ".gdrcd_filter('num',$exp)." WHERE nome = '".$pg."'", 'result');
/*Registro l'operazione*/
$query = "INSERT INTO log (nome_interessato, autore, data_evento, codice_evento ,descrizione_evento) VALUES ('".gdrcd_capital_letter(gdrcd_filter('in',$pg))."', '".$_SESSION['login']."', NOW(), ".PX.", '(".gdrcd_filter('num',$exp).' px) '.$caus."')"; mysql_query($query);
print '<div class="warning">'.gdrcd_filter('out',$MESSAGE['warning']['done']).'</div>';
/*Avviso l'utente*/
if ($_SESSION['login']!=$item['pg']){
$query="INSERT INTO messaggi (mittente, destinatario, spedito, testo, oggetto) VALUES ('".$_SESSION['login']."', '".$pg."', NOW(), 'Ti sono stati assegnati ".gdrcd_filter('num',$exp).' px con la seguente motivazione: '.$caus."', '".gdrcd_filter('in',$MESSAGE['interface']['skills']['oggetto'])."')";
mysql_query($query);
}
}
else{
echo '<div class="warning">L' utente "'.gdrcd_filter('out',$item['pg']).'" non esiste!</div>';
}
}
}
}
?>
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Sea of Conquest ↗
Neverness to Everness ↗
Crossout ↗
Wuthering Waves ↗
Cafuné ↗
Exclusive Villa GdR ↗
Tiles Survive ↗
The Coven ↗