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

Problem mit IP - Besucherzähler

Die Fehlermeldungen sind leider nicht selbsterklärend ...

Hier noch einmal mein Programm ...

PHP:
<?php
mysql_connect("localhost", "web304", "********");mysql_select_db("usr_web304_1");
$abfrage  = mysql_query("SELECT `wert` FROM `daten` WHERE `bezeichnung` = 'zaehlerstand'");$ergebnis = mysql_fetch_assoc($abfrage);$besucherGesamt = $ergebnis['wert'];
mysql_query("DELETE FROM `besucher` WHERE `zeit` < (NOW() - INTERVAL 1 DAY)");
$besucherIp = $_SERVER['REMOTE_ADDR'];$abfrage    = mysql_query("SELECT COUNT(*) FROM `besucher` WHERE `ip` = '".$besucherIp."'") or die("Fehler in SQL-Statement");$ergebnis   = mysql_fetch_assoc($abfrage);$besucherSG = $ergebnis['COUNT(*)'];
if (!$besucherSG) {$besucherGesamt++;mysql_query("INSERT INTO `besucher` (`ip`, `zeit`) VALUES ('$besucherIp', NOW())");mysql_query("UPDATE `daten` SET `wert` = $besucherGesamt WHERE `bezeichnung` = 'zaehlerstand'");}
echo "Besucher insgesamt: $besucherGesamt";?>
 
Werbung:
Half mir leider auch nicht weiter ...

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in/home/www/web304/html/ipbesucher.phpon line 6
Table 'usr_web304_1.besucher' doesn't exist
 
Werbung:
So langsam fühle ich mich hier veräppelt.

Du hast ein Script programmiert, das mit einer Datenbank arbeitet, und schaffst es nicht, die passenden Tabellen zu erstellen? Das geht doch überhaupt nicht.
 
Werbung:
Ich versuch dir mal etwas bei der Fehlersuche zu helfen.

Fangen wir mit dem Begriff "Rückgabewert/typ" an.

Vorerst ein kleiner Trick:

- Wenn du sämtliche Informationen über eine Funktion erhalten willst, die sogenannte Doku(mentation), dann kannst du die Webseite "php.net" besuch und noch in der Url, nach dem Slash die Funktion hinschreiben, in unserem Fall: PHP: mysql_query - Manual

Besuche nun Parallel die Seite bitte.

Im Abschnitt "Beschreibung" stehen ganz viele Sachen um die "mysql_query" Funktion rum, was genau ist das?

Fangen wir mit dem Wort "resource" vor der Funktion an. Da können auch andere Sachen stehen, jedoch immer nur eins. Dies ist der Sogennante Rückgabewert/typ ( eher Typ denke ich mal, bin nicht so der Theoretiker.. Praxis > all ! ), dieser bestimmt, was die Funktion für ein Datentyp als Wert zurückgibt.

"resource" bedeutet in soweit, dass es sich um ein Objekt handelt welches durch .. bla blub irgendwas mit Daten aus der Datenbank. Tut mir Leid wenn es dich Interessiert lies es dir an^^ PHP: Ressourcen - Manual

Als nächstes kommen wir zu den komischen Inhalten in den Klammern. Diese werden Parameter genannt. Parameter die in Eckigen Klammern stehen sind Optional, alles davor ist Pflicht! Da steht dann z.B. "string $query" , dass heißt soviel wie, "dieser Parameter muss den Datentyp STRING besitzen und steht für die Query die eingesetzt werden soll." - String: Also Text.

Die letzte Information ist "Rückgabewerte", da steht auch drin, dass wenn irgendwas nicht stimmt, der Rückgabewert nicht mehr "resource" ,sondern "false" ist.


Gehen wir zur Funktion mysql_fetch_xxxx ( array/assoc/object ).

Dieser hat den Rückgabe Wert "array" und frisst als Parameter ein Inhalt vom Typ "resource". Aha !!

Nun wie vor dem Beispiel davor kannst du alles nochmal nachgehen und selbst anlesen, aber kommen wir zum Punkt: Was wenn "mysql_query" wie erwähnt durch ein Fehler "false" ausgibt?

Dann gibt mysql_fetch_xxxx eine MySQL-Fehlermeldung aus, da der Parameter nicht den richtigen Datentyp enthält!


Kommen wir zum Hauptpunkt: Was kann verursachen, dass mysql_query false zurückgibt?

.. muss ich mich wiederholen?^^ Wie im Post davor:

1. Es wird versucht auf eine Datenbank/Tabelle/Spalte zuzugreifen, welche nicht existiert! Dies kann dadurch kommen, wenn man nicht die Datenbanken nicht richtig importiert. Existiert eine "*.sql" Datei in den Daten die du bekommen hast?
2. Dem Datenbank User fehlen die Rechte auf die Datenbank zuzugreifen. Richtig einstellen!
3. Sonstige.. in andere Fälle bin ich glaub ich noch nie gefallen.. da kann man eigentlich nicht viel falsch machen, wenn man bereit ist zu lernen.
 
