Autore Topic: Monitorare il visitatore ...e come non memorizzarlo!  (Letto 5816 volte)

Topografo

  • Utente esperto
  • ***
  • Post: 265
Monitorare il visitatore ...e come non memorizzarlo!
« il: 02 Giugno, 2013, 18:04:52 »
In attesa di implementare un mio contatore che sostituisca Shinystat (che a pagamento fa di tutto  ;D ) vediamo le variabili che vengono passate dal visitatore al sito web, queste sono richiamate con la variabile $_SERVER[...] (anche se per me sarebbe più logico definirla una funzione più che una variabile)
Citazione
$_SERVER -- $HTTP_SERVER_VARS [deprecated] — Server and execution environment information


La prima è più importante è:

Citazione
$_SERVER['REMOTE_ADDR']


Questa legge il codice IP in formato XXX.XXX.XXX.XXX
Ancora devo scoprire come geolocalizzare l'indirizzo, ma in teoria con questo posso sapere il paese di provenienza. Se non avete l'IP fisso ogni volta che spegnete il modem/router ADSL si resetta l'IP.


Veniamo al Browser:
Citazione
$_SERVER['HTTP_USER_AGENT']
Questo fornisce varie informazioni sul browser, forse troppe... nel mio caso Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0


Questa apparentemente è la lingua del browser con la quale vi collegate
Citazione
$_SERVER['HTTP_ACCEPT_LANGUAGE']
In realtà credo siano i linguaggi che il browser accetta ... il mio restituisce it,en-us;q=0.7,en;q=0.3
Se il primo termine fosse ru leggerei il cirillico come default... ma ci torniamo su questo risultato


Passiamo alle proprietà del server del sito che stiamo visitando
Citazione
$_SERVER['SERVER_NAME']
è una variabile che restituisce il dominio (nel mio caso), penso che sia inutile...

Altre variabili
Citazione
$_SERVER['HTTP_REFERER']

$_SERVER['QUERY_STRING']
Queste invece sono interessanti: mi danno l'indirizzo dal quale si proviene (es. un motore di ricerca) e la stringa di ricerca con la quale si è arrivati.
Utile per una referrer list.

Per mettere insieme tutto questo su una pagina si può scrivere in un oggetto widget:

Citazione
<p align=left>
Ciao, il tuo indirizzo ip è: <?php echo $_SERVER['REMOTE_ADDR'] ?><br>
Il tuo browser è: <?php echo $_SERVER['HTTP_USER_AGENT'] ?><br>
La lingua è: <?php echo $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?><br>
<!-- Il server su cui ti trovi è: <?php echo $_SERVER['SERVER_NAME'] ?><br> -->
Provieni da: <?php echo $_SERVER['HTTP_REFERER'] ?>
con ricerca <?php echo $_SERVER['QUERY_STRING'] ?>
</p>


Ho levato il sito in cui ci si trova con le classiche rem <!-- --> (a che vi serve?)
Naturalmente i parametri sono tantissimi, ne trovate parecchi su: http://php.net/manual/en/reserved.variables.server.php

Una variabile graziosa è
Citazione
'REQUEST_TIME'   The timestamp of the start of the request. Available since PHP 5.1.0. 


Come si usa? In realtà la variabile restituisce un valore che si incrementa di un unità a partire dalle ore 0:00:00 del 1/01/1970 UTC (Tempo Coordinato Universale, approssimativamente è l'ora passante per Greenwich) ne si parla su http://www.mario-online.com/timestamp.php dove si trova la formula:

Citazione
strftime ("%A, il %e di %B del %Y alle %R e %S sec.", $timestamp)


Per scoprire l'ora di provenienza del visitatore basta memorizzarsi in $timestamp la variabile $_SERVER['REQUEST_TIME'] (non vi serve a nulla avere un valore del tipo "1370186539" da scrivere in paginaweb) e il gioco è fatto

Citazione
<?php $timestamp=$_SERVER['REQUEST_TIME'] ?>
<?php echo strftime ("%A, il %e di %B del %Y alle %R e %S sec.", $timestamp) ?><br>


Se provate oggi (02/06/2013) la variabile vi restituirà l'ora esatta (se vi collegate dall'Italia Sunday, il  2 di June del 2013 alle 17:22 e 19 sec.) anche se la logica mi porta a dubitare di questo risultato... infatti siamo in ora legale e dovrebbe restituirmi un ora in meno...

Ok, graziosa e per il momento inutile  :D

Vi potete divertire a fare delle stringhe con tutti quei dati e visualizzarli
es:
Citazione
'REMOTE_HOST'<?php echo $_SERVER['REMOTE_HOST'] ?><br>
'REMOTE_USER'<?php echo $_SERVER['REMOTE_USER'] ?><br>
'REDIRECT_REMOTE_USER' <?php echo $_SERVER['REDIRECT_REMOTE_USER'] ?><br>

