Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL aloittelijan ongelma

Turambar [20.01.2004 18:32:38]

#

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ä.

ajv [20.01.2004 19:15:01]

#

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;

leftover [21.01.2004 08:35:20]

#

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()...

Vastaus

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

Tietoa sivustosta