• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Counter in MySQL

Status
Für weitere Antworten geschlossen.

Hanashi

Neues Mitglied
Hallo Leute,
ich habe mir einen Counter mit PHP gemacht würde ihn aber gerne in MySQL machen damit ich in phpmyadmin sehe von welcher Seite der User gekommen ist und was für eine IP Adresse er hat usw.
Hier der Code für den Counter:
PHP:
<?php
// Cookie wird gesetzt
setcookie("count", "yes");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Ein Textcounter</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body>
<h2>Ein Textcounter</h2>
<p>Die Seite wurde
<b><?php
$fp = fopen("count.txt", "r+");
$counter = fgets($fp, 10);
echo $counter;
$counter++;
if (empty($_COOKIE["count"])) {
  $counter++;
  }
rewind($fp);
fputs($fp, $counter);
fclose($fp);
?></b>-mal aufgerufen.</p>
</body>
</html>
Und dann gibt es noch die Datei count.txt wo einfach bloß eine 0 drinne steht!
MfG Peter Lohse
 
Also wenn du noch die Funktion mit, von der vorherigen Seite haben willst, dann würde ich nicht MySQL und Textdatei verwenden.
Am besten für beides ne MySQL Tabelle.

Für das, von woher der User stammt, kann ich auch nicht, aber den Counter kann ich schon erklären, wie mit MySQL machen.
Soll das ein Counter sein der IP's speichert und dann pro Tag, pro IP nur eins hochzählt oder für jeden Seitenaufruf?




MfG; matibaski
 
Das Problem bei einem solchen Counter ist folgendes.

Gehen wir davon aus, deine Seite ist zumindest einigermaßen gut besucht. Und durch jeden Besucher (bzw. Pagehit), wird ein Eintrag in der Datenbank erstellt, der IP und zusätzliche Informationen enthält.

Bei spätestens 1500-2000 Einträgen (also 1500-2000 Pagehits), wird deine Seite extrem langsam sein, da die Datenbank bei sovielen Einträgen einfach überfordert ist (ausgegangen von einer "normalen" Datenbank, wie sie z.B. in einem mittelteuren Webspace-Paket enthalten ist. Die html.de-Datenbank macht sowas mit Sicherheit ohne Probleme mit).

Erste Möglichkeit, dieses Problem zumindest zu veringern wäre, nur bei neuen Besucher einen Eintrag zu machen, also nicht bei Pagehits. D.h. wenn ein Besucher schon mal da war, wird kein neuer Eintrag erzeugt, sondern nur die IP erneuert bzw. hinzugefügt. Aber selbst dann wird es irgendwann (kommt natürlich auf deine Besucherzahlen an) zu einer überfüllten Datenkbank kommen.

Ich würde dir dazu raten, nur die Einträge der letzten Tage zu behalten und alle anderen zu löschen.

Den Code werde ich dir nicht posten, nur ein paar Denkanstösse. Was ich bisher beobachten durfte, hat gezeigt, das fertige Codes relativ wenig bringen. Mehr Verzweiflung als Wissen oder Hilfe.

PHP:
$sql = 'INSERT INTO [tabelle] ([spalten]) VALUES ([werte])';
$sql = 'DELETE FROM [tabelle] WHERE time <= '.(time() - [10 tage]).'';

Wenn dir das absolut nicht hilft bzw. dir nichts sagt, solltest du die Finger von einem solchen Counter lassen.

Es macht in meinen Augen wenig Sinn, ein Skript zu haben, das man selbst nicht versteht. Dann versuch dich lieber mal an Grundkenntnissen in MySQL.
 
Mit den überfüllten Datenbanken kann ich voll zustimmen. Warum aber das nicht in eine Textdatei einschreiben? Es gibt doch die wunderbaren Funktionen, wie explode und implode.
Natürlich musst du auch die Textdatei plegen und nicht zu groß werden lassen. Deine Spionagefunktionen findest du hier: PHP: Predefined Variables - Manual
 
Geht das, dass es die Ip-Adresse mit in die Textdatei einschreibt wenn nicht das mit der Datenbank würde ich ja aller 2 Tage löschen!
 
Das mit der überfüllten Datenbank ist totaler Quatsch. Wenn eine Datenbank bei 2000 Einträgen schon in die Knie geht hat sie die Bezeichnung Datenbank nicht verdient. 1000000 Einträge sollten kein Problem sein aber da du ja eh jeden Tag die IP-Adressen erneuen willst werden es nicht all zu viele Einträge werden.
Einfach beim EIntragen einen Zeitstempel mitspeichern und alle Datensätze ab einem bestimmten Alter automatisch entfernen.
 
