Refreh onclick non funzionante
Refreh onclick non funzionante postato il 25/08/2018 20:14:18 nel forum programmazione, open source e hosting
Sera a tutti!
Stavo lavorando oggi su una modifica sostanziale al sistema di spesa punti esperienza di gdrcd per l'acquisto delle abilità,nel concreto cancellando quasi tutto il form pre-esistente per riscriverlo con un form ad input in php che si compone di un piccolo input type submit che una volta cliccato esegue una query mysqli aggiornando il database ed aggiungendo un punto alla abilità interessata.Tutto questo a patto che il check svolto da una if condition confermi che ci sono abbastanza punti esperienza per livellare la skill
FIn qui tutto bene:il form funziona e fila liscissimo, il problema sorge però dopo aver cliccato:infatti fino a che non si clicca una seconda volta sul submit la schermata, almeno in lato client, non si aggiorna il che è un problema, visto che in questa maniera si ha a disposizione un click extra che elude il check svolto dalla if e di cui i furbetti potrebbero approfittare.
Ho già provato ad agire usando una funzione javascript onclick sul submit(in particolare location.refresh(true),location.refresh(false), window.location.refresh(true) e location.refresh(false))ma non ha risolto il problema, visto che di fatto la pagina sembra ricaricare, ma solo in alcune sue parti(elenco presenti, messaggi etc etc) che ovviamente non includono il centro della pagina.
Qualcuno ha qualche consiglio?
Allego qui di seguito la parte interessata del codice,se mai potesse essere utile.Non me ne vogliate se è un tantinello spaghettoso u.u
for($ida=1; $ida<= 30; $ida++){
$skill_name=gdrcd_query("SELECT * FROM abilita WHERE id_abilita='$ida'");
$result=gdrcd_query("SELECT grado FROM clgpersonaggioabilita WHERE id_abilita='$ida' AND nome='".gdrcd_filter('in',$_REQUEST['pg'])."'");
if($result == 0){
$xp_necessaria=3;
}
else{
$xp_necessaria=$result['grado'] + 1;
}
?>
<form name="form" method="post">
<span ><?php
echo $skill_name['nome'], ' ' , $result['grado'] , ' (' , $skill_name['car'] , ') ' ;
?></span>
<input type="hidden" name="id_skill" id="id_skill" value="$result['grado']">
<?php if($xp_disponibile >= $xp_necessaria){ ?> <input type="submit" onclick="rEload()" name="aumenta<?php echo $ida; ?>" value="+" /><?php }?>
</form>
<?php
$skill=$_POST['id_skill'];
if(isset($_POST["aumenta$ida"])){
if($result == 0){
gdrcd_query("INSERT INTO clgpersonaggioabilita (nome, id_abilita, grado) VALUES ('".gdrcd_filter('in',$_REQUEST['pg'])."', '$ida', 1)");
gdrcd_query("UPDATE personaggio SET esperienza_spesa = esperienza_spesa +3 WHERE nome ='".gdrcd_filter('in',$_REQUEST['pg'])."'");
}
else{
gdrcd_query("UPDATE clgpersonaggioabilita SET grado = grado + 1 WHERE nome ='".gdrcd_filter('in',$_REQUEST['pg'])."' AND id_abilita = '$ida'");
gdrcd_query("UPDATE personaggio SET esperienza_spesa = esperienza_spesa + '$xp_necessaria' WHERE nome ='".gdrcd_filter('in',$_REQUEST['pg'])."'");
}
}//if isset
echo '<br>';
}
?>
<script>
function rEload() {
location.reload(true);
}
</script>
Pagine → 1
25/08/2018 20:21:27
Discussione spostata in "GDRCD e Open Source"
25/08/2018 20:44:44
Ma se invece fai un location.href o location.reload?
25/08/2018 20:52:14 e modificato da cybershadow il 25/08/2018 20:55:34
darkblade ha scritto: Ma se invece fai un location.href o location.reload?
Si,scusami, non sono pratico di javascript, con location.refresh intendevo reload.
location.href non lo conoscevo, invece, adesso provo e ti faccio sapere :D
Edit:location.href non mi è proprio utile, visto che semplicemente serve a stampare l'url della pagina che si sta visitando
25/08/2018 23:45:55
location.href = '/nuova-pagina.html';
Questo fa un redirect alla pagina che metti tu.
26/08/2018 02:25:49 e modificato da cybershadow il 26/08/2018 02:32:33
darkblade ha scritto: location.href = '/nuova-pagina.html';
Questo fa un redirect alla pagina che metti tu.
allora, sembrava apparentemente non funzionare, poi ho pensato che il problema era nel fatto che non mettessi il tag <script> nell'head del documento, ho provveduto e funziona.
ALmeno in parte, perché la pagina tutta ora presena il refresh, ma la skill interessata resta al grado attuale, lasciando di fatto il bug irrisolto :/
26/08/2018 06:54:55
Ora ti basta farti una select ad inizio pagina che si calcola il valore aggiornato, così quando farai il reload della pagina dovrebbe ritrovarsi il valore nuovo e non quello vecchio.
26/08/2018 10:12:33 e modificato da cybershadow il 26/08/2018 11:13:32
darkblade ha scritto: Ora ti basta farti una select ad inizio pagina che si calcola il valore aggiornato, così quando farai il reload della pagina dovrebbe ritrovarsi il valore nuovo e non quello vecchio.
Ci ho provato, ma come immaginavo non ha funzionato, visto che la query select che mi va a prendere il grado della skill è inserita dentro un for loop che itera id_abilita tante volte quante sono le skill in database, dandogli il valore di $i all'interno del loop.Chiaramente estraendo dal loop la query il tutto non funziona.
A questo punto stavo pensando di studiarmi un po' lAJAX e riscrivere tutto con quello, ma avrei due domande.
Innanzitutto, risolverebbero il mio problema o probabilmente me lo ripresenterebbero?
E secondariamente, visto che immagino che come javascript in generale AJAX lavori almeno per parte in lato client, quanto sarebbe pericolosa a livello di sicurezza una soluzione simile?
EDIT:Ho anche provato a mettere il codice della query in una variabile e poi ad eseguire la query richiamando la variabile, ma il risultato è che il loop non funziona uguale
26/08/2018 18:17:41
Il tuo problema non è un bug del sistema o del browser, è proprio un errore nella logica di quello che hai scritto. Quindi usare dei trucchi come "location.reload" per aggirarlo non risolverà il problema.
L'errore principale è molto semplice: il codice che aggiorna il grado della skill è posizionato in fondo alla pagina.
Dato che sia la query SELECT sia la stampa del form avvengono *prima* della query di UPDATE è ovvio che al primo submit i dati mostrati dalla pagina siano errati, dato che vengono stampati prima di venire aggiornati. Il problema non è che la pagina non si aggiorna (anzi la pagina di aggiorna perfettamente) è che gli stai facendo stampare delle informazioni vecchie.
Sposta la query di update fuori dal for principale e all'inizio della pagina e vedrai che le informazioni stampate saranno giuste.
Aggiungo una cosa: il tuo if che controlla se il giocatore ha abbastanza exp da spendere puoi farlo al momento della stampa (come stai facendo), ma *DEVI* anche rifarlo prima della query di UPDATE: altrimenti un giocatore che vuole fregarti potrebbe sempre fare F5 e aggiungersi tutti i gradi che vuole.
26/08/2018 18:50:36
leoblacksoul ha scritto: L'errore principale è molto semplice: il codice che aggiorna il grado della skill è posizionato in fondo alla pagina.
Dato che sia la query SELECT sia la stampa del form avvengono *prima* della query di UPDATE è ovvio che al primo submit i dati mostrati dalla pagina siano errati, dato che vengono stampati prima di venire aggiornati. Il problema non è che la pagina non si aggiorna (anzi la pagina di aggiorna perfettamente) è che gli stai facendo stampare delle informazioni vecchie.
Sposta la query di update fuori dal for principale e all'inizio della pagina e vedrai che le informazioni stampate saranno giuste.
Ah, ecco, questo mi spiega un po' di cose.
A questo punto in sorgente posiziono la stampa sotto l'update e poi la riposiziono sopra nella visualizzazione grafica con il css.
Grazie, mi sei stato davvero di aiuto :D
leoblacksoul ha scritto: Aggiungo una cosa: il tuo if che controlla se il giocatore ha abbastanza exp da spendere puoi farlo al momento della stampa (come stai facendo), ma *DEVI* anche rifarlo prima della query di UPDATE: altrimenti un giocatore che vuole fregarti potrebbe sempre fare F5 e aggiungersi tutti i gradi che vuole.
Eh, di questo mi ero accorto, e infatti ho provveduto a correggerlo.
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Enlisted ↗
The Coven ↗
World of the Sea Battle ↗
World of Tanks ↗
Wuthering Waves ↗
Tibia ↗
Seconda Era ↗