Php – MySQL - CMS
Ugo Rinaldi - 2010-2013
ugo.rinaldi@gmail.com
PHP – Hypertext Preprocessor

Motore di scripting (eseguiti sul server)

Sintassi “C-like”

Piattaforme diverse

Linguaggio potente, ricco di funzioni

Connessione a database

Modulo del Web Server

...modulo CGI
A cosa vogliamo arrivare

Php

Mysql

Php + Mysql >>> Applicazioni web dinamiche
Pagine statiche

Html = pagine statiche

Javascript migliora molto la dinamicità client

Necessario aggiornare contenuti e dati
Web Server

Una applicazione server: Apache, IIS, ...

Riceve richieste client

Interagisce con altre applicazioni server

Determina ed invia al client risposta con dati e/o
codice HTML
Cosa serve

Xampp:

Download

Installazione

Prova

Editor di testo

Browser
Iniziamo con Php
Il tag per inserire codice php:
<?php … ?>
Per scrivere nella pagina:
echo “Hello World!”
Print(“......”)
Nomi variabili:
$a, $b, $importo
Costanti
define("COSTANTE", "Ciao mondo.");
I cicli
while($i>0) { echo “i vale $i”; }
do {
echo "$i <br />n";
$i++;
} while ($i < 10);
for ($i=-5; $i < 5; $i++) { echo "$i <br />n"; }
Variabili Stringa
$s=”Linkin Park”;
print(“stringa = $s”);
for ($i=0; $i<strlen($s); $i++) {
print($s{$i}.“<br>”);
}
Caratteri speciali tra apici
' singolo apice
” doppio apice
 backslash
