Witajcie, problem mam niby prosty - napisać licznik, który pokaże liczbę osób on-line, odsłon, unikalnych wizyt ogółem, wczoraj i dziś. Całość ma działać w oparciu o IP. Oto kod:
<?php
if (!mysql_connect('127.0.0.1', 'root', 'vertrigo')){ //łaczymy z bazą die('<h4 class="error">Brak połączenia z bazą, spóbuj później</h4>');
}
$dzis = time()-(24
*3600
); $ip = $_SERVER['REMOTE_ADDR'];
$zapyt = "INSERT INTO licznik(ip,data) VALUES('$ip','$czas')"; //dodajemy ip + czas
$zapyt = "UPDATE licznik2 SET odslon=odslon+1"; //powiększamy liczbę odsłon
$zapyt = "SELECT ip FROM licznik WHERE ip='$ip'AND data>'$dzis'";
if($num==1){ //licznik unikalnych + kasowanie starych
$zapyt = "UPDATE licznik2 SET wizyt=wizyt+1";
$roznica = time()-(48
*3600
); //usuwamy dane starsze niż 48 godzin $zapyt = "DELETE FROM licznik WHERE data<'$roznica'";
}
//wyswietlamy co trzeba
$zapyt = "SELECT wizyt,odslon FROM licznik2";
foreach($row as $linia){
$licznik[] = $linia;
}
$zapyt = "SELECT count(DISTINCT ip)
FROM licznik WHERE data>$dzis";
$licznik[2] = $row['count(DISTINCT ip)'];
$zapyt = "SELECT count(DISTINCT ip)
FROM licznik WHERE data<$dzis";
$licznik[3] = $row['count(DISTINCT ip)'];
$zapyt = "SELECT count(DISTINCT ip)
FROM licznik WHERE data>$online";
$licznik[4] = $row['count(DISTINCT ip)'];
echo '<p>wizyt: '.$licznik[0].'</p> <p>odslon: '.$licznik[1].'</p>
<p>dzis: '.$licznik[2].'</p>
<p>wczoraj: '.$licznik[3].'</p>
<p>online: '.$licznik[4].'</p>
';
?>
1. Zrobiłem dwie tabele - jedna zawiera ip+czas, druga liczbę odsłon oraz wizyt - czy lepiej byłoby to upchać w jednej tabeli? A jeśli tak to jak? Jak powinienem ustawić pola? INT(11) dla czasu i VARCHAR(15) dla ip są optymalne czy niezbyt?
2. Zastanawiam się, czy nie można by połączyć tych zapytań (np. UNIONEM), i czy miałoby to znaczący wpływ na wydajność?
3. Czy koncepcja jaką obrałem jest słuszna, czy można by to jakoś usprawnić. Licznik ma chodzić na okrągło, więc zależy mi bardzo na wydajności.
Ten post edytował Pilsener 22.03.2008, 15:58:08