In una pagina interna del vostro sito, come esercizio di stile può essere interessante fornire tutti i dati di chi vi visita
Ne ho vista una (che da anche altri termini per la $_SERVER[...] è http://www.mario-online.com/mio_indirizzo_ip.php, ci trovate anche i cookie)

Ma veniamo alla memorizzazione, stavo per cercare su google come memorizzare in un file di testo tutte le variabili (anche se ho letto in forum su un post in cui si parlava di salvarlo come .php) quando curiosando tra i termini restituiti dalle stringhe (vi ricordate it,en-us;q=0.7,en;q=0.3?) ho messo quel termine tra le stringhe trovando questo sito http://www.ballilatini.it e in particolare questo file: xxxxxxxxxxxxxx.txt
Inutile dire che essendo dati sensibili ho dato un occhiata che non ci fossero password o nomi utenti prima di postarlo, ma è la conferma che non si può salvare in file di testo i dati che potete estrarre dai visitatori



Edit: come hai scritto tu sono dati sensibili. Per il momento per prudenza tolgo il link. Il file è lunghissimo e verificarlo per intero non è cosa di poco tempo.
« Ultima modifica: 02 Giugno, 2013, 19:14:48 da stesil »

Topografo

  • Utente esperto
  • ***
  • Post: 265
Re:Monitorare il visitatore ...e come visualizzarlo!
« Risposta #1 il: 03 Giugno, 2013, 06:29:21 »
E adesso parte il problema (lo so che è più Javascript che PHP, ma segue il discorso del contatore di prima e quindi ho dubbi dove mettere questo post)

Sarebbe bellissimo trovare la geolocalizzazione stile http://www.mio-ip.it/?p=geolocalizzazione
Si tratta solo di trovare le coordinate e inserirle in una pagina google maps richiamabile da iframe
Citazione
es: http://maps.google.com/maps?q=37.771008, -122.41175 (puoi inserire il tuo testo qui)&iwloc=A&hl=it

 

Ma come trovare le coordinate? Google aiuta chi sa cosa cercare... e quindi cerco un file php
Dopo aver visto le coordinate date da www.hostip.info e aver letto http://blog.casertano.name/2007/07/30/come-fare-per-individuare-la-localizzazione-geografica-di-un-ip/ ho scoperto di abitare nella comunità europea... un pò poco da un IP V4... :(

Sono passato a guardare http://www.geoplugin.com/webservices/php
C'è un meraviglioso codice (potete usare anche il PHP ma dovete includere il files geoplugin.class.php che scaricate da quella pagina) e poi richiamarlo cambiando l'inizio del file di esempio

Citazione
<?php require_once('files/geoplugin.class.php'); $geoplugin = new geoPlugin();
....
Lo so che era ovvio, ma meglio specificare...
Non volendo dire che è farina del mio sacco (è tutto lì, pronto da usare il codice e vi dice coordinate, regione, città e persino la valuta in corso) lascio il codice dov'è: funziona e lo potete copiare sul vostro sito.

Ma non mi servono le coordinate geografiche, volevo la cartina... volendo usare la googlemaps da un esempio trovato sullo stesso sito http://www.geoplugin.com/examples

Inserendo questo nelle proprietà della pagina prima del tag </head>
Citazione
 <script src="http://maps.google.com/maps?file=api&v=2&key=Your_Google_Maps_API_Key" type="text/javascript"></script>
 <script language="JavaScript" src="http://www.geoplugin.net/javascript.gp" type="text/javascript"></script>
   <script type="text/javascript">
 function load() {
 if (GBrowserIsCompatible()) {
 var map = new GMap2(document.getElementById("map"));
 map.addControl(new GLargeMapControl());
 map.addControl(new GMapTypeControl());
 map.setCenter(new GLatLng(geoplugin_latitude(), geoplugin_longitude()), 12);
 }
 }
 </script>

e questo in un oggetto widget
Citazione

   <div id="map" style="width: 500px; height: 300px"></div> <script>load();</script>

In teoria dovrei avere la mappa di casa mia...
E sul sito di geoplugin funziona... non sul mio!  :(

Infatti si ottiene:
Citazione
Google has disabled use of the Maps API for this application. 
The provided key is not a valid Google API Key, or it is not authorized for the Google Maps Javascript API v2 on this site.
If you are the owner of this application, you can learn about obtaining a valid key here:
http://code.google.com/apis/maps/documentation/javascript/v2/introduction.html#Obtaining_Key


Sigh! E per le API di googlemaps 2... siamo alle API 3... comunque se vi iscrivete alle googlemaps API dovrebbe funzionare
(su quel sito funziona, no? Ma non mi interessa nemmeno provarlo) :)
 http://code.google.com/apis/maps/signup.html (per iscriversi)

Cambiamo il codice per googlemaps API3, il sito html.it spiega le variabili usate.
Come base si usa: http://www.html.it/articoli/google-maps-v3-creare-una-mappa-con-i-marker/
Agg
iungendo lo script di geoplugin (riga 4) e le coordinate date da geoplugin (riga 10)
Citazione
<!-- codice per geolocalizzazione in googlemaps -->
 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
 <script language="JavaScript" src="http://www.geoplugin.net/javascript.gp" type="text/javascript"></script>

 
<script type="text/javascript">
var initialize = function() {
 
  // fornisce latitudine e longitudine
  var latlng = new google.maps.LatLng(geoplugin_latitude(), geoplugin_longitude());
 
  // imposta le opzioni di visualizzazione
  var options = { zoom: 12,
                  center: latlng,
                  mapTypeId: google.maps.MapTypeId.ROADMAP
                };
                 
  // crea l'oggetto mappa
  var map = new google.maps.Map(document.getElementById('map'), options);

  // marker posizione
var marker = new google.maps.Marker({ position: latlng,
                                      map: map});

}
 
window.onload = initialize;
</script>


E poi nell'oggetto widget il solito:
Citazione

   <div id="map" style="width: 500px; height: 300px"></div> <script>load();</script>

formattato nella posizione che volete (un <center></center>, una tabella... a fantasia vostra :D )

E funziona! (che qualcuno mi spieghi come si formatta il testo nel forum con questo quote, ci sto impazzendo, se faccio modifiche a mano mi scombussola tutto)

Unico problema: se la geolocalizzazione di http://www.mio-ip.it/?p=geolocalizzazione era precisa quella di geoplugin.net è approssimativa.

Topografo

  • Utente esperto
  • ***
  • Post: 265
ed ecco il mini contatore con tracking...
« Risposta #2 il: 05 Giugno, 2013, 16:38:04 »
Come base per il contatore avevo preso il contatore di Serzio: http://www.unofficialwsx5.com/index.php?topic=262.msg1577#msg1577, poi ho creato due script, uno che mi memorizzava il numero e uno che mi memorizzava il visitatore, poi ho guardato una trentina di pagine web di PHP, poi ho semplificato, estrapolato, modificato e alla fine sono arrivato ad una soluzione che mi simula shinystat (gli ultimi ingressi, quello che volevo io... ma non solo gli ultimi 15).

Si parte dalla memorizzazione del visitatore (che ho messo solo in homepage in widget)

Citazione
<?php

    $ipaddress = $_SERVER['REMOTE_ADDR'];
    $date = date ("M dS H:i:s");

    $message = "$page - $ipaddress - $date\n";


Questa parte mi da una variabile $message con l'IP e la data.
Volendo si migliora la cosa agendo sulla data con i parametri del comando date in php http://php.net/manual/en/function.date.php, o potete usare la variabile timestamp (che era graziosa e l'ho lasciata lì nel messaggio iniziale del thread)

Citazione
<!-- semplice track.txt con IP -->
<?php

    $ipaddress = $_SERVER['REMOTE_ADDR'];
    $date = date ("D d M Y H:i:s");
    $prov = $_SERVER['HTTP_REFERER'];
    $proz = $_SERVER['QUERY_STRING'];


Ho formattato la variabile date in un formato più comprensibile ma con mese e giorno della settimana in Inglese (credo che con un IF ELSE si possa tradurre) e ho messo due variabili che possono servire: sito di provenienza e chiave di provenienza ($prov e $proz).

Essendo il sito in test ho i due valori sempre nulli, ma facendo una ricerca con google del sito ed entrandoci ottengo per $prov il valore "http://www.google.it/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDYQFjAB&url=http%3A%2F%2Fwww.texanogrill.com%2Findex.php&ei=ejivUd6HB6ai4gSjsIGwBg&usg=AFQjCNHDQbU_DOFhUrUmMpqpjB5qgjHRPg&bvm=bv.47380653,d.bG" ... io ve le lascio le variabili, potete non usarle :)
Potete mettere tutte le variabili che volete, usare degli IF ELSE per mettere al posto delle stringhe strane quelle che volete voi (es. questa in neretto la trasformate in Google...) ci studiate, risolvete il problema e me lo comunicate (io ci ho provato e ho ottenuto una pagina vuota) :D

