Newsgroup: it.comp.www.php
Titolo: contatore click

Chidetemi quello che volete su Delphi, Visual Basic ecc.. che mi rispondo
alle cose impossibili  ma sono scarso nel mondo "web"!!! :)))
Esiste un sistema che monitorizzi i click su di un link, o gli accessi alla
singola pagina???
Ovviamente in php che è il mio preferito! :DDD
--
Massimiliano Etere
massimili...@programmando.org
http://www.programmando.org


ohhh si e come... cosa preferisci salvare i dati in un db ? in un file di
testo ?
al caricamento di una pagina potresti fare:
<?
$fp = fopen("click.txt","r");
$num = fread($fp,filesize("click.txt"));
fclose($fp);
$num += 1;
$fp = fopen("click.txt","w");
fwrite($fp,$num);
fclose($fp);
?>
Ciao
Alex

 ?>
...in PHP è garantita l'atomicità di uno script?
...per esempio può capitare che in un thread di apache lo script del
contatore riportato sopra legga il file... poi arriva un'altra richiesta che
interrompe la precedente e un altro thread legge di nuovo il file prima che
il precedente abbia scritto il risultato sul file?
Non ho mai trovato niente nel manuale di apache?
Per esempio, il problema si potrebbe estentere anche ai database MySQL che
non supportano le transizioni... l'atomicità delle operazioni è garantita
per ogni singola query o posso stare tranquillo per ogni connessione al db?
Spesso mi capita di fare script in cui eseguo una SELECT e poi una UPDATE o
INSERT in base al risultato restituito dalla query precedente... finora non
ho mai avuto grossi problemi... posso stare tranquillo?
Esistono in PHP costrutti/funzioni per gestire semafori o per la
sincronizzazione tra script?
--
Reply to: brain79(at)
inwind.it
www.brainetwork.net
ICQ# 
4742797710
 - FeSToso n°143

 ho mai avuto grossi problemi... posso stare tranquillo?
sicuramente puoi stare tranquillo, il db gestisce tutte le query e io non ho
mai avuto problemi neanche con query che operavano su diverse migliaia di
records :-)
Ciao
Alex

sincronizzazione tra script?
Si, puo' capitare, per risolvere puoi usare
la classica flock (sezione filesystem functions del manuale)
che ti assicura la sincronizzazione tra tutti i processi
**che la usano**, comunque per quello che devi fare va
piu' che bene.
Bonf

 piu' che bene.
Pero' il flock non funge se apri un file in "w" ...
per esempio, a me non funge:
<?
$fp = fopen("miofile.txt","w");
flock($fp,2);
fwrite($fp,"contenuto del file");
flock($fp,3);
?>
non da errori ma non scrive nulla nel file...
Quando lo apro in append invece funge... mah...
Ciao
Alex

Quando lo apro in append invece funge... mah...
Non so, io l'ho usata in passato sovrascrivendo il file
e funzionava, pero' sono curioso, ora faccio qualche prova
....
....
Da me questo codice funziona, non so cosa dirti. 
Bonf

"Alessio" <(
alessi...@libero.it
)@NOSPAM.tld> wrote in message
news:eAFm8.13199$pT1.3...@news1.tin.it...

Sotto windows puo' avere dei problemi. Leggi nel manual
http://it2.php.net/flock

 records :-)
Anche questo non e' assolutamente cosi (abbiamo sempre problemi
multitasking/threads).
Non puoi garantire l'apertura di un record, la modifica e la loro
chiusura senza che nessun altro processo possa accedere allo stesso
record. Bisogna usare dei LOCK (TABLE ad esempio) per garantire la
funzionalita'.
L'unica cosa che e' garantita ad una 'per connection base' e il valore
del LAST_INSERT_ID dopo una INSERT query (mysql_insert_id()). Se usi
questo ID non hai dei problemi, ma se usi altri metodi (come il MAX(ID)
o ORDER BY DESC LIMIT 1) gli errori sono preprogrammati e veramente
difficile da trovare (perche' con un client funziona tutto).
Questi due elenchi per capire cosa succede con certi tipi di azioni
+----------+----------+----------------
| Client 1 | client 2 |  DB PRIMARY KEY
+----------+----------+----------------
| Insert   | -        |     1
| -        | Insert   |     2
| -        | LAST=2   |
| -        | Insert   |     3
| -        | Insert   |     4
| -        | LAST=4   |
| LAST=1   | -        |
+----------+----------+----------------
+------------+------------+-----------------
| Client 1   | client 2   |
+------------+------------+-----------------
| Insert     | -          |     1
| -          | Insert     |     2
|            | SelectMax=2| Valore ok
| SelectMax=2|            | Valore sbagliato
| UPDATE 2   |            | Record sbagliato aggiornato
+------------+------------+-----------------
L'unico modo giusto e':
ID = int primary auto_increment.
mysql_query("INSERT INTO tbl (ID,...) VALUES ('0',...)");
$id=mysql_insert_id();
mysql_query("UPDATE tbl SET .... WHERE ID=$id");

 mysql_query("UPDATE tbl SET .... WHERE ID=$id");
eheheh ma io faccio sempre così :-)
Ciao
Alex

 eheheh ma io faccio sempre così :-)
ACK, ma come l'hai descritto poteva causare qualche equivoco (e
pericolo) a qualcuno che non sa...
;-)

 ?>
Ottima idea, magari riadatto il codice per inserire i risultati in un DB...
questo lo so fare... ;)))
