www.ProFTPD.de
13. März 2007, 20:25:39 *
Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?

Einloggen mit Benutzername, Passwort und Sitzungslänge
News: SMF - Neu installiert!
 
   Übersicht   Hilfe Suche Login Registrieren  
Seiten: [1]   Nach unten
  Drucken  
Autor Thema: Unterabfrage mit SQLNamedQuery  (Gelesen 224 mal)
0 Mitglieder und 1 Gast betrachten dieses Thema.
toraX
ProFTPD
*
Offline Offline

Beiträge: 6

103770727
Profil anzeigen
« am: 22. September 2006, 15:16:53 »

Hallo!!

Ich hoffe mir kann von euch einer weiterhelfen, da ich schon sämtliche Seiten nach meinem Problem durchsucht habe und leider nicht
fündig geworden bin.
Ich würde gerne in meiner Datenbank speichern wann sich jemand ein- und ausgeloggt hat.
Es ist ja kein Problem die Zeit festzuhalten wann sich jemand eingeloggt hat, aber beim ausloggen komm ich auf keinen grünen Zweig.

Ist es überhaupt möglich in  SQLNamedQuery eine Unterabfrage folgender Art zu stellen:

Code:
SQLLOG QUIT quit_log
 SQLNamedQuery          quit_log      UPDATE "log_out=now() WHERE username='%u' && log_in=(SELECT MAX(log_in) FROM
ftp_login_pass)" ftp_login_pass
Gespeichert
VolGas
Moderator
ProFTPD
*****
Offline Offline

Beiträge: 771



Profil anzeigen
« Antwort #1 am: 22. September 2006, 17:18:07 »

Hallo!

Ich fürchte, daß dies ein hoffnungsloses Unterfangen ist.
Wenn der FTP-Client "höflich" ist, dann wird er sich tatsächlich mit "QUIT" verabschieden,
aber meist sind sie es eben nicht und trennen einfach die Verbindung. Oder der ProFTPD
trennt von sich aus die Verbindung wegen eines Timeouts. Oder...
Es ist wie im Leben: Trennungsgründe gibt es einige.

Vermutlich ist es sogar so, daß der "QUIT"-Befehl ProFTPD-intern vom Core-Module gleich
umgesetzt wird und den jeweiligen Prozess beendet, also gar nicht mehr an die anderen
Module (und damit auch nicht an das SQL-Modul) weitergeleitet wird.

Sorry...

mfg.
  Volgas
Gespeichert
toraX
ProFTPD
*
Offline Offline

Beiträge: 6

103770727
Profil anzeigen
« Antwort #2 am: 22. September 2006, 17:39:27 »

Hallo,

und Danke erstmal für die schnelle Antwort.

Ich will dir auf keinen Fall wiedersprechen, aber ich hab es gerade mal mit

Code:
SQLLOG QUIT quit_login
 SQLNamedQuery          quit_login      UPDATE "log_out=now() WHERE username='%u'" ftp_login_pass

getestet und es funktioniert auch wenn ich die Verbindung mit ctrl+c oder durch Schliessen des Fensters unterbreche.

Das Problem ist nur bei diesem Beispiel, dass  bei jedem User mit username='%u' das Datum now() eingesetzt wird und ich möchte
dies ja nur beim letzten Login erreichen.

Gruss
Torsten

 
Gespeichert
VolGas
Moderator
ProFTPD
*****
Offline Offline

Beiträge: 771



Profil anzeigen
« Antwort #3 am: 22. September 2006, 21:25:29 »

Ich verstehe nicht ganz - ist das Feld "username" nicht als "primary index" angelegt
und jeder Username einmalig? Kannst Du bitte ein wenig konkreter werden?

mfg.
  VolGas
Gespeichert
toraX
ProFTPD
*
Offline Offline

Beiträge: 6

103770727
Profil anzeigen
« Antwort #4 am: 23. September 2006, 16:58:07 »