Citazione
    $message = " $ipaddress _ $date - $prov - $proz\n";

Unisco tutti i dati in una stringa $message e vado a capo (\n)

Citazione
    $File = "track.php";
    $Open = fopen($File, "a+");
    if ($Open){

    fwrite($Open, "$message");
    fclose ($Open);
    }

    ?>

Richiamo il mio file (chiamato track.php ma è un file di testo), ci scrivo dentro la stringa $message ed esco.

Il codice completo da inserire nel widget è:
Citazione
<?php

    $ipaddress = $_SERVER['REMOTE_ADDR'];
    $date = date ("D d M Y H:i:s");
    $prov = $_SERVER['HTTP_REFERER'];
    $proz = $_SERVER['QUERY_STRING'];

    $message = " $ipaddress _ $date - $prov - $proz\n";

    $File = "track.php";
    $Open = fopen($File, "a+");
    if ($Open){

    fwrite($Open, "$message");
    fclose ($Open);
    }

    ?>

Se volete modificare i parametri ho visto un file di testo del sito ballilatini.it nel quale memorizzavano di tutto (per quel che vi può servire)... tutti i parametri della variabile $_SERVER potete memorizzarli, anche andando accapo o mettendo una stringa di spiegazione all'inizio... fate vobis, provate prima lo script come ve lo posto io e poi personalizzatevelo se volete.