Erstmal Vielen Dank für deine Hilfe! Und nein ich habe leider keine .sql Datei da ich das Script mit Hilfe des Internets und meinen C-Kenntnissen selbst geschrieben habe. Allerdings weis ich jetzt wo das Problem liegt. Ich hatte tatsächlich noch keine Tabellen erstellt gehabt. Da ich leider nicht weis wie ich das mit phpmyadmin angehe, habe ich schonmal versucht mic einzulesen ... Bisher noch ohne Erfolg.
 
Oh weiterer Erfolg, gefällt mir!

Im PhpMyAdmin:

Gleich nach der Anmeldung ( falls vorhanden ) kann man oben auf Datenbanken klicken und die vorhandenen Datenbanken managen bzw. neu erstellen.

Die Seite ist üblicherweise in 2 Frames geteilt. Linke Seite ( 1. Frame ) sind die ganzen Datenbanken bzw. Tabellen.

Zu allererst wählst du deine Datenbank links aus, danach erscheint links eine Liste von vorhandenen Tabellen welche du Anzeigen kannst bzw. die Struktur bestaunen kannst, dass lassen wir jetzt aber erstmal sein.

Im 2. Frame ( mittlerer Bereich, mehr gibts nicht das wars ^^ ) sollte theoretisch auch gleich "Tabelle erzeugen" stehen. Ein leeres Feld für den Tabellen Namen und ein kleines Leeres Feld für die Anzahl an Spalten.

Also wenn deine Tabelle "User" folgende Spalten hat:"Id, loginname, password, email" , dann brauchst du 4 Spalten.
Du kannst jederzeit mehr Spalten hinzufügen oder entfernen. Unbennen oder sonstige.

Klick dich einfach mal rum, was soll schief gehen? Der Computer wird schon nicht schrott davon, allerhöchstens muss man schon ein Pro sein um wirklich solche Fehleinstellungen zu machen, dass die Datenbank oder Tabelle am A*** ist, aber kein Problem, Tabelle oder Datenbank löschen und neu erzeugen.. testen testen testen, rumklicken klicken klicken.
 
Werbung:
Ich erstelle gerade eine Tabelle "daten", darin befindet sich die Spalte "wert" (diesen habe ich als integer angenommen). Nun würde mich interessieren, welche Einstellungen ich noch treffen muss damit das ganze klappt. Im Anhang die Einstellungsmöglichkeiten als Bild:

PS: Gibt es hier keine Möglichkeit Bilder auch in höherer Qualität hochzuladen ... Da kann doch kein Mensch was lesen!
 

Anhänge

  • bild.jpg
    bild.jpg
    11,5 KB · Aufrufe: 9
Werbung:
Also als erste Spalte solltest du immer einen Primären Schlüssel verfassen ( Primary Key ) also ein Wert welcher Einzigartig ist und dadurch eine Spalte mit anderen Tabellen verglichen werden kann. Üblicherweise nimmt man dafür "id".

Also 1. Spalte "id". DatenTyp Int(eger) da es sich um Zahlen handelt. Bei Länge nehme ich z.B. gerne 11. Das heißt 11 Stellige Zahl, also Maximal 99999999999 Zahlen. Es wird wahrscheinlich niemals dazu kommen alle Bereiche aufzufüllen, daher ist 11 ganz passable, bei 10 würde ich mir sagen "mhmm könnte durch ein dummen Zufall ja doch ausversehen kommen?..".. Sicherheitshalber halt.

Dieser bekommt den "Index"->"Primary Key/Primärer Schlüssel". Außerdem da dieser einzigartig ist und es nervig wäre jedes mal beim Eintragen zu gucken, welche ID als letztes Eingetragen wurde, lässt man es automatisch steigen. Dies geschicht wenn du bei "Auto Increment ( kurz: A_I )" ein häckchen setzt.

Als 2. Spalte nehmen wir wie in deinem Beispiel "wert" und als DatenTyp Int(eger). Bei der Länge musst du nun selbst entscheiden. Was ist das für ein Wert? Eine Zahl 1-2000 ? Dann schauen wir uns den Maximal Wert ( 2000 ) an, dieser ist vier-stellig, daher in dem Fall dann "4 bei Länge".

3. Spalte nehmen wir als Beispiel den Wert "loginname", dieser bekommt den DatenTyp Varchar und bei länge wird besagt, wieviele Buchstaben es haben kann. Ich geh meistens von nicht mehr als 50 Buchstaben aus, daher nehme ich gerne 50 bei der Länge. Bei Passwörter kommts drauf an, da nehme ich gerne 32 oder sogar 256 für spezielle Verschlüsselungs oder Hash-Verfahren.