Also ich hab in meiner Datenbank eine extra Tabelle erstellt, in der bei jedem Einloggen
der Username sowie der Zeitpunkt des Login gespeichert wird.
Der Username kommt also öfters vor.

Code:

 # TABELLE ftp_login_pass
 # Erfolgreiche Logins

 SQLLOG PASS pass_login
 SQLNamedQuery          pass_login      INSERT "NULL,'%u'          ,'%h' ,'%a',now() ,NULL    " ftp_login_pass
 
 # Tabelle ftp_login_pass in mysql   "nr, username, host, ip, log_in, log_out"


Das ganze ist eigentlich nur für Statistikzwecke gedacht.
Möchte mir die Daten später mit php auswerten lassen.

Gruss
Torsten
 
Gespeichert
VolGas
Moderator
ProFTPD
*****
Offline Offline

Beiträge: 771



Profil anzeigen
« Antwort #5 am: 23. September 2006, 22:13:48 »

Das ist eigentlich kein ProFTPD-Problem und meiner Meinung nach wäre eine
Auswertung von einem Logfile wesentlich resourcenfreundlicher.

Aber es gibt natürlich auch mit SQL eine Lösung: da das Feld "log_out" noch leer
ist, wenn sich jemand eingeloggt hat, kann man natürlich beim Ausloggen mit
einer entsprechenden "WHERE"-Klausel den Update gezielt auf diesen Datensatz
begrenzen. Zusätzlich könnte man das Update noch mit "LIMIT 1" auf einen
einzelnen Datensatz beschränken, das wird aber wohl nicht notwendig sein.

Alles nur eine Sache einer mehr oder weniger geschickten SQL-Abfrage...

mfg.
  VolGas
Gespeichert
toraX
ProFTPD
*
Offline Offline

Beiträge: 6

103770727
Profil anzeigen
« Antwort #6 am: 24. September 2006, 14:11:15 »

Da stimme ich dir auf alle Fälle zu, dass die Auswertung der Logfile resourcenfreundlicher wäre, aber ich möchte gerne aufgrund
meines Studiums mich ein bischen mehr mit mysql beschäftigen.

Für die Begrenzung des Datensatzes mit der "WHERE"-Klausel benötige ich doch eine Unterabfrage wie oben beschrieben.
Hab jetzt alle Möglichkeiten die mir bekannt sind durchprobiert und bin zu keinem vernünftigen Ergebnis
gekommen.

Ich werd mich wohl oder übel mit dem Datum der letzten Aktivität eines Users begnügen müssen.

Gruss
Torsten
 
Gespeichert
VolGas
Moderator
ProFTPD
*****
Offline Offline

Beiträge: 771



Profil anzeigen
« Antwort #7 am: 24. September 2006, 22:11:56 »

Mal ein "Schnellschuß", ohne groß nachzudenken:

    UPDATE ["tabelle" SET] log_out=NOW() WHERE username='%u' AND log_out='0000-00-00'

Nicht perfekt und ohne Gewähr!

In Kursivschrift und eckigen Klammern ist der Teil, der zu einem vollständigen
SQL-Query gehört, in der Syntax für "mod_sql" aber wegbleiben muß.
Unterabfragen mit einem zweiten "SELECT" gehen in mySQL leider (noch?) nicht.

mfg.
  VolGas
Gespeichert
toraX
ProFTPD
*
Offline Offline

Beiträge: 6

103770727
Profil anzeigen
« Antwort #8 am: 25. September 2006, 10:35:21 »

Super, Funktioniert einwandfrei!!!
Da hab ich wohl viel zu umständlich gedacht mit meiner Unterabfrage.

Nochmals vielen Dank für deine Hilfe.

Gruss
Torsten
Gespeichert
Seiten: [1]   Nach oben
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.2 | SMF © 2006-2007, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS
Seite erstellt in 0.056 Sekunden mit 16 Zugriffen.