Fate girare una o due volte la pagina col codice e... non succede nulla. :)
Ma se andate ad aprire col browser il file www.vostrosito.it/track.php vedrete che i dati vengono registrati (e letti, è un file di testo)

1 - Adesso salvate quel file di testo sul vostro pc, editatelo col blocco note e all'inizio dello stesso aggingete la seguente stringa:
Citazione
<?php

2 - Non dimenticate di andare a capo dopo la stringa e memorizzate il tutto come track.php
3 - Salvate il file nella directory dalla quale l'avete preso (io uso filezilla per queste cose piccole, ma potete esportare tutti i file da Website X5) e provate a ricaricarlo dal browser

Se avete fatto tutti i passaggi giusti (1-3) non apparirà nulla! Altrimenti non avete salvato il file sul vostro pc o non l'avete memorizzato o non l'avete salvato nel posto dal quale l'avete scaricato.

Se invece non appare nulla dove prima leggevate un file di testo la stringa che avete messo fa interpretare al browser che quello che legge è un vero file .php, il browser cerca di interpretarlo vanamente e vi restituisce un risultato vuoto. Che è ciò che volevamo: non far vedere agli altri gli IP nostri.  ;)

E ora veniamo alla lettura dei dati.
In una pagina a vostra scelta (con password, nascosta, nel vostro pc che interroga il browser con Easyphp funzionante, in un altro sito ma col percorso giusto per interrogare quel file) mettiamo questo codice in un widget con barre di scorrimento (o senza se volete mostrare solo i primi accessi, ma se volete vedere gli ultimi dovete cambiare il codice):


Citazione
<?
echo "<p align=left>";

Il classico allineamento a sinistra
Tips: Se scrivete <? o <?php l'ultimo firefox lo interpreta ugualmente, ma non ho fatto la prova con tutti i browser... questo è solo un esempio e il codice vero e intero lo trovate alla fine.


Citazione
$var=@fopen("track.php","a+");

apriamo il file (mi raccomando il path, io ho il file nella root ma non so voi) in modalità lettura/scrittura ... perchè?
potrei usare il comando $var=@fopen("track.php","r"); che apre il file in maniera uguale, ma se il file non esiste darebbe un errore. aprendolo con a+ se il file non esiste lo crea (se avete i permessi di scrittura nel server, mi sembra logico) e mette il puntatore alla fine del file.

Citazione
$var2=file("track.php");
@fclose($var);

Mi leggo la variabile (array) alla fine ottenendo il suo valore (se ci sono 150 array sarà 149, si parte da 0) e chiudo il file

Citazione
$i=count($var2);//

e memorizzo questo valore in $i

Citazione
for($a=0; $a<=$i; $a++){
echo $a, " - ", $var2[$a]."<br>";
}
?>

 
Il cuore della routine: uso un ciclo for..next (sono affezionato al basic :) ) per incrementare di uno gli array partendo da 0 (potrei ometterlo, se volete fatelo)
scrivo a video il valore numerico dell'array corrente e i dati memorizzati in $message dal programmino che ho messo in home page (volete metterlo in tutte le pagine? provate con include, con un iframe invisibile... ma otterrete un file lunghissimo) che vengono memorizzati nella variabile $var2[$a]
Tutto quello che è contenuto tra le parentesi graffe (tenendo premuto il tasto ALT sinistro premete sul tastierino numerico la cifra 123 e poi lasciate il tasto ALT, per la chiusura tasto ALT e 125) è il ciclo for...next che si ripete finche $a rimane minore o uguale al valore dell'ultimo array.

