SQL Datensatz Aktualisierung bzw. Ausgabe, funktioniert nicht richtig!

D

dreivier

Gast
Hallo Leute

Was möchte ich machen?....ich habe einen kleinen Mitgliederbereich, jetzt möchte ich auf einer
bestimmten Seite anzeigen wer von den Mitgliedern in der letzten Stunde auf der Seite war. Aber
das Mitglied das sich die Seite aktuell anschaut, soll nicht in der Liste erscheinen!

Das ganze mache ich mit diesem selbstgebauten Script...

PHP:
     $connect = mysqli_connect($mysql_host, $mysql_user, $mysql_pass, $mysql_base);

    if($connect) {
      mysqli_set_charset($connect, 'utf8');
       $member = $_SESSION['name'];
        mysqli_query($connect, "DELETE FROM `members` WHERE `timestmp` <= '".(time() - 3600)."'");
        $new_con = mysqli_num_rows(mysqli_query($connect, "SELECT `name` FROM `members` WHERE `name` = '".$member."'"));

         if($new_con == 0) {
          mysqli_query($connect, "INSERT INTO `members` (`id`, `name`, `timestmp`) VALUES ('', '".$member."', '".time()."')");
         }

         $sql = mysqli_query($connect, "SELECT * FROM `members` WHERE NOT `name` = '".$member."'");
         $rows = mysqli_num_rows($sql);

         while($visitors = mysqli_fetch_assoc($sql)) { echo $visitors['name'].'<br />'; }

		 mysqli_close($connect);
    }

Die Ausgabe ist wie gewünscht, nur irgendwie werden Einträge schon vor einer Stunde gelöscht...also die -3600 greift irgendwie nicht.
 
- Die direkte Verwendung des Namens ermöglicht eine SQL-Injection.
- Den Tabellennamem 'members' halte ich für etwas, dass wohl eine Besucherliste darstellen soll, unglücklich gewählt.
- Hat die Spalte Id eine Relevanz, wenn der Name nur 1x (unique) vorkommen kann?
- Das ständige Löschen & neu Einfügen halte ich für unsinnig, ein einfaches update würde reichen, du musst dann nur die Abfrage mit der "letzten Stunde" anpassen.
- Welchen Datentyp hat die Spalte 'timestmp' und warum fehlt da das 'a'? Spaltennamen dürfen bei einer halbwegs aktuellen DB auch länger als 8 Zeichen sein.
 
Darlis schrieb:
- Die direkte Verwendung des Namens ermöglicht eine SQL-Injection.

Es ist ein Bereich den ca. 30 bekannte Leute nutzen bzw. nutzen können, der Bereich ist Passwort geschützt.
Da kommt kein Gast drauf.

- Den Tabellennamem 'members' halte ich für etwas, dass wohl eine Besucherliste darstellen soll, unglücklich gewählt.

Nur für das Beispiel hier gekürzt, der Name ist Länger...

Bis jetzt haben beide Sachen die du angesprochen hast aber nichts mit den Problem zutun..

- Hat die Spalte Id eine Relevanz, wenn der Name nur 1x (unique) vorkommen kann?

Id wird fortlaufend erhöht, also, Name kommt, alter Name wird gelöscht, ID wird um eins erhöht, ich weiß dann
anhand der ID-Nummer wie oft die Seite besucht wurde.

- Das ständige Löschen & neu Einfügen halte ich für unsinnig, ein einfaches update würde reichen, du musst dann nur die Abfrage mit der "letzten Stunde" anpassen.

Ob gelöscht oder upgedatet wid, was genau ist jetzt der Unterschied? wobei wenn ich nur update, die Besucher alle in der Tabelle bleiben würden, ich die Abfrage dann aber anders machen müsste zb. ,,zeigt mir nur Leute die in der letzten Stunde da waren,,.
So aber nur ,,zeigt mir alle Leute in der Tabelle,,. es bleibt wie es ist, das ist schon gut so.

