Newsgroup: it.comp.www.php
Titolo: Problema di contatori

Ciao a tutti,
ho realizzato un semplice contatore, il cui conteggio viene memorizzato in 
un database mysql. Funziona alla perfezione, e sono soddisfatto.
Il problema č nel momento in cui sul sito internet si collegano piů utenti 
(ad esempio N), il contatore continua a contare perň ciascun utente vede 
tale contatore incrementarsi con passo di N.
Ad esempio,
a) se sul sito ci sono collegati 1 solo utente avremo:
contatore = 1,2,3,4,5,6 etc
b) se sul sito ci sono collegati 2  utenti avremo:
contatore = 2,4,6,8,10,12 etc
c) se sul sito ci sono collegati 3  utenti avremo:
contatore = 3,6,9,12,15,18 etc
ora, come risolvo questo problema? č chiaro che non č un problema del 
contatore in se, dal momento che il conteggio lo fa correttamente, ma in 
caso di piů utenti connessi, conta per tutti gli utenti in quel momento 
connessi, e quindi ciascun utente visualizza il passo in base al numero di 
utenti connessi.
Il mio obiettivo č, indipendentemente dal numero di utenti connessi, far si 
che il contatore conti sempre con passo di 1, ovvero come nel caso (a).
Ripeto come rimedio a ciň?
Grazie in anticipo,
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 contatore = 3,6,9,12,15,18 etc
mi sfugge il motivo per cui ti serve una cosa del genere, ma potresti
risolvere con una sessione.
salvi un id temporaneo e lo usi come chiave:
update contatore set hit = hit +1 where uid = ".(int)$_SESSION['temp_key']."
select hit from contatore where uid = ".(int)$_SESSION['temp_key']."
-- 
una volta qui era tutto <table>


Ti ringrazio per la tempestiva risposta, ma non ho ben capito come dovrei 
operare, per completezza, ti riporto il codice attualmente usato per il 
conteggio:
               $field = @mysql_query ("SELECT * FROM mycounter WHERE id=1");
               if (@mysql_num_rows ($field) == 0) {
                 $result = @mysql_query ("INSERT INTO `mycounter` ( 
`counter` ) VALUES ( 0 )");
                 $counter = 0;
          } else {
                 while ($ch = @mysql_fetch_array ($field)) {
                   $counter = $ch[counter] + 1;
                  }
                 $field = @mysql_query ("UPDATE mycounter SET counter = 
$counter WHERE id=1");
    }
la struttura del contatore č la seguente:
CREATE TABLE IF NOT EXISTS `mycounter` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
    `counter` INT UNSIGNED DEFAULT '1' NOT NULL,
    PRIMARY KEY ( `counter` ) ,
     INDEX ( `id` ))
Come dovrei modificare il codice da me scritto tenendo conto di quanto mi 
hai suggerito?
Grazie ancora per la pazienza.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

 Ripeto come rimedio a ciò?
Potresti provare definendo un tempo minimo che deve passare tra due
incrementi successivi.
'bye

 
dal momento che hai già un id impostato il db non cambia, devi solo passare
quell "1" attraverso una sessione che colleghi a ogni pagina con 
session_start()
http://php.net/session
in questo modo otterrai che utente x avrà id = 1, utente y id = 2 e così
via.
se non è così che ti serve puoi aggiungere una colonna al db e poi
utilizzando lo stesso stratagemme farai una query del tipo:
select counter from mycounter where id = 1 and user = $_SESSION['id_user']



Vorrei provare a seguire questa strada ma ho solo un problema quale valore 
assumerà: $_SESSION['id_user'] ? Immagino quello assunto da $id_user, ma io 
non ho questa variabile.
Provo a spiegarmi meglio fornendo ulteriori dettagli.
L'obiettivo che mi sono posto è realizzare un visualizzatore di banner a 
rotazione, in altre parole, supposto che abbia 3 banner,  ogni utente, a 
intervallo di 30 secondi (mediante tag refresh) visualizza i banner 
nell'ordine: 1,2,3,1,2,3,1,2,3,1,2,3,1 e cosi via.
E questo funziona bene se a essere collegato vi è un solo utente.
Se gli utenti sono ad esempio due, abbiamo:
utente1: 1,3,2,1,3, etc
utente2: 2,1,3,2,1, etc
se sono 3 invece abbiamo:
utente1: 1,1,1, etc
utente2: 2,2,2, etc
utente3: 3,3,3, etc
(in questo caso ogni utente visualizzerebbe lo stesso banner) se sono 
quattro gli utenti avremo:
utente1: 1,2,3, etc
utente2: 2,3,1, etc
utente3: 3.1,2, etc
utente4: 1.2,3, etc
ora il problema è proprio questo, che la sequenza deve essere uguale per N 
utenti, e cioè tutti gli N utenti devono visualizzare i banner nella loro 
sequenza: 1,2,3,1,2,3,1,2,3 e cosi via.
Ciò premesso nasce spontanea la domanda di prima, in base a quale criterio 
assegno un valore a: $_SESSION['id_user'] dal momento che non so a priori 
quanti utenti sono connessi in un dato momento?
Grazie ancora per la pazienza.
Cooper.
-- 
www.blueware.it
www.italchat.it
 

