Antworten auf deine Fragen:
Neues Thema erstellen

Topliste programmieren (MySQL, PHP)

Mew

Aktives Mitglied

Hey Leute!

Ich bin gerade dabei eine Topliste zu programmieren und habe einen totales Denk-, bzw. Logikproblem gerade.
Und zwar wenn jemand auf einen Link klickt z.B.
Soll geschaut werden, ob der Besucher schon einmal innerhalb der letzten 24h auf diesen Link (ID = XXX) geklickt hat, wenn JA dann soll nicht hochgezählt werden, wenn NEIN dann schon.

Nun habe ich mir folgendes zusammen geproggt:

PHP:
if($_GET["out"] != ""){

	$outID = $_GET["out"];
	$SQL3 = "SELECT * FROM topliste WHERE ID = '". $outID ."'";
	$Query3 = mysql_query($SQL3);
	$URLADRESSE = mysql_result($Query3, 0, 'URL');
	$OUT = mysql_result($Query3, 0, '_OUT');
	$OUT += 1;
	$NUM3 = mysql_num_rows($Query3);
	
	if($NUM3 != 0){
	
	$Zeitsperre = time()-60*60*24;
	
	$SQL11 = "SELECT * FROM topliste_ips_out WHERE IP = '". $_SERVER['REMOTE_ADDR'] ."' AND ID != '". $outID ."'";
	$Query11 = mysql_query($SQL11);
	$Num11 = mysql_num_rows($Query11);
	
	if($Num4 == 0){
		
		$IP = $_SERVER['REMOTE_ADDR'];
		$Zeit = time();
		$Referer = $_SERVER['HTTP_REFERER'];
	
		$SQL5 = "INSERT INTO topliste_ips_out (IP, ID, Zeit) VALUES ('". $IP  ."', ". $outID .", '". $Zeit ."')";
		$Query5 = mysql_query($SQL5) or die(mysql_error());
	
		$SQL6 = "UPDATE topliste SET _OUT = '". $OUT ."' WHERE ID = '". $outID ."'";
		$Query6 = mysql_query($SQL6) or die(mysql_error());
		
		$Speichersperre = time()-60*60*48; //Löscht alle Einträge, die älter als 48h sind.
		
		$SQL7 = "DELETE FROM topliste_ips_out WHERE ZEIT < ". $Speichersperre .""; 
		$Query7 = mysql_query($SQL7);
		
		header("Location: ". $URLADRESSE ."");
		exit;
		
		}
		

	
	}

Nunja^^ was soll ich sagen, er zählt immer weiter hoch. Ich würde mal sagen dort ist ein bisschen was durcheinander gekommen bei mir.
Hoffentlich kann mir einer von euch meinen Logikfehler sagen ^^ :)

Vielen Dank schon mal ;)

Viele Grüße Mew
 

S

sgij575a8h

Guest

AW: Topliste programmieren (MySQL, PHP)

Hi, also ich hab mir mal dein Script angeschaut, und habe mir mal eine verbesserte Version überlegt... Is leider ungeprüft, da ich hier grad keinen Webserver zum testen habe.

PHP:
if(isset($_GET["out"])){ 

    $outID = intval($_GET["out"]); //Dass auch wirklich NUR Zahlen entgegengenommen werden, dient der sicherheit 
    
$urlQuery = "SELECT * FROM topliste WHERE ID = '". $outID ."'"; 
    $urlResult = mysql_query($urlQuery); 
    $destURL = mysql_result($urlResult, 0, 'URL'); 

    $OUT = mysql_result($Query3, 0, '_OUT'); 
    $OUT += 1; 
    $NUM3 = mysql_num_rows($Query3); 
     
    if($NUM3 != 0){ 
     
    $Zeitsperre = time()-60*60*24; 
     
    $SQL11 = "SELECT * FROM topliste_ips_out WHERE IP = '". $_SERVER['REMOTE_ADDR'] ."' AND ID != '". $outID ."'"; 
    $Query11 = mysql_query($SQL11); 
    $Num11 = mysql_num_rows($Query11); 
     
    if($Num4 == 0){ 
         
        $IP = $_SERVER['REMOTE_ADDR']; 
        $Zeit = time(); 
        $Referer = $_SERVER['HTTP_REFERER']; 
     
        $SQL5 = "INSERT INTO topliste_ips_out (IP, ID, Zeit) VALUES ('". $IP  ."', ". $outID .", '". $Zeit ."')"; 
        $Query5 = mysql_query($SQL5) or die(mysql_error()); 
     
        $SQL6 = "UPDATE topliste SET _OUT = '". $OUT ."' WHERE ID = '". $outID ."'"; 
        $Query6 = mysql_query($SQL6) or die(mysql_error()); 
         
        $Speichersperre = time()-60*60*48; //Löscht alle Einträge, die älter als 48h sind. 
         
        $SQL7 = "DELETE FROM topliste_ips_out WHERE ZEIT < ". $Speichersperre ."";  
        $Query7 = mysql_query($SQL7); 
         
        header("Location: ". $URLADRESSE .""); 
        exit; 
         
        } 
         

     
    }
 

Mew

Aktives Mitglied

AW: Topliste programmieren (MySQL, PHP)

Hey, danke für deine Antwort :)

