Problema con presenti.php
Problema con presenti.php postato il 06/12/2007 16:30:13 nel forum programmazione, open source e hosting e modificato da dyrr il 06/12/2007 16:36:06
Dopo aver ricevuto delle sporadiche segnalazioni dai miei utenti riguardanti il fatto di non apparire nella lista presenti nonostante fossero connessi ho cercato di risalire al problema.
Ho provato a controllare nella tabella presenti un utente che aveva questo problema e risultava
Stanza 0
StanzaApparente 0
UrlimoRefresh (risalente ad alcuni minuti prima)
OraUscita uguale a quella dell'ultimo refresh
come quando il cambiastanza.php fa il logout automatico dei pg inattivi per un tot tempo.
Considerato che l'aggiornamento di UltimoRefresh nella land avviene nella pagina presenti.php con questa istruzione
$MySql = "UPDATE Presenti SET UltimoRefresh = NOW(), OraUscita = '2037-12-31 00:00:00' WHERE Nome = '".pars($Login)."'";
$Result = mysql_query($MySql);
è come se ad un certo punto la pagina che si refresha ciclicamente avesse semsso di fare questo aggiornamento.
Per fare una prova visto che il pg era in una chat ho inserito nel refresh.php la seguenti righe eppando al volo la pagina:
$MySql = "UPDATE Presenti SET UltimoRefresh = NOW(), OraUscita = '2037-12-31 00:00:00', Stanza = '".addslashes($Stanza)."', StanzaApparente = '".addslashes($Stanza)."' WHERE Nome = '".pars($Login)."'";
$Result = mysql_query($MySql);
e al primo refresh automatico del refresh.php il pg è tornato visibile nella lista presenti correttamente nella corretta locazione.
Vorrei sapere se è possibile che arrivato ad un certo numero di refresh il presenti.php smetta per qualche motivo fare l'aggiornamento periodico della pagina, o se questo refresh possa saltare per qualche motivo
P.S.: Premetto che uso un GDRCD come OS
Pagine → 1
21/10/2015 00:26:45
1) Rispolvero questo topic, avendo un problema simile :( (sto usando la GDRCD 5.2.1 di Breaker)! I presenti nel beta test, dopo una decina di minuti di inattività, non risultano più loggati, a meno che non facciano un refresh (il refresh automatico sembra non sia servito). Ho letto che è un problema comune di GDRCD (bug?) e ho provato a eliminare l'inattività > 3, ma non funziona uguale!
Il codice di presenti_estesi è questo qua:
<!-- Box presenti-->
<?/*
Imposto un refresh della pagina corrente dopo 10 SEC
*/
$curpage = $_SERVER['PHP_SELF'];
header('Refresh: 10; url=' . $curpage);
?>
<div class="pagina_presenti_estesa">
<div class="page_title">
<h2><?php echo gdrcd_filter('out',$MESSAGE['interface']['logged_users']['page_title']); ?></h2>
</div>
<div class="presenti_estesi">
<?php
if (isset($_REQUEST['disponibile'])===TRUE){
$query = "UPDATE personaggio SET ultimo_refresh = NOW(), disponibile=".gdrcd_filter('num',$_REQUEST['disponibile'])." WHERE nome = '".gdrcd_filter('in',$_SESSION['login'])."'";
} elseif (isset($_REQUEST['invisibile'])&&($_SESSION['permessi']>=GAMEMASTER)){
$query = "UPDATE personaggio SET ultimo_refresh = NOW(), is_invisible=".gdrcd_filter('num',$_REQUEST['invisibile'])." WHERE nome = '".gdrcd_filter('in',$_SESSION['login'])."'";
} else {
$query = "UPDATE personaggio SET ultimo_refresh = NOW() WHERE nome = '".gdrcd_filter('in',$_SESSION['login'])."'";
}
gdrcd_query($query);
echo '<div class="elenco_presenti">';
/** * Abilitazione tooltip
* @author Blancks
*/
if ($PARAMETERS['mode']['user_online_state'] == 'ON')
echo '<div id="descriptionLoc"></div>';
//Carico la lista presenti.
/** * Fix della query per includere l'uso dell'orario di uscita per capire istantaneamente quando il pg non è più connesso
* @author Blancks
*/
$query = "SELECT personaggio.nome, personaggio.cognome, personaggio.permessi, personaggio.sesso, personaggio.id_razza, razza.sing_m, razza.sing_f, razza.icon, personaggio.disponibile, personaggio.online_status, personaggio.is_invisible, personaggio.ultima_mappa, personaggio.ultimo_luogo, personaggio.posizione, personaggio.ora_entrata, personaggio.ora_uscita, personaggio.ultimo_refresh, mappa.stanza_apparente, mappa.nome as luogo, mappa_click.nome as mappa FROM personaggio LEFT JOIN mappa ON personaggio.ultimo_luogo = mappa.id LEFT JOIN mappa_click ON personaggio.ultima_mappa = mappa_click.id_click LEFT JOIN razza ON personaggio.id_razza = razza.id_razza WHERE personaggio.ora_entrata > personaggio.ora_uscita AND DATE_ADD(personaggio.ultimo_refresh, INTERVAL 4 MINUTE) > NOW() ORDER BY personaggio.is_invisible, personaggio.ultima_mappa, personaggio.ultimo_luogo, personaggio.nome";
$result = gdrcd_query($query, 'result');
echo '<ul class="elenco_presenti">';
$ultimo_luogo_corrente='';
$mappa_corrente='';
while ($record = gdrcd_query($result, 'fetch'))
{
//Stampo il nome del luogo
if($record['is_invisible']==1)
{
$luogo_corrente = $MESSAGE['status_pg']['invisible'][1];
} else
{
if ($record['mappa']!=$mappa_corrente)
{
$mappa_corrente = $record['mappa'];
echo '<li class="mappa">'.gdrcd_filter('out',$mappa_corrente).'</li>';
}//if
if (empty($record['stanza_apparente']))
{
$luogo_corrente = $record['luogo'];
} else
{
$luogo_corrente = $record['stanza_apparente'];
}//else
}
//Stampo il nome del luogo solo per il primo PG che vi e' posizionato
if (empty($luogo_corrente)===TRUE){
#echo 'ok';
/*if ($record['mappa']>=0){
$luogo_corrente = $PARAMETERS['names']['maps_location'];
} else {
$luogo_corrente = $PARAMETERS['names']['base_location'];
}//else*/
if ($ultimo_luogo_corrente!=$luogo_corrente){
$ultimo_luogo_corrente=$luogo_corrente;
echo '<li class="luogo">'.gdrcd_filter('out',$luogo_corrente).'</li>';
} //if
} else if ($ultimo_luogo_corrente!=$luogo_corrente){
$ultimo_luogo_corrente=$luogo_corrente;
if ($record['is_invisible']==0){
if(($PARAMETERS['mode']['mapwise_links']=='OFF')){ #||($record['ultima_mappa']==$_SESSION['mappa'])
echo '<li class="luogo"><a href="main.php?dir='.$record['ultimo_luogo'].'&map_id='.$record['ultima_mappa'].'">'.gdrcd_filter('out',$luogo_corrente).'</a></li>';
} else {
echo '<li class="luogo">'.gdrcd_filter('out',$luogo_corrente).'</li>';
}
} else {
echo '<li class="luogo">'.gdrcd_filter('out',$luogo_corrente).'</li>';
}//else
}//if
/** * Parametro di personalizzazione di uno stato online via tooltip
* @author Blancks
*/
$online_state = '';
if ($PARAMETERS['mode']['user_online_state']=='ON' && !empty($record['online_status']) && $record['online_status'] != NULL)
{
$record['online_status'] = trim(nl2br(gdrcd_filter('in',$record['online_status'])));
$record['online_status'] = strtr($record['online_status'], array("
" => '', "
" => '', "
" => '', '"' => '"'));
$online_state = 'onmouseover="show_desc(event, ''.$record['online_status'].'');" onmouseout="hide_desc();""';
}
//Stampo il PG
echo '<li class="presente"'. $online_state .'>';
//Entrata, uscita PG
//Controllo da quanto il pg e' loggato
$activity = gdrcd_check_time ($record['ora_entrata']);
//Se e' loggato da meno di 2 minuti
if ($activity <= 2){
//Lo segnalo come appena entrato
echo '<img class="presenti_ico" src="imgs/icons/enter.gif" alt="'.gdrcd_filter('out',$MESSAGE['status_pg']['enter']).'" title="'.gdrcd_filter('out',$MESSAGE['status_pg']['enter']).'" />';
} else {
//Altrimenti e' semplicemente loggato
echo '<img class="presenti_ico" src="imgs/icons/blank.png" alt="'.gdrcd_filter('out',$MESSAGE['status_pg']['logged']).'" title="'.gdrcd_filter('out',$MESSAGE['status_pg']['logged']).'" />';
}//else
switch ($record['permessi']){
case USER: $alt_permessi = ''; break;
case GUILDMODERATOR: $alt_permessi = $PARAMETERS['names']['guild_name']['lead']; break;
case GAMEMASTER: $alt_permessi = $PARAMETERS['names']['master']['sing']; break;
case MODERATOR: $alt_permessi = $PARAMETERS['names']['moderators']['sing']; break;
case SUPERUSER: $alt_permessi = $PARAMETERS['names']['administrator']['sing']; break;
}//else
//Livello di accesso del PG (utente, master, admin, superuser)
echo '<img class="presenti_ico" src="imgs/icons/permessi'.$record['permessi'].'.gif" alt="'.gdrcd_filter('out',$alt_permessi).'" title="'.gdrcd_filter('out',$alt_permessi).'" />';
//Icona stato di disponibilità. E' sensibile se la riga che sto stampando corrisponde all'utente loggato.
$change_disp=($record['disponibile']+1)%3;
echo '<img class="presenti_ico" src="imgs/icons/disponibile'.$record['disponibile'].'.png" alt="'.gdrcd_filter('out',$MESSAGE['status_pg']['availability'][$record['disponibile']]).'" title="'.gdrcd_filter('out',$MESSAGE['status_pg']['availability'][$record['disponibile']]).'" />';
//Icona della razza pg
if($record['icon']==''){$record['icon']='standard_razza.png';}
echo '<img class="presenti_ico" src="themes/'.$PARAMETERS['themes']['current_theme'].'/imgs/races/'.$record['icon'].'" alt="'.gdrcd_filter('out',$record['sing_'.$record['sesso']]).'" title="'.gdrcd_filter('out',$record['sing_'.$record['sesso']]).'" />';
//Icona del genere del pg
echo '<img class="presenti_ico" src="imgs/icons/testamini'.$record['sesso'].'.png" alt="'.gdrcd_filter('out',$MESSAGE['status_pg']['gender'][$record['sesso']]).'" title="'.gdrcd_filter('out',$MESSAGE['status_pg']['gender'][$record['sesso']]).'" />';
//Nome pg e link alla sua scheda
echo ' <a href="main.php?page=scheda&pg='.$record['nome'].'" class="link_sheet">'.gdrcd_filter('out',$record['nome']);
if (empty($record['cognome'])===FALSE){echo ' '.gdrcd_filter('out',$record['cognome']);}
echo '</a> ';
echo '</li>';
}//while
gdrcd_query($result, 'free');
echo '</ul>';
?>
<?
// Conteggio i presenti.
$record = gdrcd_query("SELECT COUNT(*) AS numero FROM personaggio WHERE (personaggio.ora_entrata > personaggio.ora_uscita AND DATE_ADD(personaggio.ultimo_refresh, INTERVAL 4 MINUTE) > NOW())");
//numero utenti presenti.
echo '<div class="link_presenti"><a href="../main.php?page=presenti_estesi" target="_top">';
if ($record['numero']==1){
echo '<div class="page_title"><h2>'.$record['numero'].' '.gdrcd_filter('out',$PARAMETERS['names']['users_name']['sing']).' '.gdrcd_filter('out',$MESSAGE['interface']['logged_users']['sing']).'</h2></div>';
} else {
echo '<div class="page_title"><h2 class="presenti_title">'.$record['numero'].' '.gdrcd_filter('out',$PARAMETERS['names']['users_name']['plur']).' '.gdrcd_filter('out',$MESSAGE['interface']['logged_users']['plur']).'</h2></div>';
}
echo '</a></div>';
?>
</div>
</div>
<!-- Chiusura finestra del gioco -->
2) Ne approfitto per chiedere aiuto su di un'altra questione: ho fatto sì che il tasto dei messaggi privati non fosse più nel suo frame, ma nel menu e, settando come invisibile il frame e modificando il link_menu, riesco ad avere suono, immagine cambiata e testo blink in java come titolo della pagina ad ogni nuovo mp. L'unica nota stonata viene ad essere l'immagine, che non si aggiorna in tempo reale (a differenza del suono e del titolo) al ricevimento di un nuovo messaggio, ma solo con un refresh da parte dell'utente. Idee?
Il codice del link menù è questo:
<div class="pagina_link_menu">
<?php
if ($PARAMETERS['mode']['gotomap_list'] == 'ON')
{
$gotomap_list = array();
$result = gdrcd_query(" SELECT mappa_click.id_click, mappa_click.nome,
mappa.id, mappa.nome AS nome_chat, mappa.chat, mappa.pagina, mappa.id_mappa_collegata
FROM mappa_click
LEFT JOIN mappa ON mappa.id_mappa = mappa_click.id_click", 'result');
if (gdrcd_query($result, 'num_rows') > 0)
{
while ($row = gdrcd_query($result, 'fetch'))
$gotomap_list[$row['nome']. '|@|' . $row['id_click']][$row['id']] = array( 'nome' => $row['nome_chat'],
'chat' => $row['chat'],
'pagina' => $row['pagina'],
'mappa_collegata' => $row['id_mappa_collegata']);
gdrcd_query($result, 'free');
?>
<select id="gotomap" onchange="self.location.href=this.value;">
<?php foreach ($gotomap_list as $infoMap => $infoLocation)
{
$splitInfoMap = explode('|@|', $infoMap);
?> <option value="main.php?page=mappaclick&map_id=<?php echo $splitInfoMap[1]; ?>"<?php echo ($_SESSION['mappa']==$splitInfoMap[1]&&$_SESSION['luogo']==-1)? ' selected="selected"' : ''; ?> class="map"><?php echo $splitInfoMap[0]; ?></option>
<?php
if (is_array($infoLocation))
{
foreach ($infoLocation as $idLoc => $infoLoc)
{
if (!empty($infoLoc['nome']))
{
if ($infoLoc['chat'] != 0)
{
$valueLoc = 'dir=' . $idLoc . '&map_id=' . $splitInfoMap[1];
}else
{
if ($infoLoc['mappa_collegata'] != 0)
{
$valueLoc = 'page=mappaclick&map_id=' . $infoLoc['mappa_collegata'];
}else
{
$valueLoc = 'page='.$infoLoc['pagina'];
}
}
?>
<option value="main.php?<?php echo $valueLoc; ?>"<?php echo ($_SESSION['luogo']==$idLoc&&$_SESSION['luogo']!=-1)? ' selected="selected"' : ''; ?>>» <?php echo $infoLoc['nome']; ?></option>
<?php
$valueLoc = '';
}
}
}
}
?>
</select>
<?php
unset($gotomap_list);
}
}
?>
<div class="page_title">
<h2><?php echo gdrcd_filter('out',$PARAMETERS['names']['gamemenu']); ?></h2>
</div>
<div class="page_body">
<?php
/* Generazione automatica del menu del gioco */
/* modifica IA */
/* reperisce quante mail non lette ha l'utente e l'ID massimo ( ultimo messaggio non letto ) delle mail non lette */
$non_letti=gdrcd_query("SELECT id FROM messaggi WHERE destinatario = '".gdrcd_filter('in',$_SESSION['login'])."' AND letto=0", 'result');
$N_non_letti=gdrcd_query($non_letti, 'num_rows');
/* Capisce se è arrivato un nuovo messaggio e se bisogna attivare il suono */
if ($_SESSION['ultimomex']<$N_non_letti ){
$suona = 1;
}
else { $suona = 0;}
$_SESSION['ultimomex']=$N_non_letti;
/* fine modifica */
foreach($PARAMETERS['menu'] as $link_menu){
if (empty($link_menu['url'])===FALSE){
if (empty($link_menu['image_file'])===TRUE){
if (empty($link_menu['text'])===FALSE){
echo '<div class="link_menu"><a href="'.$link_menu['url'].'">'.gdrcd_filter('out',$link_menu['text']).'</a></div>';
}
} else {
/* Modifica IA - Permette nel menu di avere un tasto che si illumina quando ci sono messaggi non letti*/
if (empty($link_menu['image_file_onclick'])===TRUE){
$img_up=$link_menu['image_file'];
$img_down=$link_menu['image_file'];
} else {
$img_up=$link_menu['image_file'];
$img_down=$link_menu['image_file_onclick'];
}
if (empty($link_menu['image_file_onclick'])===TRUE){
$img_up=$link_menu['image_file'];
$img_down=$link_menu['image_file'];
} else {
if((gdrcd_query($non_letti, 'num_rows')<>0) && (empty($link_menu['image_file_new'])===FALSE)){
$img_up=$link_menu['image_file_new'];
$img_down=$link_menu['image_file_new'];
}
else{
$img_up=$link_menu['image_file'];
$img_down=$link_menu['image_file_onclick'];
}
}
/* fine modifica IA */
echo '<SCRIPT LANGUAGE="JavaScript"> if (document.images) { var n'.$raw_counter.'_button1_up = new Image(); n'.$raw_counter.'_button1_up.src = "themes/'. $PARAMETERS['themes']['current_theme'].'/imgs/menu/'.$img_up.'"; var n'.$raw_counter.'_button1_over = new Image(); n'.$raw_counter.'_button1_over.src = "themes/'. $PARAMETERS['themes']['current_theme'].'/imgs/menu/'.$img_down.'";} function n'.$raw_counter.'_over_button() { if (document.images) { document["n'.$raw_counter.'_buttonOne"].src = n'.$raw_counter.'_button1_over.src;}} function n'.$raw_counter.'_up_button() { if (document.images) { document["n'.$raw_counter.'_buttonOne"].src = n'.$raw_counter.'_button1_up.src}}</SCRIPT>';
/* Modifica IA permette di avere appena caricata il menu il pulsante corretto se è c'è un nuovo messaggio */
/* echo '<div class="link_menu"><a href="'.$link_menu['url'].'" onMouseOver="n'.$raw_counter.'_over_button()" onMouseOut="n'.$raw_counter.'_up_button()"><img src= "themes/'. $PARAMETERS['themes']['current_theme'].'/imgs/menu/'.$link_menu['image_file'].'" alt="'.gdrcd_filter('out',$link_menu['text']).'" title="'.gdrcd_filter('out',$link_menu['text']).'" name="n'.$raw_counter.'_buttonOne" /></a></div>';*/
if((gdrcd_query($non_letti, 'num_rows')<>0) && (empty($link_menu['image_file_new'])===FALSE)){
echo '<div class="link_menu"><a href="'.$link_menu['url'].'" onMouseOver="n'.$raw_counter.'_over_button()" onMouseOut="n'.$raw_counter.'_up_button()"><img src= "themes/'. $PARAMETERS['themes']['current_theme'].'/imgs/menu/'.$link_menu['image_file_new'].'" alt="'.gdrcd_filter('out',$link_menu['text']).'" title="'.gdrcd_filter('out',$link_menu['text']).'" name="n'.$raw_counter.'_buttonOne" /></a></div>';
/* se è arrivato un nuovo messaggio suona */
if ( $suona == 1) {
echo '<embed src="/sounds/'.$PARAMETERS['settings']['audio_new_messagges'].'" autostart="true" hidden="true" hidden="true" style="width:0px; height:0px;" />';
}
}
else{
echo '<div class="link_menu"><a href="'.$link_menu['url'].'" onMouseOver="n'.$raw_counter.'_over_button()" onMouseOut="n'.$raw_counter.'_up_button()"><img src= "themes/'. $PARAMETERS['themes']['current_theme'].'/imgs/menu/'.$link_menu['image_file'].'" alt="'.gdrcd_filter('out',$link_menu['text']).'" title="'.gdrcd_filter('out',$link_menu['text']).'" name="n'.$raw_counter.'_buttonOne" /></a></div>';
}
/* fine modifiche IA */
}
}
$raw_counter++;
}
?>
</div>
<?php /*HELP: Il menu viene generato automaticamente attingendo dalle informazioni contenute in config.inc.php. La versione supporta link testuali ed immagini e può essere modificata direttamente nel file config.ing.php, impostando url di destinazione, testo e selezionado le immagini. Se il link è un'immagine il testo viene interpretato automaticamente come testo alternativo all'immagine. Per realizzare un menu di altro tipo suggeriamo di commentare o cancellare il contenuto di questa pagina e sostituirlo con il codice del nuovo menu. */ ?>
</div>
Grazie, di cuore <3
22/10/2015 12:02:04
per il primo punto del refresh io ho messo nel frame del layout che uso in testa a tutto:
<? php
$refresh = "UPDATE personaggio set ultimo_refresh= now() WHERE nome = '".gdrcd_filter('in',$_SESSION['login'])."'";
gdrcd_query($refresh);
?>
per ora non sembra darmi problemi.
22/10/2015 16:21:04
Guarda, ti ringrazio della risposta, ma non so come, non cambiando assolutamente nulla della pagina dei presenti rispetto a quanto da me postato, il problema sembrerebbe essersi risolto da solo D: (uso sempre un condizionale, che il mio php è sempre assai lunatico)!
Il mio problema rimane il refresh automatico dell'icona dei messaggi...ho provato vari stratagemmi, ma non me ne funziona uno!
22/10/2015 17:34:41
mi accodo (salutando sia gipsy che Dyrr)
pensando a come la chat si aggiorni ogni volta che viene messo un messaggio, ho immaginato che si potesse fare la stessa cosa col menu... quindi racchiudere il menu in un iframe autorefreshante, forse...
il problema è nella realizzazione: ho provato a fare un iframe direttamente in "layouts/top_frames.php" (è quello che utilizzo io) cambiando nome da "<div class=innertube>" a "<iframe class=innertube>", e relativo codice in main.css.
esce l'errore. so di esserci vicino, ma non succede NULLA.
metropbc ha scritto: per il primo punto del refresh io ho messo nel frame del layout che uso in testa a tutto:
<? php
$refresh = "UPDATE personaggio set ultimo_refresh= now() WHERE nome = '".gdrcd_filter('in',$_SESSION['login'])."'";
gdrcd_query($refresh);
?>
per ora non sembra darmi problemi.
domanda... in QUALI pagine hai messo quella stringa, Dyrr?
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Hero Wars ↗
World of Tanks ↗
Exclusive Villa GdR ↗