PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: Session erstellen...


ooAlbert
2006-08-09, 11:18:57
Hi,

ich versuche mich seit neuestem im PHP in verbindung mit MYSQL. Ich hab jetzt dieverse Tutorials durchgearbeitet und somit zugriff auf eine datenbank und den datanaustausch realisiert ...

Jetzt möchte ich das es eine benutzerverwaltung gibt, bzw. eine simple loginabfrage. Da die datenbank selbst alle Benutzer gespeichert hat ist es sogesehen kein problem über diese die nutzer zu erkennen.

Das eigentliche problem ist, das sobald ich weitere seiten aufrufe mir die verbindung zur datenbank verlohren geht. nun hab ich gelesen das man dazu eine Session erzeugen soll und dies hab ich jetzt mehrfach versucht aber es fruchtet nicht, oder ich habd en mechanismus falsch verstanden.


Das ist die Loginseite...

<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
<title>Title here!</title>
</head>
<body>
<form action=config.php method=post>

Benutzer :<input type=text name=Benutzer size=10><br>
Passwort:<input type=text name=Passwort size=10><br>

<input type=submit value=senden>
</form>

</body>
</html>


Das ist die Config.phpin der die DB als erstes angesprochen wird. Am schluß wollt ich diesen verbindungslink abspeichern in der session, so das der aktiv ist aber das ist wohl falsch, das form.html ist die nächste datei in der die eigentliche DB-Manipulation stattfindet.

<?php
session_start();
// config.php

error_reporting(E_ALL);

define('MYSQL_HOST', 'localhost');
define ('MYSQL_USER', "$_POST[Benutzer]");
define('MYSQL_PASS', "$_POST[Passwort]");
define('MYSQL_DATABASE', 'db01');

$db_link = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE);

if($db_link) {
echo "Login erfolgreich<br />\n";
} else {
echo "Login Fehlerhaft";
}

$_SESSION["db_login"]=$db_login;
include("form.html");
?>

ZapBee
2006-08-09, 11:34:13
[/PHP]
$_SESSION["db_login"]=$db_login;
[/PHP]
$db_login hat für mich keinen erkennbaren Wert. Meinst du vielleicht $db_link?

Zap

darph
2006-08-09, 11:59:06
Öhm.

Ist das überhaupt nötig, die SQL-Verbindung in einer Session zu speichern und dort quasi persistent zu halten?

reicht es nicht, wenn du zu Beginn des Scripts dein Config-File inkludierst?

$sql_server = "localhost";
$sql_dbname = "...";
$sql_user = "...";
$sql_passw = "...";