Waren ein paar Variablen falsch bennant. So stimmen die Variablen:

PHP:
if(isset($_GET["out"])){ 

    $outID = intval($_GET["out"]); //Dass auch wirklich NUR Zahlen entgegengenommen werden, dient der sicherheit 
    
	$urlQuery = "SELECT * FROM topliste WHERE ID = '". $outID ."'"; 
    $urlResult = mysql_query($urlQuery); 
    $destURL = mysql_result($urlResult, 0, 'URL'); 

    $OUT = mysql_result($urlResult, 0, '_OUT'); 
    $OUT += 1; 
    $NUM3 = mysql_num_rows($urlResult); 
     
    if($NUM3 != 0){ 
     
    $Zeitsperre = time()-60*60*24; 
     
    $SQL11 = "SELECT * FROM topliste_ips_out WHERE IP = '". $_SERVER['REMOTE_ADDR'] ."' AND ID != '". $outID ."'"; 
    $Query11 = mysql_query($SQL11); 
    $Num11 = mysql_num_rows($Query11); 
     
    if($Num4 == 0){ 
         
        $IP = $_SERVER['REMOTE_ADDR']; 
        $Zeit = time(); 
        $Referer = $_SERVER['HTTP_REFERER']; 
     
        $SQL5 = "INSERT INTO topliste_ips_out (IP, ID, Zeit) VALUES ('". $IP  ."', ". $outID .", '". $Zeit ."')"; 
        $Query5 = mysql_query($SQL5) or die(mysql_error()); 
     
        $SQL6 = "UPDATE topliste SET _OUT = '". $OUT ."' WHERE ID = '". $outID ."'"; 
        $Query6 = mysql_query($SQL6) or die(mysql_error()); 
         
        $Speichersperre = time()-60*60*48; //Löscht alle Einträge, die älter als 48h sind. 
         
        $SQL7 = "DELETE FROM topliste_ips_out WHERE ZEIT < ". $Speichersperre ."";  
        $Query7 = mysql_query($SQL7); 
                  
        } 
         
	header("Location: ". $destURL .""); 
    exit; 
    }  
}