Naturalmente se non vi interessano i particolari il codice è questo, ma poi se non vi funziona non chiedetemi il perchè senza aver prima letto le spiegazioni che vi ho dato sopra ;D

Citazione
<?php
echo "<p align=left>";
$var=@fopen("track.php","a+");
$var2=file("track.php");
@fclose($var);
$i=count($var2);
for($a=0; $a<=$i; $a++){
echo $a, " - ", $var2[$a]."<br>";
}
?>


Otterrete un qualcosa di simile a questo:
Citazione
0 - 1 -  151.62.136.235 _ Jun 05th 15:04:31 _  _
2 -  151.62.136.235 _ Jun 05th 15:09:16 _ http://www.google.it/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDYQFjAB&url=http%3A%2F%2Fwww.texanogrill.com%2Findex.php&ei=ejivUd6HB6ai4gSjsIGwBg&usg=AFQjCNHDQbU_DOFhUrUmMpqpjB5qgjHRPg&bvm=bv.47380653,d.bGE _
3 -  151.62.136.235 _ Wed 05 Jun 2013 15:14:45 -  -
4 -  151.62.136.235 _ Wed 05 Jun 2013 15:14:49 -  -
5 -


Cosa che per me va benissimo ma potreste voler levare lo 0 iniziale (è la lettura di "<?php") o il 5 finale.
Con le spiegazioni che ho dato sopra potete farlo, in sostanza si tratta di agire sul ciclo for...next del secondo programmino o non memorizzare in formato .php il file di testo...
Fate voi, è abbastanza personalizzabile questo mini contatore e magari in seguito lo farò.
Nel frattempo... ma la mailing list? Serzio?

Baci alle fanciulle

stesil

  • Anziani
  • Utente storico
  • *
  • Post: 1219
    • quellidelcucuzzolo
Re:Monitorare il visitatore ...e come non memorizzarlo!
« Risposta #3 il: 06 Giugno, 2013, 21:51:01 »
Ho letto e ho provato quanto hai scritto e ti ringrazio per la condivisione.  :)
Aggiungo qualche mia considerazione e qualche domanda, sperando possa essere utile per un confronto.  :)

Ho formattato la variabile date in un formato più comprensibile ma con mese e giorno della settimana in Inglese (credo che con un IF ELSE si possa tradurre)
Sicuramente ci saranno vie migliori, ma utilizzando w per il giorno della settimana (0 = domenica, 1 = lunedì, ....) e n per il mese, da memorizzare in due variabili diverse, e utilizzando l'istruzione switch si può avere la traduzione dei termini.

e ho messo due variabili che possono servire: sito di provenienza e chiave di provenienza ($prov e $proz).

E' anche possibile inserire un operatore condizionale in modo che se il valore della variabile $_SESSION risultasse vuoto, risulterebbe comunque a video qualcosa.
Codice:
Only registered users can see contents. Please click here to Register or Login.
1 - Adesso salvate quel file di testo sul vostro pc, editatelo col blocco note e all'inizio dello stesso aggingete la seguente stringa:
Codice:
Only registered users can see contents. Please click here to Register or Login.2 - Non dimenticate di andare a capo dopo la stringa e memorizzate il tutto come track.php
3 - Salvate il file nella directory dalla quale l'avete preso (io uso filezilla per queste cose piccole, ma potete esportare tutti i file da Website X5) e provate a ricaricarlo dal browser
Questo passaggio mi sembra laborioso. Non è più semplice creare il file php prima?

Se invece non appare nulla dove prima leggevate un file di testo la stringa che avete messo fa interpretare al browser che quello che legge è un vero file .php, il browser cerca di interpretarlo vanamente e vi restituisce un risultato vuoto.
Non è il browser che interpreta il file php. E' il server. Quando arriva al browser la pagina è già stata processata dal motore php del server.

E ora veniamo alla lettura dei dati.
In una pagina a vostra scelta (con password,
d'accordo

nascosta,
non sono d'accordo, nemmeno se si usa il nome più improbabile del mondo.  :)

nel vostro pc che interroga il browser con Easyphp funzionante,
Mhmm ... questa cosa io non la sapevo proprio. Ho provato e, con il file track.php scritto in quel modo, ottengo questo errore:
1 - Parse error:  syntax error, unexpected T_DNUMBER in /xxxxx/xxxxx/xxxxx/track.php on line 2
Sto sbagliando qualcosa?

in un altro sito ma col percorso giusto per interrogare quel file)
Anche qui non saprei. E' sempre possibile?

