Schrift
[thread]887[/thread]

CGI::Session und MySQL: eigene daten in "sessions" hinzufügen

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
styx-cc
 2007-02-05 14:28
#9591 #9591
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Halli hallo, ich versuche gerade einen Login fuer eine Webseite zu schreiben und via CGI::Session die Session-IDs zu verwalten:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
sub check_sid {
my $login = shift;
my $usr_id = shift;
my $sid = param('SID');
#load old sid by GET-param()
my $dbh = dbi_connection();
$CGI::Session::MySQL::TABLE_NAME = 'sessions';
my $session = CGI::Session->load("driver:mysql", $sid, {Handle=>$dbh})
or die CGI::Session->errstr;
if ($session->is_expired) {
print 'Deine SessionID ("', $sid ,'") ist abgelaufen, bitte <a href="sprechstunde.cgi">logge dich neu ein</a>!';
del_session($sid);
exit 0;
}
#only while login we can have a empty sid
if ($session->is_empty) {
if ($login) {
del_session(undef, $usr_id);
$session = $session->new();
$session->expire('+10s');
create_session($session->id, $usr_id);
} else {
my $tmpl = HTML::Template::Compiled->new(filename => '../templates/sp_login.htc');
print $tmpl->param(PROB =>"Session-ID Problem!<br />\n");
print $tmpl->output(), "\n";
exit 0;
}
}
return $session->id;
}#sub check_sid()

sub del_session {
my ($sid, $usr_id) = @_;
my $dbh = dbi_connection();
my $statement;
if ($sid) {
$statement = "DELETE FROM sessions WHERE id=?";
} elsif ($usr_id) {
$statement = "DELETE FROM sessions WHERE user_id=?";
}
my $sth = $dbh->prepare($statement);
$sth->execute($sid?$sid:$usr_id) or die $DBI::errstr;
$dbh->disconnect() or die $DBI::errstr;
}#sub del_session()

sub create_session {
my ($sid, $usr_id) = @_;
my $dbh = dbi_connection();
my $sth = $dbh->prepare("UPDATE sessions SET user_id=? WHERE id=?");
$sth->execute($usr_id, $sid) or die $DBI::errstr;
$dbh->disconnect() or die $DBI::errstr;
}


Das klappt leider nur halbwegs, er schreibt nach dem Login zwar eine SessionID ind
die Datenbank, allerdings merkt er z.B. nicht wenn die 10 Sekunden abgelaufen sind und tut so als ob die SID noch gueltig waere.

Was ich auch nicht schaffe (und auch nicht verstehe) ist die $user_id mit in die Datenbank zu schreiben, die braeuchte ich u.a. um bei einem erneutem Login eines Users seine alte SID zu loeschen (wenn er z.B. am Ende seiner Session nicht auf Logout klickt sondern nur das Browserfenser schliesst).

Zur Hilfe hatte ich die CGI::Session-Doku und das dazugehoerige Tutorial..

Ich hoffe ich hab mich halbwegs verstaendlich ausgedrueckt und man/frau kann mir helfen =)

MfG

EDIT: Der TABLE sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql> select * from sessions;
+----------------------------------+------------------------------------------------------


------------------------------------------------------------------------------------------


--------------------------------------------+---------+
| id | a_session | user_id |
+----------------------------------+------------------------------------------------------


------------------------------------------------------------------------------------------


--------------------------------------------+---------+
| 90cf21a276ec8d99c0cb019f064dbab9 | $D = {'_SESSION_ETIME' => 30,'_SESSION_ID' => '90cf21a276ec8d99c0cb019f064dbab9','_SESSION_ATIME' => 1170677065,'_SESSION_REMOTE_ADDR' => '127.0.0.1','_SESSION_CTIME' => 1170677065};;$D | 0 |
| 639013b448946598f00e83c98d91887b | $D = {'_SESSION_ETIME' => 10,'_SESSION_ID' => '639013b448946598f00e83c98d91887b','_SESSION_ATIME' => 1170677541,'_SESSION_REMOTE_ADDR' => '127.0.0.1','_SESSION_CTIME' => 1170677541};;$D | 0 |
| 26e4aa9a35028c8863b732ebaa512308 | $D = {'_SESSION_ETIME' => 600,'_SESSION_ID' => '26e4aa9a35028c8863b732ebaa512308','_SESSION_ATIME' => 1170677579,'_SESSION_REMOTE_ADDR' => '127.0.0.1','_SESSION_CTIME' => 1170677579};;$D | 0 |
+----------------------------------+------------------------------------------------------


------------------------------------------------------------------------------------------


--------------------------------------------+---------+
3 rows in set (0.00 sec)

N bissi unordentlich, aber man kann die drei Spalten ja noch recht gut erkennen :blush:

edit pq: code-tags hinzugefügt\n\n

<!--EDIT|styx-cc|1171717436-->
Pörl.
Superfrank
 2007-02-17 00:27
#9592 #9592
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
wenns gar nicht funktioniert kann ich dir CPAN:Apache::Session::MySQL
empfehlen, wo du einmal mit tie eine Session machst und die Datenbankverbindung aufbaust, und dann mit den bereitgestellten Funktionen die Session löschen und neue Daten einfügen kannst, anstatt direkt in der Session-Tabelle mit SQL zu arbeiten. Ist möglicherweise etwas einfacher. Mit CGI::Session kenne ich mich leider nicht aus.

Grüsse

Frank
pq
 2007-02-17 14:23
#9593 #9593
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
styx-cc: wieso schreibst du die userid selbst in die session-tabelle?
CGI::Session bietet doch dafür die param()-methode.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-02-17 14:30
#9594 #9594
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=styx-cc,05.02.2007, 13:28]
Code: (dl )
1
2
3
4
5
6
7
sub check_sid {
...
   $statement = "DELETE FROM sessions WHERE(id='$sid')";
...
 my $sth = $dbh->prepare("UPDATE sessions SET user_id='$usr_id' WHERE(id='$sid')");
 $sth->execute() or die $DBI::errstr;
}
[/quote]
hmm. ich editiere mein cookie und schreibe rein:
sid' or id != '
=> WHERE(id='sid' or id != '')
wieso benutzt du keine dbi-platzhalter?\n\n

<!--EDIT|pq|1171715440-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
styx-cc
 2007-02-17 14:57
#9595 #9595
User since
2006-05-20
533 Artikel
BenutzerIn

user image
das war nur "hingeklatscht", normalerweise benutze ich die ?-Notation, aber wenn ich drueber nachdenk.. koennte andere Leute vielleicht fehlleiten, werd das ma editieren, danke

MfG\n\n

<!--EDIT|styx-cc|1171717851-->
Pörl.
Froschpopo
 2007-02-17 15:05
#9596 #9596
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hi,

du brauchst die Session nicht zu löschen oder zu updaten. Mach beim Login einfach ein REPLACE !
Dann musst du nicht prüfen ob die Session beim Login schon existiert und diese bei positivem befund löschen.
REPLACE prüft ob vorhanden und ersetzt dann einfach durch einen neuen, wärend der alte gelöscht wird.
Wichtig ist dabei aber, dass die entsprechenden Cols auch Unique sind!

Kleines Beispiel:

Session updaten:
UPDATE sessions SET letzte_aktion = NOW() WHERE sid = ?

abgelaufene sessions löschen:
DELETE FROM sessions WHERE UNIX_TIMESTAMP(datum)+1000 < UNIX_TIMESTAMP(NOW())

Neue Session erstellen:
REPLACE INTO sessions (id, username.... # wie beim INSERT

und nicht das quoting vergessen, man weiss nie was der cookie enthält ;)\n\n

<!--EDIT|Froschpopo|1171717608-->
nepos
 2007-02-17 15:41
#9597 #9597
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wozu macht ihr das eigentlich alles manuell, wenn ihr CGI::Session benutzt?
Froschpopo
 2007-02-18 02:20
#9598 #9598
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
verwende ich garnicht. Ich wüsste auch nicht warum! Aber wenn du mir ein argument gibst, mache ich es vielleicht :)
Wenn ich mir die Description bei cpan so anschaue ist das doch nur noch mehr code! Mein obiges beispiel ist doch viel kompakter als der ganze modul-kram. Da musste doch erstmal das objekt machen, treiberkram festlegen usw. warum soll ich das tun, wenn ich doch sowieso ne mysql-connection am laufen habe?\n\n

<!--EDIT|Froschpopo|1171758325-->
nepos
 2007-02-18 13:58
#9599 #9599
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Naja, das Modul ist getestet und ist denke ich einfacher, als das Rad wieder mal neu zu erfinden. Wenn du das aber lieber selbst machen willst, nur zu...
Ich persönlich bin da oft eher faul und nutze Module, sofern es gute gibt.
GwenDragon
 2007-02-18 15:41
#9600 #9600
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Module die vorhanden sind sparen einfach Programmierzeit, es sei denn du willst was lernen, dann machst du es erst mal selbst ;)
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2007-02-05 14:28.