Verständnissproblem! Warum werden mehrere Datensätze gespeichert?

mr_floppy

Mitglied
Hi,

ich habe eine Function die Besucher in der DB speichert. Aus irgendeinem Grund werden manche Besucher doppelt und dreifach eingetragen. Die Datensätze haben auch genau den gleichen Timestamp. Die function prüft eigtl, ob der Besucher schon mal da war. Ich verstehs nicht so ganz. Hier mal mein Code, viell. kann mir jemand sagen was da los ist.

PHP:
function visit()
{
	$ip = getenv("REMOTE_ADDR");
	$referer = getenv("HTTP_REFERER");
	$host = gethostbyaddr($ip);
	$date = time();
	$query1 = "SELECT ip FROM visits WHERE ip = '$ip'";
	$sql1 = mysql_query($query1);
	if (mysql_num_rows($sql1) == 0)
	{
		$query = "INSERT INTO visits (ip, host, referer, date) VALUES (\'$ip\', \'$host\', \'$referer\', \'$date\')";
		$sql = mysql_query($query);
		if (!$sql)
		{
			echo mysql_error();
		}
	}
}

Schönen Sonntag Abend wünsche ich noch!
 
Moin,

in dem Code lässt sich da eigentlich nichts entdecken, was das erklärt.

Es gäbe aber eine Variante, welche das todsicher abstellt und obendrein noch das SELECT einspart...deklariere ip als UNIQUE ;)
 
Das Problem hatte ich auch schonmal, ich habe auch Benutzer angelegt. Allerdings wurden ab und zu, eigentlich ziemlich häufig, die Benutzer doppelt angelegt, ich habe erst gedacht, dies liegt daran, das die Benutzer zu ungeduldig sind und die Seite zweimal aufrufen oder soetwas in der Art. Daraufhin habe ich dieses unterbunden mit Sessions und einigen Sachen die ich so im Internet gefunden habe, allerdings wurde das Problem nicht gelöst, ich habe keine Ahnung woran es liegt und bis jetzt auch noch keine Lösung gefunden.

Auch die Lösung mit dem UNIQUE kann ich bei mir nicht realisieren.
 
[...]
Auch die Lösung mit dem UNIQUE kann ich bei mir nicht realisieren.

Warum? Mir fällt kein Grund ein, warum man das nicht so machen könnte.


[...]
ich habe keine Ahnung woran es liegt und bis jetzt auch noch keine Lösung gefunden.
[...]
Ich kann falsch liegen, aber mysql_num_rows() liefert, falls die Query erfolgreich war und eine SELECT-Anweisung war immer einen Wert >= 1 zurück. Falls halt kein Datensatz selektiert wurde, dann liefert mysql "null" zurück, was auch ein Satz ist. Bin mir zwar nicht sicher, aber so etwas hatte ich auch schon mal.

Rufe den Datensatz direkt ab, und schau ob er NULL ist..

Eine andere Möglichkeit wäre ein "REPLACE INTO" anstatt deines INSERT INTOs. Versuchs mal mit denen.

Referenzen:
MySQL: REPLACE INTO

Gruß
Bratkartoffel
 
Warum? Mir fällt kein Grund ein, warum man das nicht so machen könnte.

Bei mir ist das Problem, dass ich User in eine Datenbank speichere, auf der einen Seite funktioniert das UNIQUE, der User wird nur einmal angelegt, allerdings lege ich im gleichen Skript einen User für mein Forum/Portal an. Dieser wird doppelt angelegt, da will ich nicht in den Datenbankstrukturen rumwursteln, wer weiß was ich dann wieder alles anpassen muss. Außerdem gehen von dem Skript noch einige andere Sachen aus, wo ich keine IP habe die ich UNIQUE setzen kann und auch sonst kein Feld. Auch diese Dinge werden doppelt angelegt und ausgeführt.

Bin mal gespannt ob das REPLACE INTO funktioniert, das ganze ist aber schon ein lustiges Phänomen.
 
@DarkRanger:

vielleicht solltest du dann mal deine DB-Struktur überdenken und überprüfen, welche Skripte dort alles "herumwurschteln" :eek:

So, wie du es beschrieben hast und wie man es deinem Skript entnehmen kann, soll jede IP nur 1x in der Tabelle vorkommen...und das macht UNIQUE.
 
Ich speichere einen User nicht anhand seiner IP. Aber wir sollten wieder zum Problem des Threadstellers zurückkehren ^^
Bin im Moment eh an einem anderen Problem dran.

Ich denke bei dem Problem könnte das UNIQUE eine Lösung sein oder auch das REPLACE INTO, allerdings ist die Frage, warum er einen Datensatz anlegt, der genau den gleichen Timestamp besitzt, das finde ich schon ein wenig komisch.
 
allerdings ist die Frage, warum er einen Datensatz anlegt, der genau den gleichen Timestamp besitzt, das finde ich schon ein wenig komisch.

Das ist schon mehr als komisch, dein Skript tut dies allerdings nicht, es ist jedenfalls nichts ersichtlich, was dies tun würde...eigentlich gäbe es als logische Erklärung nur, dass die Funktion von mehreren Stellen aufgerufen wird, und jeweils zwischen SELECT und INSERT genug Zeit liegt, um diese Mehrfacheinträge zu Ermöglichen.
 
Hi,

eigentlich gäbe es als logische Erklärung nur, dass die Funktion von mehreren Stellen aufgerufen wird, und jeweils zwischen SELECT und INSERT genug Zeit liegt, um diese Mehrfacheinträge zu Ermöglichen.

Das hab ich mir auch schon gedacht und auch gesucht. Es werden nur 2 Variablen am Anfang des Scripts deklariert gefolgt von dem Functionsaufruf.

Kannst du mal zeigen wie diese Funktion aufgerufen wird?

Einfach nur:
visit();

Ich ziehe mir gleich mal ein Backup und probiere es mit UNIQUE. Ich hoffe man kann das nachträglich ändern, ohne Datenverlust.
 
Zurück