Codice:
Only registered users can see contents. Please click here to Register or Login.Il classico allineamento a sinistra

Se usato in una pagina in HTML5, è meglio così:
Codice:
Only registered users can see contents. Please click here to Register or Login.
Tips: Se scrivete <? o <?php l'ultimo firefox lo interpreta ugualmente, ma non ho fatto la prova con tutti i browser... questo è solo un esempio e il codice vero e intero lo trovate alla fine.

La sintassi abbreviata <? non è supportata da tutti i server e dipende dalle impostazioni presenti nel file php.ini (short_open_tag). Anche in questo caso, il browser non cambia le cose.

Codice:
Only registered users can see contents. Please click here to Register or Login.apriamo il file (mi raccomando il path, io ho il file nella root ma non so voi) in modalità lettura/scrittura ... perchè?
Non lo so. Perché è necessario aprire qui il file in lettura/scrittura? Nell'altro codice, quello inserito nella pagina da monitorare sì, ma in questa pagina che contiene i risultati del monitoraggio il file viene solo letto, non scritto. Se non esiste, non è qui che si crea, ma nella pagina in cui è inserito il codice precedente. Penso anche che se controlli prima l'esistenza del file con file_exists, ed esegui il resto del codice solo se il file esiste, non dovrebbe essere restituito nessun errore.

Poi ... io l'ho provato così, senza aprire il file

Codice:
Only registered users can see contents. Please click here to Register or Login.
e funziona.

Codice:
Only registered users can see contents. Please click here to Register or Login.

Qui a me sembra ci sia un errore: il ciclo for viene eseguito una volta in più di quanto dovrebbe. Come hai scritto i valori degli elementi dell'array partono da 0. Il ciclo for si deve fermare  quando il valore della variabile incremento è inferiore alla variabile $i, quindi così:

Codice:
Only registered users can see contents. Please click here to Register or Login.

In php c'è anche foreach, un ciclo che tratta proprio i dati degli array.

Topografo

  • Utente esperto
  • ***
  • Post: 265
Re:Monitorare il visitatore ...e come non memorizzarlo!
« Risposta #4 il: 08 Giugno, 2013, 07:34:26 »
Ho letto e ho provato quanto hai scritto e ti ringrazio per la condivisione.  :)
Aggiungo qualche mia considerazione e qualche domanda, sperando possa essere utile per un confronto.  :)


Ma certo, sono un autodidatta che sta imparando ora il PHP e non pretendo di insegnare, stavo solo scrivendo quello che ho implementato io in attesa che un altro mi faccia il lavoro che serve a me (ok, non la mettiamo così, diciamo che sto pensando seriamente ad usare Sendblaster).

Citazione
Sicuramente ci saranno vie migliori, ma utilizzando w per il giorno della settimana (0 = domenica, 1 = lunedì, ....) e n per il mese, da memorizzare in due variabili diverse, e utilizzando l'istruzione switch si può avere la traduzione dei termini.


Ok, complichiamo il codice che avevo lasciato al minimo e semplice.

Le variabili
Citazione
    $w = date ("w");
    $m = date ("m");

sappiamo che restituiscono valori da 0 a 6 (da Domenica a Sabato, ma c'è anche la variabile N che restituisce 1-7 da lun a dom http://php.net/manual/en/function.date.php)  -e da 01 a 12 (da Gen a Dic, vedi anche variabile n senza lo zero iniziale)
costruiamo degli if..then con gli swich (ho imparato a programmare con il GW-Basic  8) )

Citazione
// lettura giorno della settimana
switch( date("w") ){
 case 0:
$W="Domenica";
break;
 case 1:
$W="Luned&igrave";
break;
 case 2:
$W="Martedi";
break;
 case 3:
$W="Mercoledi";
break;
 case 4:
$W="Giovedi";
break;
 case 5:
$W="Venerdi";
break;
default:
$W="Sabato";
break;
}

// lettura mese
switch( date("m") ){
 case 01:
$M="Gennaio";
break;
 case 02:
$M="Febbraio";
break;
 case 03:
$M="Marzo";
break;
 case 04:
$M="Aprile";
break;
 case 05:
$M="Maggio";
break;
 case 06:
$M="Giugno";
break;
 case 07:
$M="Luglio";
break;
 case 08:
$M="Agosto";
break;
 case 09:
$M="Settembre";
break;
 case 06:
$M="Ottobre";
break;
 case 11:
$M="Novembre";
break;
default:
$M="Dicembre";
break;
}


A questo punto abbiamo due valori in $W e in $M: giorno e mese.

Costruiamoci la stringa della data

Citazione
    $date = $W . " " . date ("d") . " " . $M . " ore " . date ("Y H:i:s");