ah beh, ma allora è molto più semplice,
io avevo fatto un cosino del genere un po' di tempo fa:
<?php
function shot(){
/*
usage: include this page with include($your_path_to_this_file."shot.php");
use the function shot() here or in the layout template
add as many $shot_[] = "your text"; as you want.
it will show each content once in random mode (looking if an item has
already been shown).
later, when all the item will be shown it will display the item in random
mode.
*/
session_start();
$shot_   = array();
$shot_[] = "test0";
$shot_[] = "test1";
$shot_[] = "test2";
$shot_[] = "test3";
$shot_[] = "test4";
$shot_[] = "test5";
$shot_[] = "test6";
$shot_[] = "test7";
$shot_[] = "test8";
$shot_[] = "test9";
    global $shot_;
    $rand_shot = array_rand($shot_);
if($_SESSION['shot'] == ""){
    //print("Start\n");
    $_SESSION['shot'] = array();
    $_SESSION['shot'][$rand_shot] = $rand_shot;
}
elseif(count($shot_) > count($_SESSION['shot'])){
    while(array_key_exists($rand_shot, $_SESSION['shot']) == true){
        $rand_shot = array_rand($shot_);
        //print("{$rand_shot} continue...\n");
    }
        $_SESSION['shot'][$rand_shot] = $rand_shot;
}
    //print("orig: ".count($shot_)." taken: ".
count($_SESSION['shot'])."\n\n\n\n");
    //print_r($_SESSION['shot']);
    return $shot_[$rand_shot];
}
//  print("<pre>");
      //  shot();
//  print("</pre>");
?>


Penso di aver capito il concetto del codice, però non ho chiaroancora una 
volta come applicarlo nel mio caso :(((( se hai compreso il problema, e non 
ti chiedo troppo, potresti gentilmente effettuarmi le modifiche al codice 
direttamente?
Il codice in questione è il seguente:
              .....
              .....
              .....
            $result = @mysql_query ("CREATE TABLE IF NOT EXISTS 
`italchat_rotbanner_counter` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
`counter` INT UNSIGNED DEFAULT '1' NOT NULL, PRIMARY KEY ( `counter` ) , 
INDEX ( `id` ))");
            if ($result) {
               $field = @mysql_query ("SELECT * FROM 
italchat_rotbanner_counter WHERE id=1");
               if (@mysql_num_rows ($field) == 0) {
                 $result = @mysql_query ("INSERT INTO 
`italchat_rotbanner_counter` ( `counter` ) VALUES ( 0 )");
                 $counter = 0;
          } else {
                 while ($ch = @mysql_fetch_array ($field)) {
                   $counter = $ch[counter] + 1;
                  }
                 $field = @mysql_query ("UPDATE italchat_rotbanner_counter 
SET counter = $counter WHERE id=1");
    }
     } else {
               $error = 103;
     }
              .....
              .....
              .....
almeno cerco di capire meglio nella pratica come dovrei comportarmi in una 
situazione del genere.
Confido nella tua disponibilità.
Grazie mille ancora,
Cooper.
-- 
www.blueware.it
www.italchat.it
 

semplicemente, non hai più bisogno di un database. quando l'utente abbandona
il sito la sessione decade e quindi con essa tutti gli array collegati.
ma fintanto che l'utente è collegato la funzione fornirà i valori espressi
nell'array.

 ha scritto nel messaggio 
news:Z_Kyg.56623$zy5.1...@twister1.libero.it...

Non ti seguo :((((( ti secchi se ti chiedo di riscrivermi il codice secondo 
il suggerimento che mi avevi dato inizialmente ovvero aggiungendo un 
ulteriore campo alla tabella etc? Mi interessa a questo punto capire meglio 
il tutto.
Sempre se ti va, cmq grazie mille ancora per la tua disponibilità.
Cooper.
-- 
www.blueware.it
www.italchat.it
-- 
www.blueware.it
www.italchat.it
 

 
non ho tempo ora per scriverti la funzione, ma credo veramente che sia molto
propedeutico per te trovare la soluzione.
fai dei test, decommenta quella che ti ho postato io, e vedi cosa capita.
leggi anche cosa sono le sessioni sul sito php.
coraggio che ti fai le ossa


contatore in se, dal momento che il conteggio lo fa correttamente
A me pare invece proprio che non conteggi correttamente. In realta' mi
pare che usare MySQL non sia una soluzione adatta; per farla diventare
adatta gli devi aggiungere ulteriore codice, che e' poi quello che, da
solo, basterebbe a risolvere il problema.
Quella adatta, ripeto, mi pare, e' di usare una sessione e memorizzare
il contatore incrementandolo ogni volta.
	<?php
		session_start(); // Richiede supporto cookie
		if (!isset($_SESSION['counter']))
			$_SESSION['counter'] = 0;
		$_SESSION['counter']++;
		// ...qui usi $_SESSION[counter] come vuoi,
		// per es. ($_SESSION['counter']%$N) da' un
		// numero compreso fra 0 e $N-1, a rotazione.
	?>
Leonardo che poi magari si sbaglia
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?