Leider wird immernoch hochgezählt :( Es soll ja nur einmal innerhalb von 24h pro Besucher IP auf dem jeweiligen Link hochgezählt werden. Also wenn man auf Banner 1 klickt soll Banner 1 eine Zahl höher bekommen und wenn man auf Banner 2 danach klickt dann Banner 2 eins höher und wenn man dann auf Banner 1 klickt soll (innerhalb von 24h) nicht mehr hochgezählt werden.
 

Syrakos

Senior Consultant

AW: Topliste programmieren (MySQL, PHP)

Wenn "$OUT += 1;" der Zähler ist der hochgezählt wird ist das auch klar, der wird bei jedem Durchlauf anhand der Abfrage aus der DB hochgezählt und dann wieder in die DB geschrieben.

Du musst vor dem Schreiben in die DB überprüfen ob der Wert erhöht werden darf oder nicht.

Mir ist auch noch aufgefallen, dass $Num4 abgefragt wird, aber wo wird die gesetzt?
 
Zuletzt bearbeitet:

Mew

Aktives Mitglied

AW: Topliste programmieren (MySQL, PHP)

Wenn "$OUT += 1;" der Zähler ist der hochgezählt wird ist das auch klar, der wird bei jedem Durchlauf anhand der Abfrage aus der DB hochgezählt und dann wieder in die DB geschrieben.

Du musst vor dem Schreiben in die DB überprüfen ob der Wert erhöht werden darf oder nicht.

Mir ist auch noch aufgefallen, dass $Num4 abgefragt wird, aber wo wird die gesetzt?

Der sollte aber nur hochzählen wenn auch die QUERY ausgefürht wird und das wird erst gemacht, wenn der Eintrag noch nicht vorhanden ist... siehe Quelltext, jedoch könnte da ein Logikfehler drin sein xD und den finde ich nicht.

Danke, die Variable muss noch umbenannt werden.

Aktueller Quelltext, der richtiger sein sollte aber nicht klappt:

PHP:
if(isset($_GET["out"])){ 

    $outID = intval($_GET["out"]); //Dass auch wirklich NUR Zahlen entgegengenommen werden, dient der sicherheit 
    
    $urlQuery = "SELECT * FROM topliste WHERE ID = '". $outID ."'"; 
    $urlResult = mysql_query($urlQuery); 
    $destURL = mysql_result($urlResult, 0, 'URL'); 

    $OUT = mysql_result($urlResult, 0, '_OUT'); 
    $OUT += 1; 
    $NUM3 = mysql_num_rows($urlResult); 
     
    if($NUM3 != 0){ 
     
    $Zeitsperre = time()-60*60*24; 
     
    $SQL11 = "SELECT * FROM topliste_ips_out WHERE IP = '". $_SERVER['REMOTE_ADDR'] ."' AND ID == '". $outID ."' AND Zeit < ". $Zeitsperre  .""; 
    $Query11 = mysql_query($SQL11); 
    $Num11 = mysql_num_rows($Query11); 
     
    if($Num11 == 0){ 
         
        $IP = $_SERVER['REMOTE_ADDR']; 
        $Zeit = time(); 
        $Referer = $_SERVER['HTTP_REFERER']; 
     
        $SQL5 = "INSERT INTO topliste_ips_out (IP, ID, Zeit) VALUES ('". $IP  ."', ". $outID .", '". $Zeit ."')"; 
        $Query5 = mysql_query($SQL5) or die(mysql_error()); 
     
        $SQL6 = "UPDATE topliste SET _OUT = '". $OUT ."' WHERE ID = '". $outID ."'"; 
        $Query6 = mysql_query($SQL6) or die(mysql_error()); 
                  
        } 
		
	$Speichersperre = time()-60*60*48; //Löscht alle Einträge, die älter als 48h sind. 
         
    $SQL7 = "DELETE FROM topliste_ips_out WHERE ZEIT < ". $Speichersperre ."";  
    $Query7 = mysql_query($SQL7); 
         
    header("Location: ". $destURL .""); 
    exit; 
    }  
}
 

Syrakos

Senior Consultant

AW: Topliste programmieren (MySQL, PHP)

Der Zähler wird aber immer hochgezählt, auch wenn die Query nichts liefert. Dann steht im Zähler eben einen 1.

Du speicherst ja die Zeit mit, also vergleiche die Zeit, wenn der Query ein Ergebnis liefert, mit der gespeicherten und nur wenn der Wert > 24 ist lass den Zähler hochzählen oder wenn es keinen Eintrag noch gibt dann eben mit 1 befüllen. Wie ich oben schon erwähnte wird der Zähler IMMER um 1 erhöht. :)
 

saila

Moderatorle

AW: Topliste programmieren (MySQL, PHP)

Hi,

dein Script habe ich mir nicht angesehen und den Vorschlag ebensowenig. Von der Logik ist das wie folgt. Zum einen wird die IP mit dem entsprechenden Timestamp und der dazugehörigen LinkID in einer Tabelle ******isiert gespeichert. Bei Klick auf den gleichen Link, wird vor dem eigentl. Speicherprozess der Inhalt zuvor gespeicherter Daten ausgelesen (passend zur LinkId) und somit mit den Inhalten vergleichen. Der Vergleich läuft zum einen direkt über den aktuellen timestamp und in zweiter Linie mit der IP (weil schneller da integer).

Bei diesem Prozess kann direkt das zu ******lisierende Array wieder bereinigt zusammengestellt werden.

Während des Vergleichsprozesses erfolgt der Count für den Banner - sofern alle zugelassenen Paremeter passen. Sprich IP ist nicht vorhanden. Da durch die Bereinigung eine IP herausfällt, sobald sie <= 24 Stunden ist, wird somit nur noch auf die IP geprüft.
 
R

rm21

Guest

AW: Topliste programmieren (MySQL, PHP)

Syrakos hat recht, in Zeile 7 ($OUT += 1) wird $OUT bei jedem Durchlauf um 1 erhöht, und zwar immer. Es fehlt hier die Bedingung, also z.B. nur erhöhen, wenn durch neue IP geklickt wurde...
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.068
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben