Hilfe bei einem Counterscript

PHP, Ajax, CSS, HTML, Javascript
Eben für die wirklich Harten, die alles selber machen.
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Hilfe bei einem Counterscript

Beitrag von Icke »

Code: Alles auswählen

<?php include($_SERVER["DOCUMENT_ROOT"].'/includes/config.inc');
$ip = $_SERVER["REMOTE_ADDR"];
$datum = date("d.m.Y");
// Alte IP-Adresse löschen
$ablaufzeit = time() - 300; // 300 Sekunden (= 5min.) IP Sperre!
//-----------------------------------------------
$sql = "DELETE * FROM counter_ip WHERE zeit <= $ablaufzeit ";
// Ist die IP-Adresse schon in der Tabelle

if ( $sql = "SELECT ip FROM counter_ip WHERE ip=$ip ")
 {
// Nein, IP-Adresse und Timestamp eintragen
$sql = "INSERT INTO counter_ip (ip,zeit) VALUES ('$ip','time()')";
 // Counter aktualisieren
$sql = "UPDATE counter_stats SET besucher=besucher + 1 WHERE datum=$datum";

if (mysqli_num_rows()==0) 
 {
  sql = "INSERT INTO counter_stats (datum,besucher) VALUES ('$datum','1');";
 }
}
// Hits aktualisieren
mysqli_query("UPDATE counter_stats SET hits=hits + 1 WHERE datum=$datum");

// -----------------------------------------------------------------------------------------------------------------
// Counter Daten von heute
list($besucher_heute, $hits_heute) = mysqli_fetch_row(mysqli_query("SELECT besucher,hits FROM counter_stats WHERE datum = '$datum'"));
// Counter Daten gesamt
list($besucher_gesamt, $hits_gesamt) = mysqli_fetch_row(mysqli_query("SELECT sum(besucher), sum(hits) FROM counter_stats WHERE 1"));
// Hits von Gestern
list($hits_gestern, $besucher_gestern) = mysqli_fetch_row(mysqli_query("SELECT * FROM counter_stats WHERE datum = '$datum'"));
// Besucher Online
list($besucher_online) = mysqli_fetch_row(mysqli_query("SELECT COUNT(*) AS ip FROM counter_ip"));
// registrierte Besucher Online
list($besucher_online_reg) = mysqli_fetch_row(mysqli_query("SELECT COUNT(*) AS ip FROM users "));
// Besucher Gestern
$sql = "SELECT * FROM counter_stats ORDER BY id DESC LIMIT 1,1 "; 

	if($result = $db->query($sql));
		{
 		while($row = $result->fetch_assoc())
			{
			$besucher_gestern = $row['besucher'];
			$hits_gestern = $row['hits'];
			}
// Anzeigen
echo '
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0428 $datum </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0205 $besucher_online_reg </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0200 $besucher_online  </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0201 number_format($besucher_heute, 0, ",", ".") </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0369 $besucher_gestern </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0202 number_format($besucher_gesamt, 0, ",", ".") </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0203 number_format($hits_heute, 0, ",", ".") </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/m.gif>&nbsp;<span class=text>$text_0370 number_format($hits_gestern, 0, ",", ".") </span><br>
<img src=$pfad/layout/spacer.gif><img src=$pfad/layout/navi/e.gif>&nbsp;<span class=text>$text_0204 number_format($hits_gesamt, 0, ",", ".") </span><br>
';
?>
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Hallo Icke,

wobei genau hast Du mit diesem Script nun ein Problem?

Zunächst fällt mir auf, dass die mit echo() ausgegebenen Texte auch genau so angezeigt werden, wie im Code genannt.
Dieses sollte schon mal ersetzt werden durch:

Code: Alles auswählen

echo '
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0428 . $datum . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0205 . $besucher_online_reg . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0200 . $besucher_online . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0201 . number_format($besucher_heute, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0369 . $besucher_gestern . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0202 . number_format($besucher_gesamt, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0203 . number_format($hits_heute, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0370 . number_format($hits_gestern, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/e.gif>&nbsp;<span class=text>' . $text_0204 . number_format($hits_gesamt, 0, ",", ".") . '</span><br>
';
Damit dürften die meisten Probleme einer korrekten Anzeige schon mal beseitigt sein...

Was noch?!?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Leute hallo Oxpus,

danke ersteinmal für deine Hilfe.

Kurze erleuterung: nach Umstellung meines Anbieters auf PHP 7.2 habe ich mit vielen Problemen zu kämpfen. Erstens werden die Seiten nicht angezeigt sofern sich ein Fehler auf der Seite befindet.

In dem Fall mein Counterscript !!! Also muss sich dort irgendwo ein Fehler befinden aber wo ???

Gruß Icke
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Fehler werden im Fehlerprotokoll error.log des Webservers protokolliert.
Dort kann man nachsehen, warum etwas nicht angezeigt wird.
Das ist mittlerweile Standard, denn öffentlich angezeigte Fehler sind ja eher unschön.

Beim zweiten Blick auf Dein Counter-Script bezweifele ich allerdings, dass überhaupt irgendwann mal etwas Sinnvolles da heraus kam.
Dort sind so viele logische und strukturelle Fehler drinnen, dass PHP definitiv nur Fehler erzeugen kann und das bereits auch mit älteren PHP-Versionen.

Um das Script anzupassen, damit es zunächst fehlerfrei arbeitet, bedeutet einen Komplettumbau des gesamten Codes.
Auch und insbesondere wegen der falschen Benutzung der mysqli-Befehle und Missachtung einfachster Sicherheitsstandards.
Ja, das Script könnte sogar dazu genutzt werden, um deinen Server zu hacken!!

Ich möchte das Script daher aufgrund der enthaltenen zahlreichen Fehler nicht weiter anpassen, denn dann würde ich das Script fast schon komplett neu schreiben.
Und das ist nicht im Sinne des hier geleisteten, kostenlosen Supportes.
Hilfestellung ja, aber keine "Komplettsanierung" ganzer Scripte.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hi Oxpus,

danke für deine erliche Meinung. Dann leiste doch einmal ein bischen Hilfe, darüber wäre ich sehr dankbar.!!!!

Gruß Icke
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Ja wo fange ich da nur an?


In dem Script werden in den Zeilen 7-19 SQL-Anweisungen der Variable $sql zugewiesen.
Mit dieser Variable passiert dann aber nichts weiter.
Es werden also auf diese Weise keine Abfragen oder Befehle zur Datenbank geschickt, da der dafür benötigte Befehl mysqli_query() nicht ausgeführt wird.

Code: Alles auswählen

if ( $sql = "SELECT ip FROM counter_ip WHERE ip=$ip ")
ist immer WAHR, wird also immer erfüllt!
Die IF-Bedingung sollte aber doch wohl eher nur WAHR sein, wenn die IP des Besuchers in der Datenbank aktuell nicht gespeichert ist, oder?
Dann sollte man die Abfrage erst ausführen und dann mit dem Abfrageergebnis prüfen, ob die abfragte IP der aus $_SERVER entnommenen IP entspricht, also ob man dann die IP speichert oder nur den Zähler erhöht.
Das geht sogar noch einfacher mit

Code: Alles auswählen

$count_ip = mysqli_num_rows($db_link, $result)
wobei $db_Link in allen Beispielen immer der Zeiger für die Datenbankverbindung ist und $result der Zeiger auf das letzte Abfrageergebnis einer SELECT-Abfrage, welche jetzt noch in der IF-Bedingung steckt.

Code: Alles auswählen

if (!$count_ip)
würde dann letztlich die korrekte Bedingung für deinen Fall darstellen.


Bei der Zeile 19 fehlt bei der Variable $sql das $. Dort steht nur sql = ...


Die meisten mysqli-Befehle, welche Daten aus der Datenbank abfragen oder Befehle dorthin schicken, verlangen in der Regel als ersten Parameter das myqli-Objekt einer aktuell offenen Datenbankverbindung. Das wird erzeugt durch einen Ausdruck wie

Code: Alles auswählen

$db_link = mysqli_connect()
Dieser Aufruf fehlt im Script und das dadurch erzeugte mysqli-Objekt wird im gesamten Script nicht angewendet.
Aber nur mit einem mysqli-Verbindungsobjekt damit kann man mit der Datenbank auch kommunizieren.

Die Variablen $besucher_gestern und $hits_gestern werden zuerst in der Zeile 31 abgefragt, in der Abfrage ab Zeile 37 jedoch überschrieben.
Was soll jetzt gelten?
Allerdings fragt die SQL-Anweisung

Code: Alles auswählen

"SELECT * FROM counter_stats WHERE datum = '$datum'"
die Daten von heute ab, denn $datum wird definiert durch

Code: Alles auswählen

$datum = date("d.m.Y");
und das ist der aktuelle Tag.
"Gestern" wäre hingegen

Code: Alles auswählen

$datum = date("d.m.Y") - 86400;
also heute - 86400 Sekunden für einem Tag (Schaltsekunden und Schaltjahre mal ausgenommen). Wenn man die Daten so abfragen möchte...


Es gibt zwar die Möglichkeit in PHP, in einem String, welcher mit " (doppeltes Hochkomma) umklammert ist, Variablen einzufügen, um zur Laufzeit des Scripts den Inhalt dieser Variablen in den Test einsetzen zu lassen.
Das ist aber gerade bei Datenbankabfragen genau der falsche Ansatz, da dieses ein großes Sicherheitsrisiko darstellt!!
Wenn man die Variable von "außen" über den Aufruf des Scripts mit Inhalt befüllen kann, kann dort auch eine zusätzliche Datenbankabfrage enthalten sein, die auf diesem Weg brav von der Datenbank aufgeführt wird und dem Angreifer somit Tür und Tor zum Server öffnet. Ja sogar JavaScript oder andere Scripte könnte man ausführen lassen, wenn der Server diese interpretieren kann (also die jeweiligen "Sprachen" installiert sind).

So wird z. B. die Variable $ip bei Dir vollkommen ungeschützt zur Datenbank geschickt:

Code: Alles auswählen

"SELECT ip FROM counter_ip WHERE ip=$ip "
Übergibt man deinem Script unter der Server Globalen "REMOTE_ADDR" neben der IP auch noch eine weitere SQL-Anweisung mit, könnte man damit bequem alle Infos von deinem Server abrufen, die man sich nur vorstellen kann. Im schlimmsten Fall sogar die Zugangsdaten zum Server, um diesen vollständig übernehmen zu können.
Solche Schreibweisen und mangelhafte Variablenabsicherung sind für meine Begriffe auch schon nicht mehr nur ein fahrlässiger, sondern eher vorsätzlicher Verstoß gegen die einfachsten Sicherheitsregeln im Internet. SQL-Injection sei hier als Begriff zu nennen. Suchmaschinen liefern zu diesem Begriff seitenweise Infos...


Es ist also notwendig, diese Variable zu "maskieren", also sie unschädlich zu machen:

Code: Alles auswählen

"SELECT ip FROM counter_ip WHERE ip= ' . (string) mysqli_real_escape_string($db_link, $ip) . "'"
Damit wird jedes Hochkomma (einfach oder doppelt), jedes Sonderzeichen und Steuerzeichen durch unschädliche Maskierungen ersetzt und der zusätzliche SQL-Code in der Regel nicht mehr mit ausgeführt.


Zwar verhindert dann diese Maskierung ein ordnungsgemäßes Ergebnis, aber das wäre dem Angreifer egal. Er kommt aber auch nicht mehr an die von ihm erwarteten Daten ran.


Die in den SQL-Anweisungen verwendeten Variablen sollten also immer abgesichert werden:
Zahlen mit (int) wie

Code: Alles auswählen

(int) $datum
Texte zusätzlich maskieren:

Code: Alles auswählen

(string) mysqli_real_escape_string($dl_link, $ip)

Dann taucht an Zeile 39 das Objekt $db auf.
Wo wird das definiert? In der eingebundenen Datei config.inc?
Wenn schon eine Datenbankklasse eingebunden wird, sollte man diese auch im gesamten Script verwenden, denn ansonsten öffnet man für ein Script 2 Verbindungen zur Datenbank, was Unsinn wäre und sogar schlecht für die Performance.

Code: Alles auswählen

"SELECT sum(besucher), sum(hits) FROM counter_stats WHERE 1"
Die Bedingung WHERE 1 ist hier unsinnig. 1 ist für sich genommen immer wahr, daher schränkt diese Bedingung nicht sein und sollte somit entfallen:

Code: Alles auswählen

"SELECT sum(besucher), sum(hits) FROM counter_stats"

Solche verschachtelten Ausdrücke sollte man vermeiden, die kann man im Fehlerfall nur schwerlich prüfen:

Code: Alles auswählen

list($hits_gestern, $besucher_gestern) = mysqli_fetch_row(mysqli_query("SELECT * FROM counter_stats WHERE datum = '$datum'"));
list() verwendet man auch kaum noch und wird wohl auch bald auf PHP verschwinden.
Besser wäre so etwas:

Code: Alles auswählen

$sql = 'SELECT sum(besucher) as besucher_gestern, sum(hits) as hits_gestern FROM counter_stats WHERE datum = ' . (int) $datum - 86400;
$result = mysqli_query($db_link, $sql);
$row = mysqli_fetch_array($result);
$besucher_gestern = $row['besucher_gestern'];
$hits_gestern = $row['hits_gestern'];
mysqli_free_result($result);
Ja, das sind deutlich mehr Zeilen, aber dafür auch deutlich übersichtlicher.
Zumal das Abfrageergebnis auch wieder gelöscht wird.
Dabei wird nicht nur die Variable $result gelöscht, sondern auch der Datenpuffer für das Abfrageergebnis.
Und letzteres geschieht auch nirgends in deinem Script und generiert somit offene Verbindungen zur Datenbank, welche ansonsten nur über ein Timeout in der Datenbank geschlossen werden, wenn überhaupt. Im schlimmsten Fall könnte das sogar bei zu vielen Verbindungen, welche nicht geschlossen werden, auch zu Fehlermeldungen oder gar zur Nichterreichbarkeit der Datenbank führen.


Reicht das für die erste Runde an Hilfestellung?
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus,

ja ich denke doch :eek:

werde das ersteinmal umbauen.Übrigens funktionierte das Scrpt bis zur Umstellung auf 7.2!


Gruß Icke
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus,

ich bin wie gesagt bei der Umstrukturierung des Scripts beschäftigt jetzt wollte ich jede Tat anzeigen lassen.
Jedoch habe ich da ein Problem:

$sql_1 = ' INSERT INTO counter_ip (ip, zeit) VALUES ('$ip', 'time()') ';
$result = mysqli_query($db, $sql_1);
while ($row = $result->fetch_row()) {
printf("%s (%s)\n", $row['ip'], $row['zeit']); }
$db->close();

das funktionirt nicht, warum?

Gruß Icke
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Öhm ja, kann ich Dir sagen:
Du fügst eine neue Zeile in die Datenbank ein (INSERT INTO...) und versuchst dann sogleich alles auszulesen.

Das ist definitiv auf deine Weise nicht möglich, da das SELECT fehlt.
Wenn dann so:

Code: Alles auswählen

$sql_1 = 'INSERT INTO counter_ip (ip, zeit) VALUES (' . (string) mysqli_real_escape_string($ip) . ', ' . time() . ')';
mysqli_query($db, $sql_1); // Ein INSERT gibt kein Ergebnis zurück, daher auch kein $result an dieser Stelle

$sql_1 = 'SELECT ip, zeit FROM counter_ip';
$result = mysqli_query($db, $sql_1);
while ($row = $result->fetch_row()) {
printf("%s (%s)\n", $row['ip'], $row['zeit']); }

$db->close();

Und bitte zukünftig mit BBCodes arbeiten, zumindest Programmcode auf diese Weise posten.
Danke.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus,

ich habe das mal eingefühgt, leider bekomme da keine Ausgabe. Und es wird auch nichts eingetragen in der DB.
$sql = ' INSERT INTO counter_ip (ip, zeit) VALUES (' . (string) mysqli_real_escape_string($ip) . ', ' . time() . ') ';
print " 3: O.K. DB erzeugt!";
mysqli_query($db, $sql);
//
$sql = 'SELECT ip, zeit FROM counter_ip';
$result = mysqli_query($db, $sql);
while ($row = $result->fetch_row()) {
printf("%s (%s)\n", $row['ip'], $row['zeit']); }
$db->close();
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Dieser Codeausschnitt als solches sollte schon korrekt sein.
Es ist aber die Frage, wo und wie dieser Code im Script eingebunden ist, um eine angedachte Aufgabe auch zu erledigen.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus,
// Connect mit MySql host
$db_host = "rdbms.strato.de"; // Hostname
$db_user = "******"; // Benutzername
$db_pass = "**************"; // Passwort
$db_name = "******"; // Datenbankname
// Neue Datenbankverbindung herstellen
$db = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
// Zeichenkodierung der SQL Verbindung bestimmen (optional)
$db->set_charset('utf8');
So bide ich den code ein in der config.inc

Gruß Ingo
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus, und das ist der Code den ich besher habe:
$sql = ' DELETE * FROM counter_ip WHERE zeit = ' . $ablaufzeit . ' ';
if ($db->query($sql) != TRUE) { // === TRUE
echo " 1: Datensatz erfolgreich gelöscht \n "; // O.K.
} else { echo " Error: beim Löschen des Datensatzes: " . $db->error; }
$db->close();

// --- Ist die IP-Adresse schon in der DB-Tabelle
$sql_ = ' SELECT ip FROM counter_ip WHERE ip=' . (string) mysqli_real_escape_string($db, $ip) . ' ';
if ($db->query($sql_) != TRUE) { // === TRUE
echo " 2: Datensatz erfolgreich angezeigt \n "; // O.K.
} else { echo " Error " . $db->error; }
$db->close();
// Nein, IP-Adresse und Timestamp eintragen
$sql = ' INSERT INTO counter_ip (ip, zeit) VALUES (' . (string) mysqli_real_escape_string($ip) . ', ' . time() . ') ';
print " 3: O.K. DB erzeugt!";
mysqli_query($db, $sql);
//
$sql = 'SELECT ip, zeit FROM counter_ip';
$result = mysqli_query($db, $sql);
while ($row = $result->fetch_row()) {
printf("%s (%s)\n", $row['ip'], $row['zeit']); }
$db->close();
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus, und das ist die Ausgabe:
1: Datensatz erfolgreich gelöscht 2: Datensatz erfolgreich angezeigt 3: O.K. DB erzeugt!
Gruß Ingo
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Wenn wäre das so richtig(er):

Code: Alles auswählen

$sql = ' DELETE * FROM counter_ip WHERE zeit = ' . $ablaufzeit;
if ($db->query($sql)) { // === TRUE
echo " 1: Datensatz erfolgreich gelöscht \n "; // O.K.
} else { echo " Error: beim Löschen des Datensatzes: " . $db->error; }
$db->close();

// --- Ist die IP-Adresse schon in der DB-Tabelle
$sql_ = " SELECT ip FROM counter_ip WHERE ip='" . (string) mysqli_real_escape_string($db, $ip) . "'";
if ($db->query($sql_)) { // === TRUE
echo " 2: Datensatz erfolgreich angezeigt \n "; // O.K.
} else { echo " Error " . $db->error; }
$db->close();
// Nein, IP-Adresse und Timestamp eintragen
$sql = " INSERT INTO counter_ip (ip, zeit) VALUES ('" . (string) mysqli_real_escape_string($db, $ip) . "', " . time() . ")";
print " 3: O.K. DB erzeugt!";
mysqli_query($db, $sql);
//
$sql = 'SELECT ip, zeit FROM counter_ip';
$result = mysqli_query($db, $sql);
while ($row = $result->fetch_row()) {
printf("%s (%s)\n", $row['ip'], $row['zeit']); }
$db->close();
Zunächst mal muss man kein zusätzliches Leerzeichen am Ende der SQL-Anweisung einfügen.
Das ist überflüssig sondern nur unnötiger Balast.

Die IP ist ein String, daher muss dieser in den SQL-Anweisungen mit einem einfachen Hochkomma umschlossen werden, sonst würde die Datenbank einen fehlerhaften Befehl erhalten.
Das habe ich angepasst.

Ich denke, dass $ablaufzeit und $ip auch korrekt aus $_SERVER oder $_REQUEST übernommen werden?

Auch ist in den Bedingungen für $db->query nach Deiner Logik das "!= TRUE" falsch, denn dann würde das Script "Fehlermeldungen" anzeigen, obwohl die Datenbankaktion erfolgreich war.
So wie Du das definiert hast, einfach das "!= TRUE" weglassen, denn im Fehlerfall wäre "$db->query" === FALSE.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Icke hat geschrieben: Mo 28.Jun, 2021 10:28 Hallo Oxpus, und das ist die neue Ausgabe:
1: 1:Error: beim Löschen des Datensatzes: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM counter_ip WHERE zeit = 1624862457' at line 1 2:Error 3:Error 4:Error
Gruß Ingo
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Icke hat geschrieben: Di 29.Jun, 2021 08:42
Icke hat geschrieben: Mo 28.Jun, 2021 10:28 Hallo Oxpus, und das ist die neue Ausgabe:
1: 1:Error: beim Löschen des Datensatzes: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* FROM counter_ip WHERE zeit = 1624862457' at line 1 2:Error 3:Error 4:Error

in der DB Habe Stehen: "ip"=217.238.112.76 und in "time"=1624783735

Gruß Ingo
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Icke hat geschrieben: Di 29.Jun, 2021 08:45
Hallo Oxpus, und das ist die neue Ausgabe:




in der DB habe ich stehen: "ip"=217.238.112.76 und in "time"=1624783735

Gruß Ingo
[/quote]
[/quote]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Wo kommt denn das abschließende Hochkomma her?
Der Code lautete doch anders:

Code: Alles auswählen

$sql = ' DELETE * FROM counter_ip WHERE zeit = ' . $ablaufzeit;
Besser wäre sogar das hier:

Code: Alles auswählen

$sql = ' DELETE * FROM counter_ip WHERE zeit = ' . (int) $ablaufzeit;
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Morgen Oxpus,

hier noch einmal das gesamte script:
<? include($_SERVER["DOCUMENT_ROOT"].'/kopf.php');
include($_SERVER["DOCUMENT_ROOT"].'/includes/lang/' . $lang . '/main.inc');
include_once($_SERVER["DOCUMENT_ROOT"].'/includes/config.inc');
$ip = $_SERVER["REMOTE_ADDR"];
$zeit = time();
$datum = date("d.m.Y");
$ablaufzeit = time() - 86400; // IP Sperre!
//--- Alte IP-Adresse löschen -------------------------------------------
$sql = ' DELETE * FROM counter_ip WHERE zeit = ' . (int) $ablaufzeit;
if ($db->query($sql)) {
echo " 1: Datensatz erfolgreich gelöscht \n "; // O.K.
} else { echo "- 1: Error: beim Löschen: " . $db->error; }
$db->close();
// --- Ist die IP-Adresse schon in der DB-Tabelle
$sql_ = " SELECT ip FROM counter_ip WHERE ip='" . (string) mysqli_real_escape_string($db, $ip) . "' ";
if ($db->query($sql_)) {
echo " 2: Datensatz erfolgreich angezeigt \n ";
printf($row['ip']); // O.K.
} else { echo "- 2: Error " . $db->error; }
$db->close();
// Nein, IP-Adresse und Timestamp eintragen
$sql = " INSERT INTO counter_ip (ip, zeit) VALUES ('" . (string) mysqli_real_escape_string($ip) . ', ' . time() . "') ";
if ($db->query($db, $sql)) {
print " 3: O.K. DB erzeugt! ";
} else { echo "- 3: Error " . $db->error; } // O.K.
$db->close();
// Counter aktualisieren
$sql = " SELECT ip, zeit FROM counter_ip ";
if ($db->query($sql_)) {
echo " 4: Datensatz \n ";
printf($row['ip']);
printf($row['zeit']);
} else { echo "- 4: Error " . $db->error; } // O.K.
$db->close();
// Counter aktualisieren
$sql = "UPDATE counter_stats SET besucher=besucher + 1 WHERE datum=' . $datum . ' ";
if ($db->query($sql)) {
echo "- 5: Datensatz Update \n ";
} else { echo "- 5: Error " . $db->error; } // O.K.
$db->close();
// Besucher aktualisieren
$sql = "INSERT INTO counter_stats (ID,datum,besucher,hits) VALUES (' . $ID . ',' . $datum . ','0','0') ";
if ($db->query($db, $sql)) {
print "- 6: Statistic! ";
} else { echo "- 6: Error " . $db->error; } // O.K.
$db->close();

$sql = "SELECT ID,datum,besucher,hits FROM counter_ip ";
if ($db->query($sql_)) {
printf($row['ID']);
printf($row['datum']);
printf($row['besucher']);
printf($row['hits']);
} else { echo "- 7: Error " . $db->error; } // O.K.
$db->close();
// Hits aktualisieren
$sql = 'UPDATE counter_stats SET hits=hits + 1 WHERE datum=' . $datum . ' ';
if ($db->query($sql)) {
echo "- 8: Hits um 1 erhoet \n ";
} else { echo " 8: Error " . $db->error; } // O.K.
$db->close();
// Counter Daten von heute
$sql = 'SELECT besucher,hits FROM counter_stats WHERE datum =' . $datum . ' ';
if ($db->query($sql_)) {
$besucher_heute = $row['besucher_heute'];
$hits_heute = $row['hits_heute'];
} else { echo "- 9: Error " . $db->error; } // O.K.
$db->close();
// --- Counter Daten gesam-------------------------------------------------------------------------
$sql = 'SELECT sum(besucher) as besucher_gestern, sum(hits) as hits_gestern FROM counter_stats WHERE datum = ' . (int) $datum - 86400;
if ($db->query($sql_)) {
$besucher_gestern = $row['besucher_gestern'];
$hits_gestern = $row['hits_gestern'];
} else { echo "- 10: Error " . $db->error; } // O.K.
$db->close();
// ------------------------------------------------------------------------------------------------
$sql = "SELECT sum(besucher), sum(hits) FROM counter_stats ";
if ($db->query($sql_)) {
$besucher_gesamt = $row['besucher_gesamt'];
$hits_gesamt = $row['hits_gesamt'];
} else { echo "- 11: Error " . $db->error; } // O.K.
$db->close();
// --- Hits von Gestern ---------------------------------------------------------------------------
$sql = ' SELECT * FROM counter_stats WHERE datum = ' . (int) $datum - 86400;
if ($db->query($sql_)) {
$besucher_gestern = $row['besucher_gestern'];
$hits_gestern = $row['hits_gestern'];
} else { echo "- 12: Error " . $db->error; } // O.K.
$db->close();
// --- Besucher Online ---------------------------------------------------------------------------
$sql = "SELECT COUNT(*) AS ip FROM counter_ip ";
if ($db->query($sql_)) {
$besucher_online = $row['ip'];
} else { echo "- 13: Error " . $db->error; } // O.K.
$db->close();
// --- registrierte Besucher Online ---------------------------------------------------------------
$sql = "SELECT COUNT(*) AS ip FROM users ";
if ($db->query($sql_)) {
$besucher_online_reg = $row['ip'];
} else { echo "- 14: Error " . $db->error; } // O.K.
$db->close();
// Besucher Gestern
$sql = "SELECT * FROM counter_stats ORDER BY id DESC LIMIT 1,1 ";
if($result = $db->query($sql));
{
while($row = $result->fetch_assoc())
{
$besucher_gestern = $row['besucher'];
$hits_gestern = $row['hits'];
}
}// else { echo "- 15: Error " . $db->error; } // ???
$db->close();
// Anzeigen
echo '
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0428 . $datum . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0205 . $besucher_online_reg . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0200 . $besucher_online . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0201 . number_format($besucher_heute, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0369 . $besucher_gestern . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0202 . number_format($besucher_gesamt, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0203 . number_format($hits_heute, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/m.gif>&nbsp;<span class=text>' . $text_0370 . number_format($hits_gestern, 0, ",", ".") . '</span><br>
<img src=' . $pfad . '/layout/spacer.gif><img src=' . $pfad . '/layout/navi/e.gif>&nbsp;<span class=text>' . $text_0204 . number_format($hits_gesamt, 0, ",", ".") . '</span><br>
';
?>
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Eins vorab, bevor ich das gesamte Script noch mal überfliege:

Code: Alles auswählen

$db->query($sql_)
geht so nicht. Wenn muss das so lauten:

Code: Alles auswählen

mysqli_query($db, $sql_)
$db ist ja nur die Verbindung zur Datenbank und keine Klasse für den gesamtem Befehlsatz.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus,

so habe das geändert! Jetzt kommt da auch was, alle 13 : O.k.
DB Eintrag merere Male gelöscht!

Nur die Ausgabe funst nicht.

Gruß Ingo
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Die Ausgabe ist auch weiterhin mit den falschen Befehlen ausgestattet.

Code: Alles auswählen

if($result = $db->query($sql));
{
while($row = $result->fetch_assoc())
ist falsch, da $db und $result keine Methoden besitzen!
Genau genommen ist $db ein Objekt vom Typ mysqli und $result eine Zahl.

Also wenn dann so:

Code: Alles auswählen

if($result = mysqli_query($db, $sql));
{
while($row = mysqli_fetch_assoc($result))

Und zuletzt:

Code: Alles auswählen

$db->error;
ist somit ebenso falsch wie

Code: Alles auswählen

$db->close();
Diese müssen lauten

Code: Alles auswählen

mysqli_error($db);
und

Code: Alles auswählen

mysqli_close($db);
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Icke
Beiträge: 104
Registriert: So 20.Jun, 2021 16:15

Re: Hilfe bei einem Counterscript

Beitrag von Icke »

Hallo Oxpus,

danke für deine weitere Hilfe.

ich Habe die beiden Dinge geändert und hochgeladen keinerlei Änderung!!!

Bild
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Re: Hilfe bei einem Counterscript

Beitrag von oxpus »

Jetzt mal zum gesamten Script:

Wenn man eine Datenbankverbindung öffnet, diese aber wieder schließt, kann man nicht damit weiter arbeiten.
Im Script ist zwar $db->close(); vorhanden, um die Verbindung zur Datenbank ordentlich zu beenden, aber diese sollte nicht gleich nach jeder SQL-Anweisung geschlossen werden, zumal die Verbindung nicht wieder geöffnet wird.

Sofern also jetzt $db->close(); im gesamten Script durch mysqli_close($db); ersetzt wurde, müsste es eine Menge Fehlermeldungen hageln oder zumindest Einträge im Fehlerprotokoll.

Also zum Anfang:
In der Datei config.inc wird die Verbindung zur Datenbank hergestellt und im Objekt $db gespeichert.
Diese Objekt kann dann im gesamten Script für jeden mysqli-Befehl verwendet werden, solange eben die Verbindung zur Datenbank noch nicht geschlossen wurde.

Daher den Befehl mysqli-close($db) nur dort einfügen, wo das Script auch tatsächlich am Ende der Datenverarbeitung ankommt.
Das kann am Ende des Scripts sein oder wenn das Script vorzeitig durch eine Bedingung beendet wird.
Aber eben nicht nach jeder SQL-Anweisung!

Die Verbindung zur Datenbank bleibt in der Regel ja immer solange offen, wie das Script läuft. Ein ständiges öffnen und schließen einzelner Verbindungen ist dagegen sehr langsam und bremst auch die Datenbank aus.

Kurzum:
Alle (und ich meine wirklich alle) Befehle $db->close();, bzw. mysqli_close($db); aus dem Script entfernen und nur einmal am Ende belassen.

Dann ein paar logische Fehler, wie ich meine:

Code: Alles auswählen

$sql = ' DELETE * FROM counter_ip WHERE zeit = ' . (int) $ablaufzeit;
Dieser Befehl würde nur die Einträge löschen, welche exakt zur angegeben Zeit vorgenommen wurden.
Sollten hier nicht alle Einträge gelöscht werden, die vor der "Ablaufzeit" liegen?
Dann wäre als Bedingung zeit <= ' . (int) $ablaufzeit; anzugeben.

Code: Alles auswählen

// --- Ist die IP-Adresse schon in der DB-Tabelle
$sql_ = " SELECT ip FROM counter_ip WHERE ip='" . (string) mysqli_real_escape_string($db, $ip) . "' ";
if ($db->query($sql_)) {
echo " 2: Datensatz erfolgreich angezeigt \n ";
printf($row['ip']); // O.K.
} else { echo "- 2: Error " . $db->error; }
$db->close();
// Nein, IP-Adresse und Timestamp eintragen
$sql = " INSERT INTO counter_ip (ip, zeit) VALUES ('" . (string) mysqli_real_escape_string($ip) . ', ' . time() . "') ";
if ($db->query($db, $sql)) {
print " 3: O.K. DB erzeugt! ";
} else { echo "- 3: Error " . $db->error; } // O.K.
$db->close();
Die zweite SQL-Anweisung wird immer ausgeführt, also auch wenn festgestellt wurde, dass die IP bereits gespeichert ist.
Diese Anweisung müsste also in der Bedingung des SELECTs eingebunden werden.
Könnte man z. B. so machen:

Code: Alles auswählen

// --- Ist die IP-Adresse schon in der DB-Tabelle
$sql_ = " SELECT ip FROM counter_ip WHERE ip='" . (string) mysqli_real_escape_string($db, $ip) . "' ";
if ($db->query($sql_)) {
echo " 2: Datensatz erfolgreich angezeigt \n ";
printf($row['ip']); // O.K.
} else { 
// Nein, IP-Adresse und Timestamp eintragen
$sql = " INSERT INTO counter_ip (ip, zeit) VALUES ('" . (string) mysqli_real_escape_string($ip) . ', ' . time() . "') ";
if ($db->query($db, $sql)) {
print " 3: O.K. DB erzeugt! ";
} else { echo "- 3: Error " . $db->error; } // O.K.
}
Den Fehler "2" gibt es dann nicht mehr, war eh unlogisch, einen nicht vorhandenen Datensatz als Fehler zu bezeichnen...

Die nachfolgenden 5 Anweisungen ergeben für mich keinen Sinn:
Erst wird etwas abgefragt und nur angezeigt.
Danach wird der Counter für den aktuellen Tag um 1 erhöht (das wäre der klassische Counter)
Nun wird die Variable $ID (woher kommt diese?) mitsamt dem aktuellen Datum in die Tabelle als neue Satz geschrieben. Ohne vorherige Prüfung, ob für das aktuelle Datum schon etwas vorhanden ist oder nicht!
Und dann wieder alles ausgelesen und nur angezeigt.
:eek:

Und noch eine Unlogik:
Die Variablen $besucher_gestern und $hits_gestern werden weiterhin zweimal abgefragt und damit das Ergebnis der erstes Abfrage verworfen.
Ist mehr als unlogisch...

Und zuletzt noch eine:

Code: Alles auswählen

$sql = "SELECT COUNT(*) AS ip FROM users ";
Wo wird in diese Tabelle geschrieben?
Zumal die reine Abfrage der IP von Usern noch lange nicht aussagt, dass diese auch (gestern / heute / morgen?) online waren.

Ich kann auch keinen logischen Zusammenhang zwischen den Tabellen counter_ip und counter_stats erkennen.
In die Tabelle counter_ip wird nur die IP des Users und die aktuelle Zeit eingetragen.
Die Tabelle counter_stats beinhaltet dagegen eine (unbekannte) id und das aktuelle Datum.
Abgesehen davon, dass im Script das Insert eines neuen Satzes in diese Tabelle nach dem Update eben jedes Datensatzes erfolgt und beides ohne Prüfung, ob der Datensatz überhaupt existiert, um zwischen Update und Insert zu unterscheiden.
Zumal der erste Insert in diese Tabelle für den aktuellen Tag sicherlich auch als Besucher 1 sein sollte, ebenso auch Hits gleich 1 bei Insert?!?

Der Wert in dem Feld hits in der Tabelle wird dagegen überhaupt nicht verändert. Wo erfolgt das überhaupt?
Halt, Hits wird ja doch hochgezählt, aber mit einem Update erst später im Script.
Was ist dann der Unterschied von Besucher und Hits, wenn beides gleichermaßen hochgezählt wird?
Da ist eines eher überflüssig oder sollte unter Besucher eher eine ID des Users eingetragen werden?!?

So wie es jetzt enthalten ist, kann man das in einer Update Anweisung zusammenfassen, also update counter_stats set benutzer = benutzer + 1, hits = hits + 1 ...
Spart eine Anweisung, welche separat gegen die Datenbank geschickt wird...

Bitte das Script einmal auf diese Punkte überarbeiten und neu hier posten (oder anhängen).
Aber bitte nicht zitiert
quote.jpg
quote.jpg (1.06 KiB) 3109 mal betrachtet
, sondern als Code
code.jpg
code.jpg (992 Bytes) 3109 mal betrachtet
posten.
Danke!
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Antworten