Aloitin tänään mysql-tietokannan käytön php:n yhteydessä ja kaikki meni yrityksen ja erehdyksen kautta hyvin, mutta nyt eteeni tuli eteenpääsemätön ongelma. Tässä koodi:
<?php include ("func.php"); $selain = $_SERVER['HTTP_USER_AGENT']; $aika = date("H:i"); $paiva = date("j.n.Y"); @$tulo = $_SERVER['HTTP_REFERER']; @$link = mysql_connect("localhost") or die("MySQL-tietokantaan ei saatu yhteyttä."); mysql_select_db ("stats"); $q = mysql_query("SELECT päivä, ip FROM laskuri") or die("MySQl-haku ei onnistunut."); for ($i = 0;$i < mysql_num_rows($q); $i++) { $ip = mysql_result($q, $i, "ip"); $paiva2 = mysql_result($q, $i, "päivä"); if ($ip == $_SERVER['REMOTE_ADDR']) { if ($paiva2 != $paiva) { $write = 1; } else { $write = 0; } } else { $write = 1; } } if ($write == 1) { $selain = parse_agent($selain); $w = mysql_query("INSERT INTO laskuri (ip, selain, päivä, aika, referer) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$selain."', '".$paiva."', '".$aika."', '".$tulo."')") or die("MySQL-haku ei onnistunut."); } $f = mysql_query("SELECT * FROM laskuri"); echo "Kävijöitä: ".mysql_num_rows($f); mysql_close($link); ?>
Kyseessä on siis laskuri ja se katsoo, lisätäänkö uusi kävijä ip:n ja päivämäärän perusteella. Koodi tosin kirjoittelee ylimääräisiä käyntikertoja, enkä tiedä miksi. Luultavasti vika on php-koodissa, eikä mysql-lausekkeissa. Tuo $write = 1 on aika purkkaviritys, mutta en nyt tähän hätään keksinyt parempaa toteutusta, jos joku tietää niin kertokoon.
Selvennykseksi vielä, että tuo parse_agent()-funktio löytyy tuolta func.php:sta, eikä vika ole tietenkään siinä.
EDIT: Yksi vika jo löytyikin ja päivitin tuon koodin, mutta edelleenkin se laskee liikaa kävijöitä.
if ($ip == $_SERVER['REMOTE_ADDR']) {plaa plaa} else {$write = 1}
Eli siis jos ip ei löydy tietokannasta, niin $write = 1. Mutta kannassa on useita rivejä, jotka käyt for-silmukalla läpi, eli todennäköisesti joka silmukassa pätee:
$ip != $_SERVER['REMOTE_ADDR']
Siis, no en osaa paremmin selvittää, mutta vika on varmaan siinä
Koita vaikka and-operaatiolla joteski:
if ($ip == $_SERVER['REMOTE_ADDR'] && $paiva2 != $paiva) $write = 1;
Sessionit? alkuun session_start() ja for-if-else-if-härpäkkeen tilalle
<?php if (empty($_SESSION['vierailtu'])) { $w = mysql_query("INSERT INTO laskuri (ip, selain, päivä, aika, referer) VALUES ('".$_SERVER['REMOTE_ADDR']."', '".$selain."', '".$paiva."', '".$aika."', '".$tulo."')") or die("MySQL-haku ei onnistunut."); $_SESSION['vierailtu'] == true; } ?>
Jos joku haluaa huijata tuota järjestelmääsi, on se silloin ihan sama tarkastetaanko uniikit käynnit ip:stä vai sessioneista. Jos jaksaa sulkea ja avata selaimen, jaksaa myös vaihtaa ip:n huijauksissa.
EDIT: ALTER TABLE laskuri CHANGE päivä päivä DATETIME NOT NULL
+ http://www.mysql.com manuaalista DATE_FORMAT sekä NOW()...
Aihe on jo aika vanha, joten et voi enää vastata siihen.