if(!$db = @mysql_connect("$sql_server", "$sql_user", "$sql_passw"))
die('An Error Occured<hr />The script was unable to connect to the database. <br />"
."Please check $dbhost, $dbuser, and $dbpasswd in config.php.');
if(!@mysql_select_db("$sql_dbname",$db))
die("An Error Occured<hr />The script was unable to find the database "
."<strong>$sql_dbname</strong> on your MySQL server. <br />Please make sure you ran the installation script.");
?>

Wo ist denn der spezifische Vorteil, die Verbindung in einer Session zu speichern?

5tyle
2006-08-09, 12:20:13
Hm ich denke du meinst die Benutzerdaten in einer Session speichern. Dafür muss auch der Session Support aktiviert sein.

Mach dazu mal eine einfache php Datei mit dem Inhalt
<?php
phpinfo();
?>
, da kannst du unter dem Punkt 'session' sehen, ob der Session Support überhaupt 'enabled' ist auf deinem Server. Näheres dazu findest du hier: http://de2.php.net/manual/de/ref.session.php

Da deine Variable keinen Wert hat, kann die Session so oder so nichts speichern. Also musst du da erst was reinschreiben, etwa so:
<?php
$db_login = $_POST[Benutzer];
$_SESSION["db_login"] = $db_login;
//$_SESSION["db_login"] würde dann immer den aktuellen Benutzernamen des Cleints beinhalten
?>
Normalerweise verwendet man Sessions aber nicht in dem Zusammenhang, da dies ein Sicherheitsproblem darstellen könnte.

Wenn du die DB-Verbindung am Anfang immer mit den Benutzerdaten öffnest, ist die immer verfügbar. Die Datenbankverbindung bleibt womöglich solange offen, bis du sie schliesst. Das solltest du immer machen, denn das kann unter bestimmten Umständen sehr negative Folgen nach sich ziehen. Deshalb schliesst man das in der Regel auch manuell wieder.
<?php
mysql_close($db_link);
?>


Tip: Mach das @ vor mysql_connect raus, das ünterdrückt nämlich evtl. wichtige Fehlerausgaben, die Aufschluß zur Ursache geben, solange du noch entwickelst.

darph
2006-08-09, 12:24:52
Die Datenbankverbindung bleibt womöglich solange offen, bis du sie schliesst. Wenn du die DB-Verbindung am Anfang immer mit den Benutzerdaten öffnest, ist die immer verfügbar. Das solltest du immer machen, denn das kann unter bestimmten Umständen sehr negative Folgen nach sich ziehen. Deshalb schliesst man das in der Regel auch manuell wieder.Also in der DB-Doku steht, daß PHP sie automatisch schließt, wenn das Script abgearbeitet ist. Die meisten Webserver sind so konfiguriert, daß das Script, selbst wenn es in einer Schleife gefangen ist, nach ca. 30 Sekunden rigoros abgeschossen wird.

Wenn man die Verbindung selbst aber in einer Session speichert, keine Ahnung, was dann passiert. ;(

5tyle
2006-08-09, 12:40:04
Also in der DB-Doku steht, daß PHP sie automatisch schließt, wenn das Script abgearbeitet ist. Die meisten Webserver sind so konfiguriert, daß das Script, selbst wenn es in einer Schleife gefangen ist, nach ca. 30 Sekunden rigoros abgeschossen wird.
Richtig, aber ein Freund hatte allerdings mal das Problem das ihn sein Provider abgemahnt hatte, weil er so viele offene Verbindungen hatte :) Das PHP-Script war zwar beendet, aber aus irgend einem Grund wurde die Verbindung zur MySQL-Datenbank nicht geschlossen. Keine Ahnung was die sich bei der Konfiguration gedacht haben. Sollte man aus reinen Sauberkeitsgründen machen denke ich mal, besonders wenn man ein Script weitergibt bzw. woanders verwendet.

ZapBee
2006-08-09, 13:25:41
Richtig, aber ein Freund hatte allerdings mal das Problem das ihn sein Provider abgemahnt hatte, weil er so viele offene Verbindungen hatte :) Das PHP-Script war zwar beendet, aber aus irgend einem Grund wurde die Verbindung zur MySQL-Datenbank nicht geschlossen. Keine Ahnung was die sich bei der Konfiguration gedacht haben. Sollte man aus reinen Sauberkeitsgründen machen denke ich mal, besonders wenn man ein Script weitergibt bzw. woanders verwendet.
Ich schließe auch am Ende jeder PHP-Seite die offenen DB-Verbindungen wieder. Sollen sie offen gehalten werden, gibt es die Funktion mysql_pconnect().

Zap

Gast
2006-08-09, 19:23:09
www.php.net/mysql_close
Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution. See also freeing resources.

The_Invisible
2006-08-09, 19:29:24
Also in der DB-Doku steht, daß PHP sie automatisch schließt, wenn das Script abgearbeitet ist. Die meisten Webserver sind so konfiguriert, daß das Script, selbst wenn es in einer Schleife gefangen ist, nach ca. 30 Sekunden rigoros abgeschossen wird.

Wenn man die Verbindung selbst aber in einer Session speichert, keine Ahnung, was dann passiert. ;(

man hat aber quasi eh nur die Resource-ID gespeichert zur offenen Datenbank, denke nicht das die beim nächsten session_start() noch verwendbar ist

mfg

MadMan2k
2006-08-10, 02:08:22
man hat aber quasi eh nur die Resource-ID gespeichert zur offenen Datenbank, denke nicht das die beim nächsten session_start() noch verwendbar ist
aber natürlich ist sie das. in der SESSION gespeichert bleibt die Verbindung standardmäßig für 24min offen, sofern der garbage colelctor nicht anders konfiguriert ist...

The_Invisible
2006-08-10, 08:29:00
aber natürlich ist sie das. in der SESSION gespeichert bleibt die Verbindung standardmäßig für 24min offen, sofern der garbage colelctor nicht anders konfiguriert ist...

habs gerade selber ausprobiert, nach dem nächsten session_start() hat die "resourceid" variable den Wert 0, kann also nicht mehr für db queries verwendet werden

mfg

ooAlbert
2006-08-10, 09:38:29
hm, nun wie lös ich jetzt mein problem? :) ich möchte das diese DB-Verbindung einmal geöffnet offen bleibt, und wenn es erstmal nur diese 24min sind. Da könnt ich zur not ja eine fehlerbehandlung einbauen und die leute logen sich erneut ein ... aber im moment verschwindet die verbindung sofort sobald ich die 2. seite öffne ...