Il risultato diventa: Sabato 08 Giugno 2013 ore 07:16:25

Citazione
E' anche possibile inserire un operatore condizionale in modo che se il valore della variabile $_SESSION risultasse vuoto, risulterebbe comunque a video qualcosa.

Codice:
Only registered users can see contents. Please click here to Register or Login.


E' una soluzione elegante e brillante, ma mi chiedo ...se dovessi fare degli IF...THEN la stessa cosa per tutte le stringhe di tutti i browser... che codice mi verrebbe?

Per riassumere (e facilitare il compito per chi lo vuole usare) il codice dell'home page è diventato:
Citazione
<!-- semplice track.txt con IP -->
<?php

// lettura IP
    $ipaddress = $_SERVER['REMOTE_ADDR'];

// lettura giorno della settimana
switch( date("w") ){
 case 0:
$W="Domenica";
break;
 case 1:
$W="Luned&igrave";
break;
 case 2:
$W="Martedi";
break;
 case 3:
$W="Mercoledi";
break;
 case 4:
$W="Giovedi";
break;
 case 5:
$W="Venerdi";
break;
default:
$W="Sabato";
break;
}

// lettura mese
switch( date("m") ){
 case 01:
$M="Gennaio";
break;
 case 02:
$M="Febbraio";
break;
 case 03:
$M="Marzo";
break;
 case 04:
$M="Aprile";
break;
 case 05:
$M="Maggio";
break;
 case 06:
$M="Giugno";
break;
 case 07:
$M="Luglio";
break;
 case 08:
$M="Agosto";
break;
 case 09:
$M="Settembre";
break;
 case 06:
$M="Ottobre";
break;
 case 11:
$M="Novembre";
break;
default:
$M="Dicembre";
break;
}
// mi costruisco la variabile date
    $date = $W . " " . date ("d") . " " . $M . " ore " . date ("Y H:i:s");

// lettura provenienza e stringa
$prov = $_SERVER['HTTP_REFERER'] != '' ? $_SERVER['HTTP_REFERER'] : "link diretto";
$proz = $_SERVER['QUERY_STRING'] != '' ? $_SERVER['QUERY_STRING'] : "none";

    $message = " $ipaddress - $date - $prov - $proz\n";

    $File = "track.php";
    $Open = fopen($File, "a+");
    if ($Open){

    fwrite($Open, "$message");
    fclose ($Open);
    }

    ?>


Citazione
Questo passaggio mi sembra laborioso. Non è più semplice creare il file php prima?


Si, ma non si avrebbe il risultato che volevo...
Nel primo messaggio del thread ho detto che non volevo memorizzare i dati in formato testo e ho fatto un esempio per mostrare che con un pò di fortuna qualcuno te li legge.
Quindi ho creato un file di testo, ho mostrato che era leggibile e poi ho mostrato che inserendo la riga sparisce.
Spero che questo spieghi la cosa.
Se dicessi "Fate una stringa con <?PHP e salvatela in modo che incolli in coda gli IP e siano invisibili"... è lo stesso risultato, ma penso di spiegarlo peggio. Se invece faccio vedere i due esempi (spiegando lo sbaglio per prima) dovrebbe essere più comprensibile... è un sistema che usavano anche con me a scuola  ;D

Citazione
Non è il browser che interpreta il file php. E' il server. Quando arriva al browser la pagina è già stata processata dal motore php del server.