4. Spalte wird diesmal ein Kommentarfeld und wird "comments" genannt. Als Datentyp bekommt es "Text". Das wars, keine Länge... Text macht das Automatisch.

Mehr muss man da nicht beeinhalten. Wenn man nun Optimierungen machen will, kann man noch Foreign Keys und sowas setzen oder andere sachen, in dem Gebiet bin ich aber selbst nicht besonderlich perfekt, ich optimier wo ich nur kann und lies mir sachen an... aber für die Perfekte Optimierung muss man schon ein Datenbank Spezialist sein ^^


Beim Eintragen wäre das dann wie folgt:

1. Spalte übergibt man: NULL
2. Spalte übergibt man: gast1002
3. Spalte übergibt man: passwort2345678
4. Spalte übergibt man: Hey geile Page man! Weiter so, schöne Grüße!!

Würden wir nun 3 mal die gleichen Werte übergeben wäre die Tabelle wie folgt:

- 1
- gast1002
- passwort2345678
- Hey geile Page man! Weiter so, schöne Grüße!!

- 2
- gast1002
- passwort2345678
- Hey geile Page man! Weiter so, schöne Grüße!!

- 3
- gast1002
- passwort2345678
- Hey geile Page man! Weiter so, schöne Grüße!!
 
So, bin jetzt schonmal soweit, dass keine Fehlermeldungen mehr angezeigt werden^^ Allerdings wird mir bei Besucher Insgesamt: 1 immer 1 angezeigt. Schon klar er zählt die IP, deshalb habe ich gleich mit einem zweiten und dritten Laptop den Zähler getestet ... Leider steht bei Besucher Insgesamt immer 1 ...

Hier die Bilder zu meinen Einstellungen in MyPhpAdmin:

Bild ansehen - LD-Host.de

Bild ansehen - LD-Host.de
 
Werbung:
Lass dir die IPs per echo ausgeben. Die sind bestimmt identisch, wenn du mit allen Geräten hinter demselben Router hängst.
 
Lass dir trotzdem zur Sicherheit die jeweiligen IPs ausgeben. Das sind Dinge, die sich schnell überprüfen und dann als Problem ausschließen lassen.
 
Werbung:
Du solltest dir ernsthaft noch viel mehr darüber anlesen.

Du hast den Spalten völlig falsche Datentypen zugewiesen. Da steht bei "Id" z.B., dass es "float" als DatenTyp hat. "Float" verwendest du bei Dezimalzahlen, also Werte bei dennen die Zahlen nicht immer "Ganze Zahlen" sind. ( 1.24 , 0.5, 1.11 .. usw. )

Wie sieht dein PHP Code denn aus? Ich nehme an, dass du die Daten auch falsch einträgst oder sonstiges falsch ist.

P.S. Auf den Screenshots bist du auf der "Struktur-Ansicht", wenn du ganz oben auf "Anzeigen" klickst, siehst du die Einträge in der Tabelle.
 
Sobald ich dieses Problem gelöst habe, werde ich mich mehr damit befassen ... Aber jetzt sollte ich erstmal das hier fertig kriegen. Naja ... Hier nochmals der Code:

PHP:
<?php
mysql_connect("localhost", "web304", "sGsFbtKG");mysql_select_db("usr_web304_1");
$abfrage  = mysql_query("SELECT `wert` FROM `daten` WHERE `bezeichnung` = 'zaehlerstand'") or die(mysql_error());$ergebnis = mysql_fetch_assoc($abfrage);$besucherGesamt = $ergebnis['wert'];
mysql_query("DELETE FROM `besucher` WHERE `zeit` < (NOW() - INTERVAL 1 DAY)");
$besucherIp = $_SERVER['REMOTE_ADDR'];$abfrage    = mysql_query("SELECT COUNT(*) FROM `besucher` WHERE `ip` = '".$besucherIp."'") or die(mysql_error());$ergebnis   = mysql_fetch_assoc($abfrage);$besucherSG = $ergebnis['COUNT(*)'];
if (!$besucherSG) {$besucherGesamt++;mysql_query("INSERT INTO `besucher` (`ip`, `zeit`) VALUES ('$besucherIp', NOW())");mysql_query("UPDATE `daten` SET `wert` = $besucherGesamt WHERE `bezeichnung` = 'zaehlerstand'");}
echo "Besucher insgesamt: $besucherGesamt";?>

Hier nochmals die Bilder (im Anzeige Fenster):

Bild ansehen - LD-Host.de
Hier konnte ich nicht ins Anzeige Fenster wechseln da die Tabelle anscheinend leer ist:

Bild ansehen - LD-Host.de
 
Zurück
Oben