Session via PHP
Christian
- php
0 kati0 Sven Rautenberg0 Christian
Hallo,
ich habe pronleme mit der Session_start() Funktion in meinem Script.
Ich habe mir die Fallback-Klasse 2.0 von <a href="http://www.develnet.org/tech/tutorials/2.1.html">http://www.develnet.org/tech/tutorials/2.1.html</a> runtergeladen und das dazugehörige Test-Script.
Wenn ich das Testscript aufrufe wird aber immer die Meldung "Der Client nimmt keine Cookies an! Wir brauchen einen Fallback." ausgegeben.
Das ist aber nicht richtig, da ich den cookie in meinem Temp-Pfad sehen kann.
Ich benutze PHP 4.2.1, den Apache 2.0.39 und entweder den MSIE 6.0 oder den Netscape 7.0 Beta Browser.
Schaut euch das Script mal an:
[test.session.php]
<?php
// Session initialisieren
require_once ('class.Session.inc.php');
$Session =& Session::getInstance();
$Session->init();
// Für die Funktion hab ich keine erklärung ???
function foo() {
$Session =& Session::getInstance();
echo $Session->url('test.session.php');
}
if ($Session->bUsesFallback)
{ echo "<P>Cookie wurde gesetzt. ";
echo "Kein Fallback nötig.</P>\n";
}
else{
echo "<P>Der Client nimmt keine Cookies an! ";
echo "Wir brauchen einen Fallback.</P>\n";
}
?>
[class.Session.inc.php]
class Session {
var $bUsesFallback = false;
// --- Singleton ------------------------------------------------
function &getInstance() {
static $Instance;
if (!isset($Instance)) { $Instance = new Session(); }
return $Instance;
}
function init($bUseFallback = true, $sIgnore = '',$sessionName = 'sid') {
global $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_COOKIE_VARS;
session_name(isset($sessionName) ? $sessionName : session_name());
@session_start();
// ----------------------------------------------------------
// Check if we should ignore user agents
/*
$bIgnore = false;
$aIgnore = explode(',', $sIgnore);
$sAgent = strtolower(getenv('HTTP_USER_AGENT'));
for ($i=0; $i<sizeof($aIgnore); $i++) {
$sStr = trim(strtolower($aIgnore[$i]));
if (strlen($sStr) > 0 && substr_count($sAgent, $sStr) > 0) {
$bIgnore = true;
break;
}
}
*/
// ----------------------------------------------------------
if (!$bUseFallback || $bIgnore) {
$this->bUsesFallback = true;
return;
}
// ----------------------------------------------------------
header('Expires: Sat, 05 Aug 2000 22:27:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Cache-Control: post-check=0, pre-check=0');
// Generate a new session id if given session seems wrong
if (strlen(session_id()) != 32) {
mt_srand ((double)microtime()*1000000);
session_id(md5(uniqid(mt_rand())));
}
// ----------------------------------------------------------
if (isset($_GET)) {
$aGet = &$_GET;
$aPost = &$_POST;
$aCookie = &$_COOKIE;
} else {
$aGet = &$HTTP_GET_VARS;
$aPost = &$HTTP_POST_VARS;
$aCookie = &$HTTP_COOKIE_VARS;
}
// ----------------------------------------------------------
$bGotSid = false;
if (isset($aCookie[session_name()])
&& @strlen($aCookie[session_name()]) == 32) {
$bGotSid = true;
}
if (isset($aPost[session_name()])
&& @strlen($aPost[session_name()]) == 32) {
$bGotSid = true;
}
if (isset($aGet[session_name()])
&& @strlen($aGet[session_name()]) == 32) {
$bGotSid = true;
}
if (!$bGotSid) {
$this->redirectTo(getenv('REQUEST_URI'));
}
if (isset($aCookie[session_name()])
&& @strlen($aCookie[session_name()]) == 32) {
$this->bUsesFallback = true;
}
}
Hallo, also wenn ich mir das Script anschaue..
im Testscript befindet sich folgendes:
das bedeutet, dass positive Meldung kommt, wenn $Session->bUsesFallback true zurückliefert.
if ($Session->bUsesFallback)
{ echo "<P>Cookie wurde gesetzt. ";
echo "Kein Fallback nötig.</P>\n";
}
else{
echo "<P>Der Client nimmt keine Cookies an! ";
echo "Wir brauchen einen Fallback.</P>\n";
}
und in der Klasse ist der Wert der Variable false (Initialisierung) und nachher in einem bestimmten Falle wird true gesetzt - nämlich wenn keine Cookies akzeptiert werden.
if (!$bUseFallback || $bIgnore) {
$this->bUsesFallback = true;
return;
}
Also meiner Meinung nach fehlt ein ! (Negierung) vorm
if ($Session->bUsesFallback)
Also ändere die Zeile im Testscript:
vorher: if ($Session->bUsesFallback)
nachher: if (!$Session->bUsesFallback)
cu kati
Hallo,
ich habe pronleme mit der Session_start() Funktion in meinem Script.
Ich habe mir die Fallback-Klasse 2.0 von <a href="http://www.develnet.org/tech/tutorials/2.1.html">http://www.develnet.org/tech/tutorials/2.1.html</a> runtergeladen und das dazugehörige Test-Script.
Wenn ich das Testscript aufrufe wird aber immer die Meldung "Der Client nimmt keine Cookies an! Wir brauchen einen Fallback." ausgegeben.
Das ist aber nicht richtig, da ich den cookie in meinem Temp-Pfad sehen kann.
Ich benutze PHP 4.2.1, den Apache 2.0.39 und entweder den MSIE 6.0 oder den Netscape 7.0 Beta Browser.
Schaut euch das Script mal an:
[test.session.php]
<?php
// Session initialisieren
require_once ('class.Session.inc.php');
$Session =& Session::getInstance();
$Session->init();
// Für die Funktion hab ich keine erklärung ???
function foo() {
$Session =& Session::getInstance();
echo $Session->url('test.session.php');
}
if ($Session->bUsesFallback)
{ echo "<P>Cookie wurde gesetzt. ";
echo "Kein Fallback nötig.</P>\n";
}
else{
echo "<P>Der Client nimmt keine Cookies an! ";
echo "Wir brauchen einen Fallback.</P>\n";
}
?>
[class.Session.inc.php]
class Session {
var $bUsesFallback = false;
// --- Singleton ------------------------------------------------
function &getInstance() {
static $Instance;
if (!isset($Instance)) { $Instance = new Session(); }
return $Instance;
}
function init($bUseFallback = true, $sIgnore = '',$sessionName = 'sid') {
global $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_COOKIE_VARS;
session_name(isset($sessionName) ? $sessionName : session_name());
@session_start();
// ----------------------------------------------------------
// Check if we should ignore user agents
/*
$bIgnore = false;
$aIgnore = explode(',', $sIgnore);
$sAgent = strtolower(getenv('HTTP_USER_AGENT'));
for ($i=0; $i<sizeof($aIgnore); $i++) {
$sStr = trim(strtolower($aIgnore[$i]));
if (strlen($sStr) > 0 && substr_count($sAgent, $sStr) > 0) {
$bIgnore = true;
break;
}
}
*/
// ----------------------------------------------------------
if (!$bUseFallback || $bIgnore) {
$this->bUsesFallback = true;
return;
}
// ----------------------------------------------------------
header('Expires: Sat, 05 Aug 2000 22:27:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Cache-Control: post-check=0, pre-check=0');
// Generate a new session id if given session seems wrong
if (strlen(session_id()) != 32) {
mt_srand ((double)microtime()*1000000);
session_id(md5(uniqid(mt_rand())));
}
// ----------------------------------------------------------
if (isset($_GET)) {
$aGet = &$_GET;
$aPost = &$_POST;
$aCookie = &$_COOKIE;
} else {
$aGet = &$HTTP_GET_VARS;
$aPost = &$HTTP_POST_VARS;
$aCookie = &$HTTP_COOKIE_VARS;
}
// ----------------------------------------------------------
$bGotSid = false;
if (isset($aCookie[session_name()])
&& @strlen($aCookie[session_name()]) == 32) {
$bGotSid = true;
}
if (isset($aPost[session_name()])
&& @strlen($aPost[session_name()]) == 32) {
$bGotSid = true;
}
if (isset($aGet[session_name()])
&& @strlen($aGet[session_name()]) == 32) {
$bGotSid = true;
}
if (!$bGotSid) {
$this->redirectTo(getenv('REQUEST_URI'));
}
if (isset($aCookie[session_name()])
&& @strlen($aCookie[session_name()]) == 32) {
$this->bUsesFallback = true;
}
}
Aloha!
Ich habe mir die Fallback-Klasse 2.0 von <a href="http://www.develnet.org/tech/tutorials/2.1.html">http://www.develnet.org/tech/tutorials/2.1.html</a> runtergeladen und das dazugehörige Test-Script.
Ich frage mich ganz schlicht: Warum?
Du mußt dennoch manuell an allen möglichen Stellen die Links erweitern, um die Fallback-Funktionalität herzustellen. Das kann man auch billiger haben, indem man schlicht die PHP-Funktion nimmt und an den benötigten Stellen die Konstante SID als Linkparameter oder Formularfeld ausgibt.
Ich habe auf die Schnelle auf der angegebenen Seite nichts gefunden, was nicht auch mit "purem" PHP funktionieren würde. Der etwas diffuse Hinweis auf Fehler in PHP ist IMO nicht unbedingt stichhaltig. Man benötigt auch keine "register_globals" - lediglich ein Cookie sollte die Session-Eröffnung in PHP schon setzen (wobei ich schon den Fall hatte, genau dieses _nicht_ zu wollen), und das kann man eigentlich erwarten. trans_sid kann man nicht unbedingt erwarten, aber wie gesagt: Den Aufwand hat man so und so, wenn man drumherum arbeiten muss.
- Sven Rautenberg
Vielen Dank für eure Antworten, aber weiter bin ich immer noch nicht gekommen.
Ich hab jetzt denke ich festgestellt, daß die Variable $bUsesFallback
keinen Wert hat.
Ich kann das aber nicht genau beurteilen, da ich mich mit Klassen noch nicht auskenne ich hab einmal in der Klasse selber echo this->$bUsesFallback; und echo $bUsesFallback; ausprobiert und das gleiche im test_Script jedes mal ohne Ausgabe!?
Auch $HTTP_COOKIE_VAR hat keinen Wert. Wie genau sollte der Wert bei einem Cookie eigentlich aussehen wenn man ihn mit session_start(); erstellt? So: [Session_name] => Session_id
Aloha!
Auch $HTTP_COOKIE_VAR hat keinen Wert. Wie genau sollte der Wert bei einem Cookie eigentlich aussehen wenn man ihn mit session_start(); erstellt? So: [Session_name] => Session_id
Wenn $HTTP_COOKIE_VARS keinen Wert hat, dann ist kein Cookie gesetzt. Würde ich mal vermuten.
Ansonsten: session_start() ist die PHP-eigene Funktion für Sessions (läuft meines Erachtens bestens, also - wie schon erwähnt - keine Notwendigkeit für externe Session-Klassen). Die kannst du natürlich nicht mixen.
Du kannst mit session_name() den Namen des Cookies setzen - Default ist "PHPSESSID", und der Wert ist eine 32-stellige Hex-Zahl.
Folglich taucht in einer oder mehrerer der Variablen $HTTP_COOKIE_VARS, $HTTP_GET_VARS oder $HTTP_POST_VARS ein Element "PHPSESSID" auf und hat die Session-ID als Wert.
- Sven Rautenberg
Aloha!
Aloha
Auch $HTTP_COOKIE_VAR hat keinen Wert. Wie genau sollte der Wert bei einem Cookie eigentlich aussehen wenn man ihn mit session_start(); erstellt? So: [Session_name] => Session_id
Wenn $HTTP_COOKIE_VARS keinen Wert hat, dann ist kein Cookie gesetzt. Würde ich mal vermuten.
Leider doch in meinem serverseitigem Cookie-Temp Pfad sehe ich die entspechende Session sess_245...... auch wenn ich Variablen in der Session speichere finde ich sie in der Datei. Allerdings sehe ich keinen cookie in meinem Browser-Temp Pfad obwohl ich cookies eingeschaltet habe.
Ansonsten: session_start() ist die PHP-eigene Funktion für Sessions (läuft meines Erachtens bestens, also - wie schon erwähnt - keine Notwendigkeit für externe Session-Klassen). Die kannst du natürlich nicht mixen.
Ja ich möchte aber meine Kommandozeilenparameter so gering wie möglich halten. Mit der Klasse funktioniert auch die übergabe der Session ID über die Kommandozeile aber wenn cookies schon akzeptiert werden warum soll ich dann den ganzen Warenkorb in der Kommandozeile speichern.
Du kannst mit session_name() den Namen des Cookies setzen - Default ist "PHPSESSID", und der Wert ist eine 32-stellige Hex-Zahl.
Folglich taucht in einer oder mehrerer der Variablen $HTTP_COOKIE_VARS, $HTTP_GET_VARS oder $HTTP_POST_VARS ein Element "PHPSESSID" auf und hat die Session-ID als Wert.
Wie gesagt funktioniert auch bei $HTTP_GET_VARS und $HTTP_POST_VARS nur eben nicht mit cookie, habe auch versucht den cookie manuell zu setzen. Aber in $HTTP_COOKIE_VARS war auch hier kein Wert gestanden!?
- Sven Rautenberg
Kann es sein, daß ich irgend eine Einstellung verbockt habe?
Grüsse, Christian
Aloha!
Aloha
Aloha! Hallo, Echo! :)
Kann es sein, daß ich irgend eine Einstellung verbockt habe?
Klar kann das sein.
Ich frage mich und _dich_ aber immer noch ernsthaft, warum du diese Fallback-Klasse verwenden willst. Sie ist in meinen Augen überflüssig.
Hast du schon versucht, die Session-Funktionen von PHP zu verwenden? Die funktionieren prima, auch ohne lange URL-Parameter. Im Fallback-Falle wird nur die Session-ID an die URL angehängt - und das meist sogar automatisch. Diese Methode ist also viel komfortabler, als mit dieser Klasse zu arbeiten.
- Sven Rautenberg
Ich frage mich und _dich_ aber immer noch ernsthaft, warum du diese Fallback-Klasse verwenden willst. Sie ist in meinen Augen überflüssig.
Hast du schon versucht, die Session-Funktionen von PHP zu verwenden? Die funktionieren prima, auch ohne lange URL-Parameter. Im Fallback-Falle wird nur die Session-ID an die URL angehängt - und das meist sogar automatisch.
Verstehe ich Dich richtig, PHP bietet auch ein Fallback im falle das keine cookies angenommen werden und übergibt die Session ID als GET Parameter? Und kannst Du etwas näher auf meist sogar automatisch eingehen?
Diese Methode ist also viel komfortabler, als mit dieser Klasse zu arbeiten.
- Sven Rautenberg
Danke, Christian
Aloha!
Verstehe ich Dich richtig, PHP bietet auch ein Fallback im falle das keine cookies angenommen werden und übergibt die Session ID als GET Parameter?
Korrekt.
Und kannst Du etwas näher auf meist sogar automatisch eingehen?
Es gibt die Möglichkeit, dass die Option "enable_trans_sid" in PHP eingeschaltet ist. Dann werden alle Links der Seite, die auf lokale Seiten verweisen, geparst, d.h.: Wenn kein Cookie gesetzt ist, wird die Session-ID automatisch an den Link drangehängt. Auch Formulare erhalten auf diese Weise ein verstecktes Formularfeld.
Nachteil: Die Methode arbeitet nicht mit Javascript-Links zusammen. Und da sie alle Links suchen muss, kostet es etwas Performance. Außerdem muss "trans_sid" nicht eingeschaltet sein - dann musst du trotzdem (genau wie bei deiner jetzigen Klasse) dem Link den URL-Parameter mitgeben.
Diese Methode ist also viel komfortabler, als mit dieser Klasse zu arbeiten.
Zumindest genauso komfortabel.
Lies einfach mal das entsprechende Kapitel in der PHP-Doku durch:
http://www.php.net/manual/de/ref.session.php - in der Nähe von Beispiel 5 wird die Vorgehensweise mit der Konstanten SID erläutert.
- Sven Rautenberg
Danke für Deine Antworten.
Noch nen schönen Tag. Und vieleicht bis bald. MfG Christian