Lo imparerò mai? Ancora adesso confondo le cose e si che lo leggo da anni...  :(

Citazione
Citazione
nascosta

non sono d'accordo, nemmeno se si usa il nome più improbabile del mondo.  :)
Citazione
nel vostro pc che interroga il browser con Easyphp funzionante,

Mhmm ... questa cosa io non la sapevo proprio. Ho provato e, con il file track.php scritto in quel modo, ottengo questo errore:
1 - Parse error:  syntax error, unexpected T_DNUMBER in /xxxxx/xxxxx/xxxxx/track.php on line 2
Sto sbagliando qualcosa?

In effetti io l'avevo nascosta con Website X5 e poi gli ho messo un login. Ma il principio è che la lettura può essere fatta da un altra parte.

Infatti volevo creare un unico spazio dal quale monitoravo tutti i file track.php (ok, lo so che è pazzia pura, ma sul mio PC ho un file bookmark.html che mi richiama tutti gli Shinystat che ho messo in giro per i siti... così non muoiono i contatori di siti con visite 0 da mesi... se vi state chiedendo a che mi serva scrivermi un mio bookmark in locale che richiami i siti in remoto... ci metto di tutto, organizzato e con screenshot dei siti :P )

Citazione
$var=@fopen("http://www.bandbverona.com/track.php","a+");//apro il file .txt (modalità lettura/scrittura)
$var2=file("http://www.bandbverona.com/track.php");//estraggo l'array dal file .txt


E a me funziona tra un sito e un altro..., e anche concettualmente col path giusto è impossibile che non funzioni, in questo esempio lo leggo da un altro server e un altro dominio... ma potrei anche scrivere tra due server...
Per l'EasyPhp ho dato per scontato che funzionasse, magari se mi serve veramente faccio qualche prova, ma se mi dici che non funziona ammetto di aver detto una scemenza... mi capita spesso  ;D

Citazione
Se usato in una pagina in HTML5, è meglio così:
Codice:
Only registered users can see contents. Please click here to Register or Login.


Citazione
La sintassi abbreviata <? non è supportata da tutti i server e dipende dalle impostazioni presenti nel file php.ini (short_open_tag). Anche in questo caso, il browser non cambia le cose.

Si vede che ho imparato l'HTML da autodidatta nel 2000? E che sto imparando il PHP da autodidatta da una settimana?  :-[

Citazione
Non lo so. Perché è necessario aprire qui il file in lettura/scrittura? Nell'altro codice, quello inserito nella pagina da monitorare sì, ma in questa pagina che contiene i risultati del monitoraggio il file viene solo letto, non scritto. Se non esiste, non è qui che si crea, ma nella pagina in cui è inserito il codice precedente. Penso anche che se controlli prima l'esistenza del file con file_exists, ed esegui il resto del codice solo se il file esiste, non dovrebbe essere restituito nessun errore.


Eggià, il problema è che anche nella pagina protetta doveva salvare qualcosa nel file track.php. Quindi mi serviva che il file esisteva e poterci scrivere dentro. L'ho fatto per poterci scrivere anche dell'altro in quel file: gli accessi all'area amministrativa che tramite apposito flag dovevano essere monitorati anch'essi.
Quindi è si sbagliato ora, ma quando l'ho scritto aveva un suo senso... anche crearlo dal lettore di file.

Il tuo codice
Codice:
Only registered users can see contents. Please click here to Register or Login.
Funzionerebbe se il file mancasse? A me non me lo dice nessuno che l'amministratore del sito passi dall'home page (io dal browser vado direttamente alla pagina aministrativa). Comunque in effetti tranne che la prima volta il file dovrebbe esistere sempre. Ma io invece del if exist sono passato direttamente al crearlo...



Citazione
Codice:
Only registered users can see contents. Please click here to Register or Login.Qui a me sembra ci sia un errore: il ciclo for viene eseguito una volta in più di quanto dovrebbe. Come hai scritto i valori degli elementi dell'array partono da 0. Il ciclo for si deve fermare  quando il valore della variabile incremento è inferiore alla variabile $i, quindi così:


Io ne ero sicuro che c'era un errore, infatti mi creava un campo vuoto... ma ogni volta che lo notavo e volevo cambiare in qualche modo quella stringa ero sempre senza website a portata di mano. L'hai corretto tu per me  :D

Fin'ora il codice della seconda parte è:

Codice:
Only registered users can see contents. Please click here to Register or Login.
Dove al posto dello spazio devo ancora scrivere un altra registrazione di Data e IP, quella dell'amministratore (non mi interessa sapere da dove viene)

Bene, è prestissimo e non rileggo per correggere gli errori ortografici...

Baci alle fanciulle :)

milux

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1779
    • 3MD
Re:Monitorare il visitatore ...e come non memorizzarlo!
« Risposta #5 il: 08 Giugno, 2013, 09:34:55 »

Ma certo, sono un autodidatta che sta imparando ora il PHP e non pretendo di insegnare, stavo solo scrivendo quello che ho implementato io in attesa che un altro mi faccia il lavoro che serve a me (ok, non la mettiamo così, diciamo che sto pensando seriamente ad usare Sendblaster).




PHPLIST è una ottima soluzione open source  http://www.phplist.com/
**OS : Windows 7 - 63Bit (uno è andato perso e non lo trovo..) + W10
**Website X5 :  Evo 10(active) - Evo 11(active) - 13(active)
**Wysiwyg Web Builder 12 (passa al lato oscuro..)
**Hosting : LINUX
**Editor : Notepad ++ / Geany

Topografo

  • Utente esperto
  • ***
  • Post: 265
Re:Monitorare il visitatore ...e come non memorizzarlo!
« Risposta #6 il: 08 Giugno, 2013, 10:54:20 »
Se non ho capito male è a pagamento € al mese...
Anche se gli ho dato un occhiata veloce, ma è possibile inserirlo in un template website?