session_set_save_handler
rüdiger
- php
0 Waberham
Hallo
Ich habe anhand des Buches "PHP 4 - Grundlagen und Profiwissen" Von J. Krause versucht, meine "eigene Session" zu erstellen. Ich habe den Code aus dem Beispiel im Buch übernommen und ihn auf mein Script angepasst. Doch irgendwie ist etwas faul. Nicht nur, dass die open-Funktion keine session_id findet, es wird auch folgendes angezeigt:
// ****************
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at [...]header/functions_session.php:21) in [...]header/functions_session.php on line 96
// ****************
In function_session.php befinden sich die Funktionen (hee) und folgendes:
// ****************
// Session setzten
session_module_name("user");
session_set_save_handler('ses_open', 'ses_close', 'ses_read', 'ses_write', 'ses_destroy', 'ses_gc');
session_name('SESSION');
// Datenbankverbindung
$conn=mysql_connect($mhost, $muser, $mpass);
mysql_select_db($mbase, $conn);
session_start();
$sid=session_id();
mysql_close($conn);
// ****************
in line 96 steht eben dieses session_start(); (siehe oben)
weiter oben steht die open-funktion (line 21 beinhaltet merkwürdigerweise meine test-anweisung: "echo $string" (siehe unten))
// ****************
function ses_open($sespath, $sesname) {
global $conn, $timer;
$fdb = new database;
$sid=session_id();
$string="select * from ".$fdb->tsession." where DID
='".$sid."'";
$rs=mysql_query($string, $conn);
if(mysql_num_rows($rs)==0) $string="insert into ".$fdb->tsession." set DID
='".$sid."' and Dtime
='".$timer."'";
else $string="update ".$fdb->tsession." set Dtime
='".$timer."' where DID
='".$sid."'";
echo $string;
return @mysql_query($string,$conn);
}
[...]
// ****************
Weiß jemand von euch, woran es liegen könnte, bzw. was ich falsch gemacht habe?
Vielen Dank und liebe grüße
Rüdiger
Ich habe anhand des Buches "PHP 4 - Grundlagen und Profiwissen"
Oha, wo "Profiwissen" draufsteht, ist erfahrungsgemäß selten Profiwissen drin.
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at [...]header/functions_session.php:21) in [...]header/functions_session.php on line 96
Um eine Sitzung über mehrere Anfragen halten zu können, muss PHP ein Cookie setzen, und um ein Cookie zu setzen, muss PHP eine HTTP-Kopfzeile namens Set-Cookie schicken. Kopfzeilen kommen (wie bei einer E-Mail) vor dem Seiteninhalt, was im Umkehrschluss bedeutet, dass kein Kopf mehr geschickt werden kann, wenn der Inhalt erstmal raus ist, was wiederum das Aus für den Cookie-Versand bedeutet und schlussendlich die gesamte Sitzung über den Jordan gehen lässt.
Die Ursache für obige Meldung ist also, dass session_start() zu spät aufgerufen wird, weil schon vorher irgendetwas ausgegeben wurde. Dafür reicht es (je nach PHP-Konfiguration) schon, wenn das Skript statt mit "<?php" mit einem einzelnen Leerzeichen beginnt.