Das mit der session id hab ich versucht, bzw. wird die mir ausgegeben aber wie ich die jetzt verwende ist unklar ...

Was wäre denn die laternative zu einer session wenn die so ein sicherheitsrisiko beinhaltet und wie würde man es dann machen?

ich hab es übrigens mal so probiert:

$db_login = $_POST[Benutzer];
$_SESSION["db_login"] = $db_login;

aber das einzige was passiert ist diese fehlermeldung:
Notice: Use of undefined constant Benutzer - assumed 'Benutzer' in C:\Programme\xampp\xampp\htdocs\config.php on line 24


Diese Fehlermeldung bekomm ich sehr häufig, und zwar jedesmalw enn ich dieses POST Array auf eine Variable übertragen will, bzw. einen bestimmten werd daraus ...

Laut dokumentation soll das bedeuten ich würde auf eine Konstate zugreifen die noch nicht definiert ist aber das ist doch nicht so der POST Array ist doch immer da, bzw. sogar mit werten gefüllt.

ZapBee
2006-08-10, 10:17:38
Sorry, wenn ich das so deutlich sage, aber Du programmierst einfach schlampig: Um das "Benutzer" in dem POST-Array müssen Anführungsstriche.
Einfach immer den Code nochmal genau durchlesen, ob die Variablen auch so heißen, wie sie sollen (siehe $db_login und $db_link), ob die Syntax richtig ist usw.

zu Deinem Problem: Wozu muß denn die DB-Verbindung ständig offen sein? Das connect() ist ja nun kein Zeitfaktor. Schreibs halt mit in die session_start()-Funktion rein, dann wirds jedes Mal mit ausgeführt, und gut is.

check_session.php

<?php
session_start();
...
$db = dbconnect(...);
?>


dein_skript.php

<?php
include('check_session.php')
...
?>


Zap

PS: siehe auch hier (http://www.forum-3dcenter.org/vbulletin/showthread.php?t=313260)

m2k-Gast
2006-08-10, 11:35:41
habs gerade selber ausprobiert, nach dem nächsten session_start() hat die "resourceid" variable den Wert 0, kann also nicht mehr für db queries verwendet werden

mfg
ja wenn du die Seite mit demselben rechner 2x aufrusfst ists klar; da wird die alte Session überschrieben.

ooAlbert
2006-08-10, 13:36:48
also mit der "check_session" istd as errreicht was ich mir gewünscht hatte :)

kann man irgendwo sehen wieviele verbindungen zur datenbank offen sind oder auslesen?

ZapBee
2006-08-10, 14:20:14
http://dev.mysql.com/doc/refman/5.1/en/server-status-variables.html
SQL-Befehl "SHOW STATUS"
Variable "Threads_connected"

The_Invisible
2006-08-10, 17:27:35
ja wenn du die Seite mit demselben rechner 2x aufrusfst ists klar; da wird die alte Session überschrieben.

nö, zwei verschiedene seiten, glaubst ich weiß nicht was ich mache?

bei der gleichen seite mit der db initialisierung kommt immer ne resource id zurück

zur besseren darstellung:

seite 1:

<?php
session_start();

$_SESSION['date'] = time();
$_SESSION['mysql_lnk'] = mysql_connect("localhost","***","***");

echo $_SESSION['mysql_lnk'];

echo "<br><br><a href='site2.php'>Next</a>";
?>


seite 2:

<?php
session_start();

echo $_SESSION['mysql_lnk'];
echo "<br>" . $_SESSION['date'];
?>


nach dem klick auf den link wird der timestamp korrekt angezeigt, die mysql resource-id ist aber weg

edit:
hier noch online: http://hadler.kirchbach.at/sessionsql/

mfg

MadMan2k
2006-08-11, 01:31:55
nach dem klick auf den link wird der timestamp korrekt angezeigt, die mysql resource-id ist aber weg
tatsache. hab mir nochmal die dokmentation vom gc angeguckt und er räumt die nicht mit persistant geöffneten verbindungen wirklich automatisch weg wohl um tausend offene verbindungen zu verhindern...