r ritorno a capo
n nuova linea
t tabulazione orizzontale
Da usare dentro una stringa tra singoli o doppi apici
esempio: “Marta disse: ”Firenze lo sa”nr”
Operatori
Operatori aritmetici
+ - * / % ++–
Operatori di assegnamento
+= -= *= /= %= &=
Operatori relazionali
== === < <=> >=!= !==
Operatori logici
&& AND || OR XOR !
$a%=$b equivale a $a=$a%$b
Flusso di controllo
if ($saldo==0) {
…;
} else {
...;
}
if ... elseif … else ...
switch e break
Switch ($scelta) {
case “+” : $r=$a+$b;
break;
case “-” : $r=$a-$b;
break;
case “*” : $r=$a*$b;
break;
case “/” : $r=$a/$b;
break;
default: echo “operatore errato!”;
}
foreach
Ciclo su tutti gli elementi di un array
$a=array(“ieri”,”oggi”,”domani”,”dopodomani”);
foreach($a as $ele) {
print(“$ele <br>”);
}
break – continue - exit
break :
Permette l'uscita da qualsiasi ciclo
continue :
Salta all'inizio del ciclo per l'iterazione successiva
exit :
Interrompe completamente l'esecuzione dello script
try … catch (MyException $e) ...
try {
// istruzione che puo' causare errore
} catch (Exception $e) {
// istruzioni in caso di errore
}
Funzioni
Per dichiarare la funzione
function somma($a, $b) {
$c=$a+$b;
return $c;
}
per richiamarla
$somma=somma($val1,$val2);
Oppure anche
print(“la somma e' : “.somma($val1,$val2).”<br>”);
Visibilità Variabili
Sono LOCALI le variabili dichiarate in una funzione
global nomevariabile
attiva l'uso di una variabile definita esternamente
static $contatore=0
Dichiara una variabile locale assegnando un valore non
reinizializzato nelle successive esecuzioni
Parametri di una funzione utente
Passati per valore es: function swap($a,$b) {…}
O per riferimento es: function swap(&$a,&$b) {…}
Valore di default es: function swap($a,$b=0) {…}
Funzioni con numero variabile di argomenti:
...func_num_args() e func_get_arg($i)
...esempio fattoriale e funzioni dinamiche
Array
Dichiarazioni di array:
$contatti [];
$nomi[0]=”Marcincus”;
$cd[]=”Metallica”;
$squadre[“campioni”]=”Inter”;
$vocali=array(“a”,”e”,”i”,”o”,”u”);
...esempio array
Array associativi

Fondamentali in PHP

Non usano numeri per puntare agli elementi

Usano stringhe
$clienti[“nome”]=”Rossi Mario”;
$clienti[“provincia”]=”Catania”;
$clienti[“telefono”]=”095-454545”;
$cd=array(“Autore”=>”Springsteen”,
“Titolo”=>”The River”,
“Anno”=>1980);
Variabili predefinite Php

$_GET

$_POST

$GLOBALS

$_SERVER

…

...

$_SESSION
Le Sessioni
La sessione è il modo più semplice per seguire un utente dal
momento in cui si collega a quando interrompe il collegamento
internet.
Il server apre una sessione con la funzione session_start() e gli
assegna un nome univoco.
Le variabili di sessione sono memorizzate in un array globale di
nome $_SESSION[]
Deposita un cookie nella macchina dell'utente e ogni volta che ne
ha bisogno, ne estrae i dati per risalire alla sessione e al file
salvato.
Iniziare la sessione con session_start() prima di ogni altro output
dal server. NESSUNA funzione di uscita deve precederla,
neppure il codice HTML!!
Session: funzioni e codici
session_start(); // apre una sessione
$_SESSION['nomevariabile']; //crea l'array globale che
contiene tutte le variabili di sesssione.
session_unset(); //distrugge le variabili sessione.
session_destroy(); //distrugge una sessione
session_set_cookie_params(); //imposta i secondi di inattività
oltre i quali la sessione è cancellata
Session: un esempio
<?php
session_start();
//Recupero username e password dal form e li salvo
$username = $_POST['user'];
$password = $_POST['pass'];
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
$_SESSION['views']=1;
?>
<html>...
<body>...
Session: l'esempio in una pagina successiva
<?php
session_start();
If (isset($_SESSION['views']))
$_SESSION['views']=$_SESSION['views']+1;
else
$_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>
I file di testo

Caratteri visualizzabili (testo)

Accesso sequenziale

Ogni riga finisce con il carattere di ritorno a capo
'n'
Scrittura di un file
if (!$p_file = fopen("miofile2.txt","w")) {
echo "Errore: non posso aprire il file miofile2.txt";
exit;
}
flock($p_file,LOCK_EX);
fputs($p_file,"Pippon");
fputs($p_file,"Pluton");
fputs($p_file,"Paperinon");
flock($p_file,LOCK_UN);
fclose($p_file);
Lettura di un file
if (!$p_file = fopen("miofile3.txt","r")) {
echo "Spiacente, non posso aprire il file";
} else {
while(!feof($p_file)) {
$linea = fgets($p_file, 255);
echo "$linea<BR>";
}
fclose($p_file);
}
Lettura e scrittura
$p_file = fopen("rubrica2.csv","r");
$p_file_out = fopen("miofile3.txt","w");
If (!$p_file || !$p_file_out) {
echo "Spiacente, non posso aprire uno dei file";
} else {
flock($p_file_out,LOCK_EX);
while(!feof($p_file)) {
$linea = fgets($p_file, 255);
$linea=str_replace ( ",","n",$linea );
fputs($p_file_out,$linea);
}
fclose($p_file); flock($p_file_out,LOCK_UN);
fclose($p_file_out);
}
Invio dati da un form
<form action=”http://127.0.0.1/mobile/registra.php” method=”post”>
Nominativo: <input type=”text” name=”nome”>
Email: <input type=”text” name=”email”>
Citt&agrave: <input type=”text” name=”citta”>
<input type=”submit” value=”Invia”>
</form>
Ricezione dati
Il server riceverà i valori inviati dal form in un
vettore di sistema chiamato $_REQUEST
$a=$_REQUEST[nome];
$b=$_REQUEST[email];
$c=$_REQUEST[citta];
Esercizio - Client
Creare un form per
la selezione di una categoria di fornitori da una list
box
Generare 2 numeri interi compresi tra 1 e 100
(longitudine e latitudine)
Inserimento/modifica dei numeri generati
Inserimento dell'email utente
Invio delle 4 informazioni a ricerca.php
Esercizio - Server
Leggere un file di testo “fornitori.txt”
Per i soli record con categoria uguale a quella
selezionata dal Client calcolare la distanza minima
tra le coordinante client e quelle del fornitore
Visualizzare i dati del fornitore piu' vicino alla
posizione del client
MySQL
Potente database SQL
Utilizzato nella maggioranza dei siti dinamici sul web
Download dell'ultima versione dal sito Oracle
oppure download XAMPP
Perfettamente integrabile con Apache e Php
Panoramica Sql

Select - usata per interrogare 1 o più righe

Insert - usata nei nuovi inserimenti di riga

Update - usata per modificare 1 o più righe

Delete - usata per eliminare 1 o più righe
Interrogazione di un DB

$cs=mysql_connect(“localhost”, “pippo”, “miapassword”)
si connette al server

mysql_select_db(“rubrica”, $cs)
apre il database

mysql_close($cs);
chiude la connessione

$recSet=mysql_query("select * from rubrica", $cs);
esegue la query

$line=mysql_fetch_assoc($recSet)
copia il record puntato in un array associativo

mysql_free_result($recSet);
libera la memoria dal record set
Inserimento nuova riga in un DB

$cs=mysql_connect(“localhost”, “pippo”, “miapassword”)
si connette al server

mysql_select_db(“rubrica”, $cs)
apre il database

mysql_close($cs);
chiude la connessione

$recSet=
mysql_query("insert into tabella (campo1, …) values (val1,...)", $cs);
Modifica di una riga in un DB

$cs=mysql_connect(“localhost”, “pippo”, “miapassword”)
si connette al server

mysql_select_db(“rubrica”, $cs)
apre il database

mysql_close($cs);
chiude la connessione

$recSet=
mysql_query("update tabella set campo1=xxx, campo2=yyy...", $cs);
Elimina una riga in un DB

$cs=mysql_connect(“localhost”, “pippo”, “miapassword”)
si connette al server

mysql_select_db(“rubrica”, $cs)
apre il database

mysql_close($cs);
chiude la connessione

$recSet=
mysql_query("update tabella set campo1=xxx, campo2=yyy...", $cs);
Troppo difficile
HTML, Php, MySQL (Java, Tomcat, …)
TROPPO DIFFICILE
...e allora
CMS
Content Management System!

Sito dinamico

Applicazione lato server

No programmazione

Specializzati

Sfrutta un DB

Sezione di amministrazione
Vantaggi
No programmazione
Aspetto gestito tramite fogli di stile CSS anche già
disponibili in template (temi)
Anche i flat file CMS: solo file dati, nessun DB relazionale
Generici o Specializzati
Enciclopedia on-line (Wiki)
Blog
Forum
(E-Learning)
Gli attori dei CMS

Amministratori

Produttori

Fruitori
CMS open source
Drupal
Joomla
Php-Nuke
WordPress
WordPress

Download Wordpress in italiano

MySQL

Creare un db “wp”

Creare un utente “wp” con tutti i privilegi per il db

Creare c:xampphtdocswordpress

Estrarre i file dentro c:xampphtdocswordpress
WordPress 2

Copiare il file wp-config-sample.php in wp-config.php

Modificare il wp-config.php nei seguenti punti :

'DB NAME' 'wp'

'DB USER' 'wp'

'DB PASSWORD' 'wp'

Salvare e uscire

Browser: http://localhost/wordpress/wp-admin/install.php

Annotare la password

Collegati
Gli articoli

Creare una categoria

Creare un articolo - Visibilità

Pubblicare

Pubblicazione programmata
Le pagine

Creare un pagina

Pubblicare
Gli Utenti
Amministratore: tutto + commenti
Editore: Articoli, pagine, pubblicazione (no Aspetto, e
impostazioni limitate)
Autore: articoli, pubblicazione
Collaboratore: articoli
Sottoscrittore
???
Ricordate l'esercizio realizzato con localizzazione
dell'utente e individuazione del fornitore più
vicino?
Individuare i fruitori sul territorio
Individuare più frequenti richieste
MoULe
MoULe
Back Stage:
Associazione di contenuti didattici a specifiche
localizzazioni geografiche
Acquisizione materiale multimediale e pubblicazione
online
Funzionalità
Ricerca di informazioni legate alla posizione
Inserimento contenuti in modo collaborativo (wiki e
mappe concettuali)
Annotazioni multimediali mediante dispositivi
mobili
Chat e forum sensibili alla posizione
Point of interest
Monitoraggio utenti

Php mysql e cms

  • 1.
    Php – MySQL- CMS Ugo Rinaldi - 2010-2013 ugo.rinaldi@gmail.com
  • 2.
    PHP – HypertextPreprocessor  Motore di scripting (eseguiti sul server)  Sintassi “C-like”  Piattaforme diverse  Linguaggio potente, ricco di funzioni  Connessione a database  Modulo del Web Server  ...modulo CGI
  • 3.
    A cosa vogliamoarrivare  Php  Mysql  Php + Mysql >>> Applicazioni web dinamiche
  • 4.
    Pagine statiche  Html =pagine statiche  Javascript migliora molto la dinamicità client  Necessario aggiornare contenuti e dati
  • 5.
    Web Server  Una applicazioneserver: Apache, IIS, ...  Riceve richieste client  Interagisce con altre applicazioni server  Determina ed invia al client risposta con dati e/o codice HTML
  • 6.
  • 7.
    Iniziamo con Php Iltag per inserire codice php: <?php … ?> Per scrivere nella pagina: echo “Hello World!” Print(“......”) Nomi variabili: $a, $b, $importo Costanti define("COSTANTE", "Ciao mondo.");
  • 8.
    I cicli while($i>0) {echo “i vale $i”; } do { echo "$i <br />n"; $i++; } while ($i < 10); for ($i=-5; $i < 5; $i++) { echo "$i <br />n"; }
  • 9.
    Variabili Stringa $s=”Linkin Park”; print(“stringa= $s”); for ($i=0; $i<strlen($s); $i++) { print($s{$i}.“<br>”); }
  • 10.
    Caratteri speciali traapici ' singolo apice ” doppio apice backslash r ritorno a capo n nuova linea t tabulazione orizzontale Da usare dentro una stringa tra singoli o doppi apici esempio: “Marta disse: ”Firenze lo sa”nr”
  • 11.
    Operatori Operatori aritmetici + -* / % ++– Operatori di assegnamento += -= *= /= %= &= Operatori relazionali == === < <=> >=!= !== Operatori logici && AND || OR XOR ! $a%=$b equivale a $a=$a%$b
  • 12.
    Flusso di controllo if($saldo==0) { …; } else { ...; } if ... elseif … else ...
  • 13.
    switch e break Switch($scelta) { case “+” : $r=$a+$b; break; case “-” : $r=$a-$b; break; case “*” : $r=$a*$b; break; case “/” : $r=$a/$b; break; default: echo “operatore errato!”; }
  • 14.
    foreach Ciclo su tuttigli elementi di un array $a=array(“ieri”,”oggi”,”domani”,”dopodomani”); foreach($a as $ele) { print(“$ele <br>”); }
  • 15.
    break – continue- exit break : Permette l'uscita da qualsiasi ciclo continue : Salta all'inizio del ciclo per l'iterazione successiva exit : Interrompe completamente l'esecuzione dello script
  • 16.
    try … catch(MyException $e) ... try { // istruzione che puo' causare errore } catch (Exception $e) { // istruzioni in caso di errore }
  • 17.
    Funzioni Per dichiarare lafunzione function somma($a, $b) { $c=$a+$b; return $c; } per richiamarla $somma=somma($val1,$val2); Oppure anche print(“la somma e' : “.somma($val1,$val2).”<br>”);
  • 18.
    Visibilità Variabili Sono LOCALIle variabili dichiarate in una funzione global nomevariabile attiva l'uso di una variabile definita esternamente static $contatore=0 Dichiara una variabile locale assegnando un valore non reinizializzato nelle successive esecuzioni
  • 19.
    Parametri di unafunzione utente Passati per valore es: function swap($a,$b) {…} O per riferimento es: function swap(&$a,&$b) {…} Valore di default es: function swap($a,$b=0) {…} Funzioni con numero variabile di argomenti: ...func_num_args() e func_get_arg($i) ...esempio fattoriale e funzioni dinamiche
  • 20.
    Array Dichiarazioni di array: $contatti[]; $nomi[0]=”Marcincus”; $cd[]=”Metallica”; $squadre[“campioni”]=”Inter”; $vocali=array(“a”,”e”,”i”,”o”,”u”); ...esempio array
  • 21.
    Array associativi  Fondamentali inPHP  Non usano numeri per puntare agli elementi  Usano stringhe $clienti[“nome”]=”Rossi Mario”; $clienti[“provincia”]=”Catania”; $clienti[“telefono”]=”095-454545”; $cd=array(“Autore”=>”Springsteen”, “Titolo”=>”The River”, “Anno”=>1980);
  • 22.
  • 23.
    Le Sessioni La sessioneè il modo più semplice per seguire un utente dal momento in cui si collega a quando interrompe il collegamento internet. Il server apre una sessione con la funzione session_start() e gli assegna un nome univoco. Le variabili di sessione sono memorizzate in un array globale di nome $_SESSION[] Deposita un cookie nella macchina dell'utente e ogni volta che ne ha bisogno, ne estrae i dati per risalire alla sessione e al file salvato. Iniziare la sessione con session_start() prima di ogni altro output dal server. NESSUNA funzione di uscita deve precederla, neppure il codice HTML!!
  • 24.
    Session: funzioni ecodici session_start(); // apre una sessione $_SESSION['nomevariabile']; //crea l'array globale che contiene tutte le variabili di sesssione. session_unset(); //distrugge le variabili sessione. session_destroy(); //distrugge una sessione session_set_cookie_params(); //imposta i secondi di inattività oltre i quali la sessione è cancellata
  • 25.
    Session: un esempio <?php session_start(); //Recuperousername e password dal form e li salvo $username = $_POST['user']; $password = $_POST['pass']; $_SESSION['username'] = $username; $_SESSION['password'] = $password; $_SESSION['views']=1; ?> <html>... <body>...
  • 26.
    Session: l'esempio inuna pagina successiva <?php session_start(); If (isset($_SESSION['views'])) $_SESSION['views']=$_SESSION['views']+1; else $_SESSION['views']=1; echo "Views=". $_SESSION['views']; ?>
  • 27.
    I file ditesto  Caratteri visualizzabili (testo)  Accesso sequenziale  Ogni riga finisce con il carattere di ritorno a capo 'n'
  • 28.
    Scrittura di unfile if (!$p_file = fopen("miofile2.txt","w")) { echo "Errore: non posso aprire il file miofile2.txt"; exit; } flock($p_file,LOCK_EX); fputs($p_file,"Pippon"); fputs($p_file,"Pluton"); fputs($p_file,"Paperinon"); flock($p_file,LOCK_UN); fclose($p_file);
  • 29.
    Lettura di unfile if (!$p_file = fopen("miofile3.txt","r")) { echo "Spiacente, non posso aprire il file"; } else { while(!feof($p_file)) { $linea = fgets($p_file, 255); echo "$linea<BR>"; } fclose($p_file); }
  • 30.
    Lettura e scrittura $p_file= fopen("rubrica2.csv","r"); $p_file_out = fopen("miofile3.txt","w"); If (!$p_file || !$p_file_out) { echo "Spiacente, non posso aprire uno dei file"; } else { flock($p_file_out,LOCK_EX); while(!feof($p_file)) { $linea = fgets($p_file, 255); $linea=str_replace ( ",","n",$linea ); fputs($p_file_out,$linea); } fclose($p_file); flock($p_file_out,LOCK_UN); fclose($p_file_out); }
  • 31.
    Invio dati daun form <form action=”http://127.0.0.1/mobile/registra.php” method=”post”> Nominativo: <input type=”text” name=”nome”> Email: <input type=”text” name=”email”> Citt&agrave: <input type=”text” name=”citta”> <input type=”submit” value=”Invia”> </form>
  • 32.
    Ricezione dati Il serverriceverà i valori inviati dal form in un vettore di sistema chiamato $_REQUEST $a=$_REQUEST[nome]; $b=$_REQUEST[email]; $c=$_REQUEST[citta];
  • 33.
    Esercizio - Client Creareun form per la selezione di una categoria di fornitori da una list box Generare 2 numeri interi compresi tra 1 e 100 (longitudine e latitudine) Inserimento/modifica dei numeri generati Inserimento dell'email utente Invio delle 4 informazioni a ricerca.php
  • 34.
    Esercizio - Server Leggereun file di testo “fornitori.txt” Per i soli record con categoria uguale a quella selezionata dal Client calcolare la distanza minima tra le coordinante client e quelle del fornitore Visualizzare i dati del fornitore piu' vicino alla posizione del client
  • 35.
    MySQL Potente database SQL Utilizzatonella maggioranza dei siti dinamici sul web Download dell'ultima versione dal sito Oracle oppure download XAMPP Perfettamente integrabile con Apache e Php
  • 36.
    Panoramica Sql  Select -usata per interrogare 1 o più righe  Insert - usata nei nuovi inserimenti di riga  Update - usata per modificare 1 o più righe  Delete - usata per eliminare 1 o più righe
  • 37.
    Interrogazione di unDB  $cs=mysql_connect(“localhost”, “pippo”, “miapassword”) si connette al server  mysql_select_db(“rubrica”, $cs) apre il database  mysql_close($cs); chiude la connessione  $recSet=mysql_query("select * from rubrica", $cs); esegue la query  $line=mysql_fetch_assoc($recSet) copia il record puntato in un array associativo  mysql_free_result($recSet); libera la memoria dal record set
  • 38.
    Inserimento nuova rigain un DB  $cs=mysql_connect(“localhost”, “pippo”, “miapassword”) si connette al server  mysql_select_db(“rubrica”, $cs) apre il database  mysql_close($cs); chiude la connessione  $recSet= mysql_query("insert into tabella (campo1, …) values (val1,...)", $cs);
  • 39.
    Modifica di unariga in un DB  $cs=mysql_connect(“localhost”, “pippo”, “miapassword”) si connette al server  mysql_select_db(“rubrica”, $cs) apre il database  mysql_close($cs); chiude la connessione  $recSet= mysql_query("update tabella set campo1=xxx, campo2=yyy...", $cs);
  • 40.
    Elimina una rigain un DB  $cs=mysql_connect(“localhost”, “pippo”, “miapassword”) si connette al server  mysql_select_db(“rubrica”, $cs) apre il database  mysql_close($cs); chiude la connessione  $recSet= mysql_query("update tabella set campo1=xxx, campo2=yyy...", $cs);
  • 41.
    Troppo difficile HTML, Php,MySQL (Java, Tomcat, …) TROPPO DIFFICILE ...e allora
  • 42.
    CMS Content Management System!  Sitodinamico  Applicazione lato server  No programmazione  Specializzati  Sfrutta un DB  Sezione di amministrazione
  • 43.
    Vantaggi No programmazione Aspetto gestitotramite fogli di stile CSS anche già disponibili in template (temi) Anche i flat file CMS: solo file dati, nessun DB relazionale
  • 44.
    Generici o Specializzati Enciclopediaon-line (Wiki) Blog Forum (E-Learning)
  • 45.
    Gli attori deiCMS  Amministratori  Produttori  Fruitori
  • 46.
  • 47.
    WordPress  Download Wordpress initaliano  MySQL  Creare un db “wp”  Creare un utente “wp” con tutti i privilegi per il db  Creare c:xampphtdocswordpress  Estrarre i file dentro c:xampphtdocswordpress
  • 48.
    WordPress 2  Copiare ilfile wp-config-sample.php in wp-config.php  Modificare il wp-config.php nei seguenti punti :  'DB NAME' 'wp'  'DB USER' 'wp'  'DB PASSWORD' 'wp'  Salvare e uscire  Browser: http://localhost/wordpress/wp-admin/install.php  Annotare la password  Collegati
  • 49.
    Gli articoli  Creare unacategoria  Creare un articolo - Visibilità  Pubblicare  Pubblicazione programmata
  • 50.
    Le pagine  Creare unpagina  Pubblicare
  • 51.
    Gli Utenti Amministratore: tutto+ commenti Editore: Articoli, pagine, pubblicazione (no Aspetto, e impostazioni limitate) Autore: articoli, pubblicazione Collaboratore: articoli Sottoscrittore
  • 52.
    ??? Ricordate l'esercizio realizzatocon localizzazione dell'utente e individuazione del fornitore più vicino? Individuare i fruitori sul territorio Individuare più frequenti richieste
  • 53.
  • 54.
    MoULe Back Stage: Associazione dicontenuti didattici a specifiche localizzazioni geografiche Acquisizione materiale multimediale e pubblicazione online
  • 55.
    Funzionalità Ricerca di informazionilegate alla posizione Inserimento contenuti in modo collaborativo (wiki e mappe concettuali) Annotazioni multimediali mediante dispositivi mobili Chat e forum sensibili alla posizione Point of interest Monitoraggio utenti