- Welchen Datentyp hat die Spalte 'timestmp' und warum fehlt da das 'a'? Spaltennamen dürfen bei einer halbwegs aktuellen DB auch länger als 8 Zeichen sein.

Die Spalten hätte jetzt auch ,,dihe9,, heißen können, was genau hat das mit dem Problem zutun? :(

Leute, wenn ich frage wie ich nach Berlin komme, möchte ich doch nicht von euch wissen das euch meine Schuhe nicht gefallen :(
 
Vielleicht solltest du dann die einzig relevante Frage auch beantworten:
Welchen Datentyp hat die Spalte 'timestmp'

Wenn du schon vermutest, dass das WHERE im delete nicht passt, warum testet du dann nicht mal was die DB aus deinen Werten macht?
SELECT timestmp
SELECT time - 3600
SELECT timestmp < (time - 3600)
Etc.
 
Zuletzt bearbeitet:
dreivier schrieb:
Leute, wenn ich frage wie ich nach Berlin komme, möchte ich doch nicht von euch wissen das euch meine Schuhe nicht gefallen :(

Wenn Du Dich aber im Auto, welches kein Benzin im Tank hat auf den Rücksitz setzt und fragst wie Du nach Berlin kommst, hat es vielleicht eine Berechtigung, Dich zuerst auf diese offensichtlichen Fehler hinzuweisen....
 
dreivier schrieb:
Leute, wenn ich frage wie ich nach Berlin komme, möchte ich doch nicht von euch wissen das euch meine Schuhe nicht gefallen :(

Deine Abfrage ist mehr als dämlich, aber sollte gehen, sofern alle Namen richtig sind. Aber gut, dann hilft dir halt keiner.
Und auch die 30 Leute können mal auf blöde Ideen kommen. Sicher > Unsicher.
 
Enurian schrieb:
Vielleicht solltest du dann die einzig relevante Frage auch beantworten:
Frage ich mich auch. Der Rest war gedacht, um dich auf andere mögliche Probleme hinzuweisen, dir helfen besseren Code zu schreiben. Aber du bist offenbar weder daran, noch an der Problemlösung interessiert.

dreivier schrieb:
Es ist ein Bereich den ca. 30 bekannte Leute nutzen bzw. nutzen können, der Bereich ist Passwort geschützt.
Der Passwortschutz hat mit SQL-Injections nichts zu tun. Wenn es intern ist, ist die Angriffsfläche nur kleiner. Wenn du mal was nach dem selben Stil online machst knallts eher früher als später.

dreivier schrieb:
Die Spalten hätte jetzt auch ,,dihe9,, heißen können, was genau hat das mit dem Problem zutun?
Das Problem kommt, wenn du Syntax-Fehler bekommst, weil du nächste Woche nicht mehr weist, ob es "timestamp", "timestmp" oder "tp" heißt. Du machst dir damit das coden nur selbst schwer.

dreivier schrieb:
es bleibt wie es ist, das ist schon gut so
Ok.
 
Bin jetzt zwar kein mysql Spezialist, aber ich frage mich warum du das mim Script machst und nicht die DB Engine die Arbeit machen lässt und die Zeit im SQL Statement errechnest. So ungefähr:

Code:
DELETE FROM members WHERE timestmp < SUBTIME(NOW(),'0 1:0:0.000000')

Ich glaub so ist das bei mysql. Alternativ kannst du dir das komplette DELETE sparen und die Daten behalten (hättest dann auch gleich eine schöne Historie) und über das SELECT nur die Mitglieder der letzten Stunde anzeigen. Das würde dann so aussehen:

Code:
"SELECT * FROM members WHERE timestmp >= SUBTIME(NOW(),'0 1:0:0.000000') AND name <> '".$member."'"

Wie gesagt, kenn jetzt die mysql Syntax nicht so gut (Fehler vorbehalten ;-), aber der Sinn kommt rüber denk ich.
 
Zurück
Oben