Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: MySQL kävijälaskuri

Miko [24.04.2002 13:25:08]

#

Jep... Eli MySQL kävijälaskuri.

Tämä scripti tallentaa MySQL: ään tietoa kävijöistä, ja näyttää montako kävijää sivulla on ollut. Scripti ei tallenna kävijän tietoja, jos MySQL kannasta löytyy jo vastaava IP osoite, kuin kävijän IP.

Vaatii MySQL: än.

Asennusohjeet:
1. Tee tietokanta MySQL palvelimelle, jos sitä ei valmiiksi jo ole olemassa.
2. Lisää ensimmäisestä listauksesta koodi MySQL: ään.
3. Tallenna listaus 2. Tiedostonimenä functions.php
4. Tallenna listaus 3. Tiedostonimenä visitors.php
5. Vaihda functions.php tiedoston $host, $pass, $db ja $user muuttujien arvoja.
6. Lisää sivuillesi koodi listauksesta 4

Taulun luonti:

CREATE TABLE userinfo(id INT NOT NULL AUTO_INCREMENT,
		PRIMARY KEY(id),
		ip VARCHAR(255),
		host VARCHAR(255),
		time INT,
		referer VARCHAR(255),
		agent VARCHAR(255)
);

CREATE TABLE visits(id INT NOT NULL AUTO_INCREMENT,
		PRIMARY KEY(id),
		visits INT
);

functions.php:

<?php
$link;
$host = "xxx";   # Osoite MySQL serveriin
$user = "xxx";  # Käyttäjänimi MySQL: ään
$pass = "xxx"; # Salasana MySQL: ään
$db = "xxx";   # Mikä tietokanta valitaan?

function db() {
        global $link, $host, $user, $pass, $db;
        $link = mysql_connect($host, $user, $pass) or die ("Ei voitu yhdistää MySQL tietokantaan: ".mysql_error());
        mysql_select_db($db, $link) or die ("Ei voitu valita tietokantaa <i>$db</i>");
}

function dbclose() {
        global $link;
        mysql_close($link);
}

function saveStats() {
        global $link, $HTTP_USER_AGENT, $REMOTE_HOST, $REMOTE_ADDR, $HTTP_REFERER;
        $update;
        db();
        $r = mysql_query("SELECT * FROM userinfo", $link);
        while( $ro = mysql_fetch_array($r, $link) ) {
                if( $ro['ip'] ==@$REMOTE_ADDR ) {
                        $update = 1;
                }
        }
        if( $update !="1" ) {
                $res = mysql_query("SELECT visits FROM visits", $link);
                $row = mysql_fetch_array($res, $link);
                $visitit = $row[visits]+1;
                $que = "UPDATE visits SET visits=$visitit";
                $resul = mysql_query($que, $link);
                $time = mktime();
                $host = @gethostbyaddr($REMOTE_ADDR);
                $ip = @$REMOTE_ADDR;
                $agent = @$HTTP_USER_AGENT;
                $referer = @$HTTP_REFERER;
                $query = "INSERT INTO userinfo(ip, host, agent, referer, time) VALUES('$ip', '$host', '$agent', '$referer', '$time')";
                $resultti = mysql_query($query, $link);
        }
        dbclose();
}
?>

visitors.php, kävijän tietojen näyttäjä

<?php
include ("functions.php");
db();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Kävijät</title>
</head>
<body>
<?php
if( empty($id) ) {
        $resultti = mysql_query("SELECT * FROM visits", $link) or die("Virhe: ".mysql_error());
        $rowwi = mysql_fetch_array($resultti, $link);
        print "<p>Sivuilla on ollut $rowwi[visits]  kävijää</p>\n";
        $r = mysql_query("SELECT ip, id FROM userinfo", $link);
        while( $row = mysql_fetch_array($r) ) {
                print "<p><a href=\"visitors.php?id=$row[id]\">$row[ip]</a></p>\n";
        }
}

if( ! empty($id) ) {
        $result = mysql_query("SELECT * FROM userinfo WHERE id=$id", $link);
        $rivi = mysql_fetch_array($result);
        print "<p>Host: $rivi[host]</p>\n";
        print "<p>IP: $rivi[ip]</p>\n";
        print "<p>User Agent: $rivi[agent]</p>\n";
        print "<p>Kellon aika: ";
        print date("j.m.Y H:i:s", $rivi[time]);
        print "</p>\n";
        print "<p>Referer: $rivi[referer]</p>\n";
        print "<a href=\"$HTTP_REFERER\">Takaisin</a>\n";
}
dbclose();
?>
</body>
</html>

Käyttö omilla sivuilla

<?php
include ("functions.php");
saveStats();
?>

joku vaan [26.04.2002 20:50:32]

#

Ihan kiiva..olisin itekkin osannu teha mut ei ollu aikaa ni lunttasin sulta!muista v^^^^ k^^^^^!!jesss!

JohnDoe [24.07.2002 15:02:08]

#

Jos nyt pidetään IP osoitetta relatiivisena yhtäänminkään mittana niin mainittakoon että @ saa käyttää ethän mysql_queryn edessä ethän halua jäädä vakoilusta kiinni housut jalassa jos ongelmia.

Kannattaa myös huomioida, että soittosarjoja käyttävät(>70%) saavat usein samoja IP osoitteita. Myös proxyn tai NATin takaa selaavat saavat vain yhden IP:n. Tällöin avuksi tulee HTTP_X_FORWORDED_FOR, jolla saat NAT/proxyn takaisen IP:n. Huomaa kuitenkin ettei tällöinkään tule jättä REMOTE_ADDR huomitta sillä esim. NATin takana suositaan privaatti verkko-osoitteita. On siis syytä kirjata lokiin molemmat.

Saattaa olla myös hauska seurata linkityksia sivuillesi, jolloin HTTP_REFERER on kiva lisä tallentaa, mutta tuskin halua kaikkia omien sivujesi ristiin linkityksiä seurata joten ota ne pois asettamalla sivusi osoita neulaksi ja referer heinäkasaksi. Huomaa vielä että JavaScript käytää referer istä muotoa referrer. Saattaa sekottaa :)

JohnDoe [24.07.2002 15:14:02]

#

http://www.mureakuha.com/code/PHP/357/IP
On varsin nokkela todellisen ip hakia koodi joka ei tosin huomio NAT/proxy ongelmaa, mutta on tulys lytätty arvioineissa lähelle 1. Noo vissiin täällä ei mitään todellis koodaamista harrasteta,

anteeksi häiriö

solonen [25.04.2008 10:06:27]

#

tota ei toiminut mulla tämä koodi enää tänävuonna :P
errorit

Warning: mysql_fetch_array(): The result type should be either MYSQL_NUM, MYSQL_ASSOC or MYSQL_BOTH. in /var/www/virtual/verkkopalvelin.net/htdocs/functions.php on line 25

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta