Datenbankverbindung in session variablen

Hallo Expertengemeinde,
eine Frage zu PHP und MySQL. Macht es Sinn eine Datenbankverbindung in einer session Variablen zu speichern, oder bringt das etwa große Sicherheitsprobleme mit sich?
Danke für Euren Rat,
Gruß Netscape47Feind

Hi,
da eine Session Variable nicht zum Client gesendet wird (ausser du machst das), ist das OK.
Einzig wenn der Provider seine Sessions in einem Verzeichnis speichert (zb im tmp), welches von anderen Kunden auch gelesen werden kann ist ein Risiko vorhanden.

Gruss
Quaser

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Macht es Sinn eine
Datenbankverbindung in einer session Variablen zu speichern,

meinst du tatsächlich das datenbankhandle?
geht das denn?
warum willst du da tun?
wenn es geht, dann nur mit persistenten verbindungen, aber dann brauchst du das handle auch nciht extra speichern.

oder bringt das etwa große Sicherheitsprobleme mit sich?

naja, sessions lassen sich unter umständen übernehmen.

Datenbankverbindung in session variablen
Hi, danke euch erstmal für die antworten.
Ja ich hatte mir überlegt das Datenbankhandle in einer session variablen zu speichern, weil ich mir so dachte ein paar connects zu sparen. Ob das performanter ist - keine Ahnung. Bei persistenten Verbindungen (sind doch die die man mit mysql_pconnect() öffnet oder?) hab ich einfach die Befürchtung, dass irgendwann wegen zuvieler Verbindungen die Datenbank streikt. Bei Sessions kann ich zumindest sicher sein, dass sie zeitnah ablaufen.
Ich lass mich aber gerne belehren, wenn schon jemand gute Erfahrungen mit persistenten Verbindungen gemacht hat?
Ansonsten danke für die Hilfe
Netscape47Feind

Hi, danke euch erstmal für die antworten.
Ja ich hatte mir überlegt das Datenbankhandle in einer session
variablen zu speichern, weil ich mir so dachte ein paar
connects zu sparen.

das handle wird aber automatisch geschlossen, wenn das script beendeet wird.

Ja ich hatte mir überlegt das Datenbankhandle in einer session
variablen zu speichern, weil ich mir so dachte ein paar
connects zu sparen. Ob das performanter ist - keine Ahnung.

Das DB-Handle zu speichern ist relativer Blödsinn. Das Handle in irgendeiner Variable garantiert dir nicht, dass die Verbindung noch offen ist. Das hängt auch von den Server-Einstellungen ab, manche lassen gar keine persistenten Verbindungen zu. Auch in diesem Fall müsstest Du aber immer mysql_pconnect aufrufen. Wenn Du mysql_pconnect verwendest, wird nicht sofort eine neue Verbindung aufgebaut, sondern zuerst eine offene gesucht. Persistente Verbindungen benötigen aber zusätzliche Ressourcen auf dem Server.

Bei persistenten Verbindungen (sind doch die die man mit
mysql_pconnect() öffnet oder?) hab ich einfach die
Befürchtung, dass irgendwann wegen zuvieler Verbindungen die
Datenbank streikt.

Ja, besonders wenn das Skript abstürzt und viele Benutzer auf der Seite sind, bleiben die Verbindungen noch lange offen. Ich würde definitiv zu mysql_connect raten.

Ich lass mich aber gerne belehren, wenn schon jemand gute
Erfahrungen mit persistenten Verbindungen gemacht hat?

Ich verwende etwas in dieser Art (der heilige Grahl ist es nicht, aber es funktioniert sehr fix und hat sich bewährt)

class.db.php:
<?php class DB {<br /> var dbhost;
 var dbname;
 var user;
 var pass;

 var conn;

 function DB() {
 $this-\>dbhost = "hostname";
 $this-\>dbname = "dbname";
 $this-\>user = "username";
 $this-\>pass = "passwort";
 $this-\>reconnect();
 register\_shutdown\_function(array(&$this, 'disconnect'));
 }

 function reconnect() { 
 $this-\>conn = @mysql\_connect($this-\>dbhost, $this-\>user, $this-\>pass);
 if (!$this-\>conn) {
 die("Konnte keine Verbindung zum MySQL-Server aufbauen. : ".mysql\_error());
 mysql\_select\_db($this-\>dbname); 
 } // Reconnect

 function query($query) { 
 if (!$this-\>conn) $this-\>reconnect();
 $result = @mysql\_query($this-\>qry, $this-\>conn);
 if (mysql\_errno()) {
 print("Query '$query ' lieferte einen Fehler ".$mysql\_errno()." : ".mysql\_error());
 }
 return $result;
 }


 function disconnect() {
 mysql\_close($this-\>conn);
 }
}
?\>





dbsession.php:
<?php require_once "class.db.php";<br />
session\_start();
if (!session\_is\_registered("db")) {
 $db = new DB;
 session\_register("db");
}
?\>




index.php:
<?php require "dbsession.php"; //initialisierung/registrierung des Objekts<br />
$rows = $db-\>query("SELECT FELD1, FELD2 FROM TABELLE WHERE ATTRIBUT=WERT");
while(list($wert1, $wert2) = mysql\_fetch\_row($rows)) {
 ....

?\>

Du registrierst also das Objekt in der Session und lässt es für dich die Verbindung zur DB garantieren.

Gruß,
Rudy

Hi Rudy und Dog.je,
danke für Eure Hilfe, besonders für die Klasse, Rudy. Wie es wohl aussieht hattet ihr Recht und meine planung war falsch.
Ich werde mich deshalb mit normalen connects begnügen, aber irgenwann kann man das mit den persistenten verbindungen ja mal gebrauchen. Habe eben -spät aber doch- im PHP Handbuch eine klitze kleine Anmerkung gefunden:

„Gegenwärtig ist es nicht möglich, Ressourcen-Variablen in einer Session zu registrieren. Zum Beispiel können Sie nicht erwarten, dass die als Session-Variable gespeicherte Verbindungs-Kennung der zu einer Datenbank aufgebauten Verbindung bei der nächsten Wiederherstellung der Session noch gültig ist.“

Was eure Ausführungen unterstreicht. Also danke nochmal, gut das ich nochmal nachgefragt hab :smile: Gruß
Netscape47Feind

handle wird geschlossen

das handle wird aber automatisch geschlossen, wenn das script
beendeet wird.

Ich kann mir also mysql_free_result($result); und mysql_close(); sparen? Die Ressourcen werden von allein freigegeben, wenn ich das Script beende?

das handle wird aber automatisch geschlossen, wenn das script
beendeet wird.

Ich kann mir also mysql_free_result($result); und
mysql_close(); sparen? Die Ressourcen werden von allein
freigegeben, wenn ich das Script beende?

http://de2.php.net/manual/de/language.types.resource…
http://de2.php.net/manual/de/function.mysql-free-res…