Titel: Unterabfrage mit SQLNamedQuery Beitrag von: toraX 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: VolGas 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: toraX 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: VolGas 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: toraX 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: VolGas 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: toraX 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: VolGas 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 Titel: Re: Unterabfrage mit SQLNamedQuery Beitrag von: toraX 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 |