rodney rehm: Denkfehler im PHP-Script

Beitrag lesen

was passiert wenn eine ID übergeben wird die es nicht gibt?

if(isset($id)) {
$count = mysql_query("SELECT * FROM links WHERE id = '$id'");
$wert = mysql_fetch_row($count);

übergeben wurde $id = 0;
raus kommt $wert = false;

$ip_alt = $wert[5];

da nicht geprüft wurde ob $wert false oder ein array ist,
ist $ip_alt = null;
(oder was weiss ich was...)

$ip_neu = getenv("REMOTE_ADDR");
$link = $wert[1];

if ($ip_alt != $ip_neu)
{
  $hits = $wert[4]; $hits++;
  $update="REPLACE INTO links SET id = '$wert[0]', url = '$wert[1]', name = '$wert[2]', text = '$wert[3]', klicks = '$hits', ip = '$ip_neu'";

der replace ist dran schuld, dass du neue datensätze bekommst... da kein alter überschrieben werden kann weil der primary_key (in deinem fall wohl ID) nicht existiert, wird ein neuer datensatz angelegt..
vielleicht solltest du hier lieber UPDATE statt REPLACE INTO benutzen...

mysql_query($update) OR DIE(" ".mysql_error());
}

header("Location: $link");
exit;
}

Tabelle links:
id  url          name   text   klicks  ip
1   www.url1.de  name1  text1  10      297.145.45.158
2   www.url2.de  name2  text2  256     209.167.50.22
3   www.url3.de  name3  text3  5       62.155.239.248

nächstes mal bitte angeben was dein primary_key ist... da dieser für das verhalten von REPLACE INTO ausschlaggebend ist!

abgesehen davon verstehe ich dein IP-handling nicht so ganz...
was passiert wenn...
User 1 (IP: 1.1.1.1) klickt link_1 an.. IP wird auf 1.1.1.1 gesetzt.
User 1 kann den link nicht erneut anklicken...
klickt nun User 2 (IP: 2.2.2.2) auf link_1 wird die IP auf 2.2.2.2 gesetzt...
jetzt kann doch User 1 wieder den link anklicken, da er eine andere IP hat als die, die in der datenbank gespeichert wurde...
(und ja... das kann (und wird) innerhalb von sekunden passieren...)

eben genanntes problem kannst du aber nur über eine weitere tabelle lösen... IP und SERVERZEIT speichern... und schauen ob diese IP innerhalb der letzten 4h gespeichert wurde... wenn ja wird der klick nicht gezählt... (datensätze die älter as 4h sind, können gelöscht werden... (vielleicht ab und an nen OPTIMZE TABLE laufen lassen ;)))

HTH,
Rod