kati: Sessions

Hallo !

ich habe ein paar Probleme mit sessions, weil die Werte irgendwie nicht stimmen :-( Also ich würde es jetzt gerne ein bisschen näher erklären, hoffentlich wird es mir auch gelingen.

Also: ich habe eine Titelseite so zu sagen, also die "hauptseite" index.php. Da habe ich ein php-Script eingebaut, sodass andere php-Dateien per include beim Anklicken eines javascript-Menü geladen werden können, da ich die Seite ohne Frames machen will. Das funktioniert auch wunderbar. Das Problem ist, dass sich der User zuerst authentifizieren muss, also einloggen muss. Gleichzeitig soll er sich mit der mysql-DB verbinden, falls die Kennung und Password stimmen. Da sind nur die relevanten Scripte, da das Prog schon ziemlich gewachsen ist.

---------------------------------------------------------------
INDEX.PHP

<?php
include_once "mysql.inc";

//Session starten
@session_start();

function valid($stunden) {
         $sekunden = time() + 3600 * $stunden;
         return $sekunden;
}

/*beim 2. Laden der Seite soll das Cookie gesetzt werden, zuerst
muss ja das mit dem Login erledigt werden*/

if($_SESSION["verbindung"]) {    //liefer 0 !
   if(!isset($_COOKIE[cookie_name])) {
      setcookie(cookie_name, $_POST['kennung'], valid(2));
    }
}

//TEST: ich habe mir alle Session-Variablen ausgeben lassen !
//und die verbindung ist 0 (stimmt nicht)
/*und die meldung ist immer der 1. Wert, obwohl sich eigentlich beim
wiederholenden Anmelden ändern sollte. Wieso ?*/

while (list($k, $v) = each($_SESSION)) {
//da muss ich den Wert abfragen, ob es ein Array ist !
if(is_array($v)) {
  while(list($schlüssel, $wert) = each($v)) {
     echo $schlüssel . " = " . $wert;
     echo "<br>";
  }
} else {
  echo $k . " = " . $v;
  echo "<br>";
}
}

?>

<html>
<head>
usw........................

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

MYSQL.INC

<?php
/*Klasse Connection soll sich mit dem mysql-Server verbinden und die Variable
verbindung setzen*/

class Connection {
   var $conn;

function Connection($h, $k, $p) {
     if (trim($k) == "" || trim($p) == "") {
        $this->conn = 0;
        } else {
        if ($c = mysql_connect($h, $k, $p)) {
           $this->conn = $c;
        } else {
           $this->conn = 0;
        }
     }
   }

function get_conn() {
      return $this->conn;
   }
}
?>

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

LOGIN.PHP

//eigentlich nicht interessant, nur wegen der Oberfläche
<script language= "JavaScript" type="text/javascript">
function status_zeigen(status) {
   var position = null;
   //testen, ob es gibt
   if (document.getElementsByName("status_fenster") == null)  return;
   position = document.getElementsByName("status_fenster")[0].length;
   var status_Zeile = document.createElement("option");
   status_Zeile.text = status;
   document.getElementsByName("status_fenster")[0].add(status_Zeile, position+1);
}
</script>

<?php
include_once "mysql.inc";

$status = "";
//Instanz der Klasse Connection
//Cookies werden am Anfang der Datei index.php gesetzt

$c = new Connection('localhost', $_POST['kennung'], $_POST['password']);
if($c->get_conn() == 0) {
   $status = "Verbindung konnte nicht hergestellt werden.";
} else {
   $status = "Verbindung wurde erfolgreicht hergestellt.";
   /*wenn erfolgreich, soll eine session-Variable angelegt werden,die das Connection-handle beinhält*/

//session_register() ruft implizit session_start() auf
   if(!session_is_registered("verbindung")) session_register("verbindung");
   $verbindung = $c->get_conn();
}

//jetzt eine session-Variable anlegen, die die Meldungen beinhält
if (!session_is_registered("meldung")) session_register("meldung");
//falls sich schon etwas in der "meldung" befindet, soll status angehängt werden
$meldung = array_merge($meldung, array($status));

//alle Meldungen in ein Select einlesen:
while (list($k, $v) = each($meldung)) {
 echo "<script language="JavaScript">\n";
 echo "status_zeigen('$v');\n";
 echo "</script>";
}
?>
------------------------------------------------------------------

Beim Einloggen werden folgende Werte zurückgeliefert:

  • wenn login ok:
      verbindung = resource id ... (also Connectionhandle)
      meldung = "Verbindung wurde erfolgreicht hergestellt."
  • wenn nicht ok:
      verbindung = 0;
      meldung = "Verbindung konnte nicht hergestellt werden."

Beim neuen Laden der Seite (index.php) haben die Session-Variablen aber folgende Werte:
verbindung = immer 0 !
meldung = das, was zum 1. Mal gesetzt wurde, die Session-Variable läßt sich durch ein zweites Anmelden (z.B. User hat sich zum 1. Mal vertippt und will sich zum 2. Mal korrekt anmelden) nicht ändern

Kann mir jemand helfen ?

danke
kati

  1. hallo,

    ich konnte teilweise das Problem lösen. PHP hat einen Bug, d.h. Server kann die Session-Variablen nicht richtig wiederherstellen. DAs Problem wird gelöst, wenn man in der php.ini Datei register_globals auf ON einstellt. Das 2. Problem habe ich auch schon verstanden. Sobald ich eine Konstante oder eine lokale Variable der session-Variablen zuweise (verbindung), ist alles ok. Der wert geht verloren, wenn der Wert mit einer Methode der Klasse zugewiesen wird :-( (also $verbindung = $c->get_conn();).
    Wie kann ich das Problem lösen ? Ich will auf meine Klassen nicht verzichten !

    danke
    cu kati

    1. so, ich weiß schon warum es nicht geht...
      http://www.dynamic-webpages.de/php/function.session-register.php

      ich muss aber das Connectionhandle in den globalen Namensraum reinbringen.

      cu kati

      hallo,

      ich konnte teilweise das Problem lösen. PHP hat einen Bug, d.h. Server kann die Session-Variablen nicht richtig wiederherstellen. DAs Problem wird gelöst, wenn man in der php.ini Datei register_globals auf ON einstellt. Das 2. Problem habe ich auch schon verstanden. Sobald ich eine Konstante oder eine lokale Variable der session-Variablen zuweise (verbindung), ist alles ok. Der wert geht verloren, wenn der Wert mit einer Methode der Klasse zugewiesen wird :-( (also $verbindung = $c->get_conn();).
      Wie kann ich das Problem lösen ? Ich will auf meine Klassen nicht verzichten !

      danke
      cu kati