morl, dem kann ich nicht zustimmen. Ich selbst hatte das Problem bereits.

Für mein damaliges Projekt hatte ich ein hochwertiges Webspace-Paket bei hosteurope.de gebucht, die eine (nach Testberichten) gute Datenbank enthielt. Nicht für übergroße Projekt wie html.de geeignet, aber für durchschnittliche durchaus.

Diese verschaffte mir nach knapp 2000 Einträgen (von einem schlecht-programmierten Counter erzeugt) 10-15 Sekunden Ladezeit in meinem Forum.

Natürlich gibt es auch Datenbanken, die das schaffen, aber eine schlechte bis durchschnittliche Datenkbank wohl nicht und bei dem Großteil der User hier ist doch davon auszugehen, dass sie eine solche besitzen.

Edit
Es kann natürlich sein, dass die Datenbank selbst nicht überfordert war, sondern nur lange gebraucht hat um den mysql_num_rows()-Befehl auszuführen. Das Ergebnisse wäre allerdings das gleiche.
 
Zuletzt bearbeitet:
Wenn eine Datenbankabfrage länger als 500 ms dauert dann stimmt etwas mit der Abfrage nicht.
Ein normaler SELECT auf eine Tabelle mit über 3.000.000 Einträgen hat bei mir bei einer MySql-Datenbank nicht länger als 100 ms gedauert.
Es ligt also weder an der verwendeten Datenbank noch an der Masse der enthaltenen Daten. Bei geziehltem Einsatz von Indizes und konkreten Abfragen schafft es eine Datenbank locker mit mehr als 1.000.000 Datensätzen fertig zu werden. Allerdings muss ich sagen, das ich dafür einen eigenen Datenbankserver verwenden konnte, der keine weiteren Aufgaben zu erledigen hatte.
Es ist natürlich immer ein Problem bei Webspace den man auf irgend einem Webserver gestellt bekommt. Man weiss ja nie wofür der Server gerade seine Resources verbraucht aber selbst unter relativ hoher Last sollte er und die Datenbank 2000 Einträge noch locker abarbeiten können.
 
morl hat vollkommen recht, einer datenbank mit nur wenigen millionen datensätzen in einer statischen tabelle dürfte ein index-basiertes SELECT überhaupt nichts antun, eine text datei wäre irgendwann endlos lahm durch race conditions schutz, eine für MySQL so lächerliche größe wie wenige tausend datensätze.. da kann ja wohl kaum irgendwas nennenswertes verzögert werden.

mal zum thema: ip findest du in $_SERVER['REMOTE_ADDR'] Referer (von wo der aufruf kam) in $_SERVER['HTTP_REFERER']
wichtig ist das du auf ein statisches tabellenlayout achtest und alle spalten die teil einer WHERE bedingung in SELECT abfragen werden könnten indexierst

fürs löschen von großen tabellen dann einfach TRUNCATE nehmen, ratz fatz sind deine millionen von reihen in wenigen millisekunden über den jordan ;)
 
auch wenn man nicht optimal programmiert (erfahrung :-D ) ist die datenbank kein problem. ich (oute mich als datensammler) habe bei der vorgängerversion meiner jetzigen seite ip, referer, zeit sowie das verhalten auf der seite (startseite->unterseite 1 ->unterseite3->startseite...) protokolliert und nicht irgendwann gelöscht. auch bei knapp 7000 Einträgen konnte ich nicht spüren, dass da irgendwas langsamer wird (außer wenn ich mir alle verläufe des letzten Jahres gleichzeitig ausgeben lasse) und ich hab wirklich nicht das luxus-hosting-paket (all-inkl.com).
 
Wie gesagt, ich kann nur aus Erfahrung sprechen.

Meine damaligen Kenntnissen schätze ich durch aus als gut genau ein, um eine ordentliche SQL-Abfrage hinzubekommen.

Aber nun gut, dann scheint das wohl nur mir so zu gehen.

P.S. Bitte jetzt keine Diskussion darüber, ob ich eine ordentliche SQL-Abfrage hinbekomme oder wie jenige aussehen muss.
 
P.S. Bitte jetzt keine Diskussion darüber, ob ich eine ordentliche SQL-Abfrage hinbekomme oder wie jenige aussehen muss.

Das Problem an deiner Aussage ist nur das für die Geschwindigkeit ganz andere Faktoren ebenso wichtig sind, Datenstruktur, Indexierung, Serverkonfiguration etc, offenbar hast du also nicht wirklich genug Ahnung für eine begründete Aussage ;)
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben