Refresh della pagina controllato dal Server – Evento lato Server
- Marzo 02, 2010
- by
- Donatantonio
In questo breve articolo vedremo come risolvere una situazione tipica di refresh di una pagina html/php.
Immaginiamo di voler effettuare il refresh di un’intera pagina html al verificarsi di un evento lato server, ad esempio al cambiamento di una variabile di sessione o al cambiamento di stato di un database.
In altre parole vorremmo ricaricare la pagina che visiona l’utente quando decide uno script lato Server e non un javascript lato client.
Realizzeremo essenzialmente due script:
- La pagina html/php da inviare al browser
- Lo script lato Server che controlla il refresh
Per implementare il meccanismo di refresh utilizzeremo PHP, Javascript e logicamente Ajax per gestire il processo di controllo in background.
Vediamo il codice php dello script di controllo:
<?php // la variabile che utilizzeremo per verificare l'esito del controllo // 0 se non è necessario il refresh // 1 se è da effettuare il refresh $esito = 0; // effettuo alcuni controlli come ad esempio una query // una modifica a variabili di sessione o altro - dipende da voi // nel mio esempio controllo il numero di record in una tabella... $db_host = "localhost"; $db_user = "user"; $db_password = "pass"; $db_database = "my_database"; $connessione=mysql_connect($db_host,$db_user,$db_password); mysql_select_db($db_database,$connessione); $query = "SELECT COUNT(*) AS conto FROM tabella"; $result = mysql_query($query) or die (mysql_error()); $array = mysql_fetch_array($result); if($array['conto']>1){ $esito = 1; }else{ $esito = 0; } echo $esito; ?>
Vediamo ora la pagina html/php che verrà inviata al Client:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name="author" content="Fabio Donatantonio" /> <title>Pagina ricaricata dal server</title> <script type='text/javascript'> var conto = null; /* Funzione che richiama il controllo ogni 10 secondi */ function countdown(){ Data(); conto = setTimeout("countdown()",10000); } /* Funzione che inizializza il motore Ajax */ var myRequest = null; function CreateXmlHttpReq2(handler) { var xmlhttp = null; try { xmlhttp = new XMLHttpRequest(); }catch(e){ try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } } xmlhttp.onreadystatechange = handler; return xmlhttp; } /* Funzione che verifica il responso della procedura di controllo se restituisce 1 allora effettua il refresh */ function myHandler() { if (myRequest.readyState == 4 && myRequest.status == 200) { if(myRequest.responseText=='1'){ var r = Math.random(); location.href = "index.php?rand="+escape(r)+""; } } } /* Funzione che invia la richiesta http alla funzione di controllo lato Server */ function Data(){ var r = Math.random(); myRequest = CreateXmlHttpReq2(myHandler); myRequest.open("GET","controllo.php?rand="+escape(r)); myRequest.send(null); } </script> </head> <body> <div align="center"> <fieldset class="corpo"> <legend>Refresh gestito dal Server</legend> <div class='corpo'> La pagina è stata aggiornata dal Server in data <?php date('d-m-Y')." alle ore ".date('G:i:s');?> ! </div> <script type="text/javascript"> countdown(); </script> </fieldset> </div> </body> </html>
In questo esempio lo script javascript richiama la procedura di controllo in background ogni 10 secondi utilizzando Ajax. La procedura (controllo.php) restituisce 1 se è richiesto il refresh della pagina, 0 altrimenti.
Logicamente il file controllo.php va personalizzato alle proprie esigenze, così come può essere modificato l’intervallo tra un controllo e l’altro lato Server.
Questo esempio può essere ad esempio utile ad aggiornare una chat PHP qualora venga inserito un nuovo messaggio in database, evitando quindi che l’aggiornamento sia dipendente esclusivamente da un timer che non tiene conto dell’effettivo cambiamento di stato del database.