tom1921: Fehler bei m Aufruf der Globalen Varibale

Hallo,
ich möchte auf eine Super globale Variable in einer Funktion zugreifen
Die super globale Variable hat eine Instanz auf die Klasse MySQL in der meine Scripts zum Datenbank zugriff liegen.

Definition der Super Globalen Variable DB im Script: common.php

$DB = new \System\Database\MySQL(DB_SERVER,DB_USER,DB_PASSWORD,DB_NAME,DB_PORT);  

Aus irgend einem grund kann ich nicht auf diese Variable zugreifen.

Ich bekomme immer die gleiche Fehlermeldung
Notice: Undefined index: DB in C:\xampp\htdocs\HP_Favorit\scripts\session\mySession.php on line 67

Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\HP_Favorit\scripts\session\mySession.php on line 67

Allerdings, wenn ich die globale Variable prüfe bekomme ich diea Ausgabe dass diese gesetzt ist.

Ausschnitt aus dem Code PHP Script: mySession.php

    function ses_write($ses_id, $data) {  
              $sql = "Replace INTO Sessions (ses_id, ses_time, ses_value) VALUES ('12', '1234', '123')";      if (isset($GLOBALS['DB'])) {  
			echo 'Variable DB ist gesetzt! <br>' ;  
			var_dump(get_defined_vars());  
  
		}  
		$result =$GLOBALS['DB']->query($sql, true);  
		echo $result ;  
		return $result ;  
    }

Kann mir jemand helfen?
Danke

  1. Aloha ;)

    Allerdings, wenn ich die globale Variable prüfe bekomme ich diea Ausgabe dass diese gesetzt ist.
    Ausschnitt aus dem Code PHP Script: mySession.php

    function ses_write($ses_id, $data) {

    $sql = "Replace INTO Sessions (ses_id, ses_time, ses_value) VALUES ('12', '1234', '123')";      if (isset($GLOBALS['DB'])) {
    echo 'Variable DB ist gesetzt! <br>' ;
    var_dump(get_defined_vars());

      }  
      $result =$GLOBALS['DB']->query($sql, true);  
      echo $result ;  
      return $result ;  
    

    }

      
    Hm, mir springt kein Fehler ins Auge - zumal die globale Variable DB ja isset ist. Ich schätze also, dass der Fehler nicht in mySession.php liegt.  
      
    Ich schätze, dass der Hund eher hier begraben liegt:  
      
    
    > Definition der Super Globalen Variable DB im Script: common.php  
    > ~~~php
    
    $DB = new \System\Database\MySQL(DB_SERVER,DB_USER,DB_PASSWORD,DB_NAME,DB_PORT);  
    
    > 
    
    

    Mögliche Fehlerquellen:

    A) Deine Variable wird zwar gesetzt, aber aus irgendeinem Grund nicht mit einem Objekt, dass die Methode query besitzt, sondern z.B. mit einem konstanten Wert.

    B) Das Objekt DB wird zwar richtig initialisiert, die Methode query hingegen ist nicht öffentlich erreichbar (ist diese z.B private statt public)?

    Die Fehlermeldung, die du bekommst, macht Fall A wahrscheinlich.

    Ich bin aktuell gedanklich nur zu 80% in PHP und OOP war da nie meine Stärke, daher kein Gewähr. Vielleicht können routiniertere PHP-OOP'ler ergänzen und korrigieren.

    Grüße,

    RIDER

    --
    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
    ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
    1. Hallo,
      @Rider: Danke für deine Antwort.

      Habe einen NAchtrag der mich noch mehr verwirrt.

      Folgende 2 Codeschnipsel

      Code 1 funktioniert nicht
      Hier wird das Objekt außerhalb der Funktion gesetz

      	  
      $DB_neu = new \System\Database\MySQL('localhost','Ermert.T','carmen',DB_NAME,DB_PORT);  
        
      function ses_write($ses_id, $data) {  
        $sql = "Replace INTO Sessions (ses_id, ses_time, ses_value) VALUES ('123', '1234', 123')";  
        
        if (isset($GLOBALS['DB_neu'])) {  
      	echo 'Variable DB neu ist gesetzt! <br>' ;  
      	}  
      	$result = $DB_neu->query($sql, true);  
      	return $result ;
      

      Code 2 funktioniert
      Hier wird das Objekt direkt in der Funktion gesetz

        
      function ses_write($ses_id, $data) {  
           $sql = "Replace INTO Sessions (ses_id, ses_time, ses_value) VALUES ('123', '1234', '123')";  
           $DB_neu = new \System\Database\MySQL('localhost','Ermert.T','carmen',DB_NAME,DB_PORT);  
        
           if (isset($GLOBALS['DB_neu'])) {  
      	echo 'Variable DB neu ist gesetzt! <br>' ;  
      	}  
      	$result = $DB_neu->query($sql, true);  
      		  
      	return $result ;
      

      Schulussfolgerung: Es muss was mit der funktion zu tun haben, aber was?! Ich gehe mal davon aus, dass wenn der Fehler klar ist, dass ich dann auch auf die globale Variable wieder zugreifen könnte.

      DAnke für eure Hilfe!

      1. Code 1 funktioniert nicht
        Hier wird das Objekt außerhalb der Funktion gesetz

        $DB_neu = new \System\Database\MySQL('localhost','Ermert.T','carmen',DB_NAME,DB_PORT);

        function ses_write($ses_id, $data) {
          $sql = "Replace INTO Sessions (ses_id, ses_time, ses_value) VALUES ('123', '1234', 123')";

        if (isset($GLOBALS['DB_neu'])) {
        echo 'Variable DB neu ist gesetzt! <br>' ;
        }
        $result = $DB_neu->query($sql, true);
        return $result ;

          
        Wenn du in PHP eine Variable aus dem globalen Namensraum in einer Funktion benutzen willst musst du das mit dem [Schlüsselwort global](http://php.net/manual/de/language.variables.scope.php#language.variables.scope.global) "ankündigen".  
          
        MfG  
        bubble
        
        -- 
        If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
        
        1. Aloha ;)

          Wenn du in PHP eine Variable aus dem globalen Namensraum in einer Funktion benutzen willst musst du das mit dem Schlüsselwort global "ankündigen".

          Das stimmt so nicht. Die Verwendung des Schlüsselworts global - also so:

            
          $a = true;  
            
          function myFunc() {  
              globals $a;  
            
              [...]  
            
              return $a;  
          }  
          
          

          funktioniert genauso wie (wie vom TO verwendet):

            
          $a = true;  
            
          function myFunc() {  
            
              [...]  
            
              return $GLOBALS['a'];  
          }  
          
          

          Das superglobale $GLOBALS ist damit eine gleichwertige Alternative zur vorherigen Deklaration über das Schlüsselwort global

          Wie immer alle Angaben ohne Gewehr ;)

          Grüße,

          RIDER

          --
          Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
          ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
          1. Aloha ;)

            Wenn du in PHP eine Variable aus dem globalen Namensraum in einer Funktion benutzen willst musst du das mit dem Schlüsselwort global "ankündigen".

            Das stimmt so nicht. Die Verwendung des Schlüsselworts global - also so:

            $a = true;

            function myFunc() {
                globals $a;

            [...]

            return $a;
            }

            
            >   
            > funktioniert genauso wie (wie vom TO verwendet):  
            >  
            > ~~~php
              
            
            > $a = true;  
            >   
            > function myFunc() {  
            >   
            >     [...]  
            >   
            >     return $GLOBALS['a'];  
            > }  
            > 
            
            

            Das superglobale $GLOBALS ist damit eine gleichwertige Alternative zur vorherigen Deklaration über das Schlüsselwort global

            Ich hab mich auf "Code 1" bezogen, da hat er weder $GOBALS noch global verwendet (was halt zum nicht funktionieren führte), da er $DB_neu direkt verwenden wollte in beiden Snippets bin ich auf das Schlüsselwort global eingegangen und die verlinkte Handbuchseite zeigt ja gleich die beiden Varianten.

            Aber stimmt, meine Formulierung bezüglich global ist falsch.

            MfG
            bubble

            --
            If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
            1. Aloha ;)

              Ich hab mich auf "Code 1" bezogen, da hat er weder $GOBALS noch global verwendet (was halt zum nicht funktionieren führte), da er $DB_neu direkt verwenden wollte in beiden Snippets bin ich auf das Schlüsselwort global eingegangen und die verlinkte Handbuchseite zeigt ja gleich die beiden Varianten.

              Stimmt - muss ich dir recht geben ;) Ich hatte ehrlich gesagt nur noch den ursprünglichen Code im Kopf. Zwischendrin hats der TO tatsächlich falsch gemacht. Zu viele Snippets für mein Kurzzeitgedächtnis^^

              Grüße,

              RIDER

              --
              Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
              ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
    2. Vorweg ich sehe auch nicht den Fehler.

      A) Deine Variable wird zwar gesetzt, aber aus irgendeinem Grund nicht mit einem Objekt, dass die Methode query besitzt, sondern z.B. mit einem konstanten Wert.

      Laut der Notice gibt es ja den Index gar nicht, also kann das eigentlich nicht der Fall sein.

      Notice: Undefined index: DB in C:\xampp\htdocs\HP_Favorit\scripts\session\mySession.php on line 67

      B) Das Objekt DB wird zwar richtig initialisiert, die Methode query hingegen ist nicht öffentlich erreichbar (ist diese z.B private statt public)?

      Und laut Fehlermeldung ist $GLOBALS['DB'] kein Objekt.

      Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\HP_Favorit\scripts\session\mySession.php on line 67

      Zusammen ergibt das, dass $DB nicht in $GLOBALS sein kann, da die Notice darauf hindeutet dass der "Rückgabewert" null ist und die Fehlermeldung letztenendes durch (null)->query(...); entsteht.

      Rein ins blaue geraten würde mir nur einfallen, dass ses_write 2x aufgerufen wird. Als erstes nach der Erzeugung von $DB was die Debug-Meldungen vom if(isset($GLOBALS['DB']))-Zweig hervor bringt, dann wird aus irgendeinem Grund $DB gelöscht und ses_write wird danach noch mal aufgerufen, was die Notice und die Fehlermeldung hervor bringt.

      MfG
      bubble

      --
      If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
      1. Aloha ;)

        A) Deine Variable wird zwar gesetzt, aber aus irgendeinem Grund nicht mit einem Objekt, dass die Methode query besitzt, sondern z.B. mit einem konstanten Wert.
        Laut der Notice gibt es ja den Index gar nicht, also kann das eigentlich nicht der Fall sein.

        Notice: Undefined index: DB in C:\xampp\htdocs\HP_Favorit\scripts\session\mySession.php on line 67

        Nö - siehe unten.

        B) Das Objekt DB wird zwar richtig initialisiert, die Methode query hingegen ist nicht öffentlich erreichbar (ist diese z.B private statt public)?
        Und laut Fehlermeldung ist $GLOBALS['DB'] kein Objekt.

        Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\HP_Favorit\scripts\session\mySession.php on line 67

        Da stimme ich dir zu.

        Zusammen ergibt das, dass $DB nicht in $GLOBALS sein kann, da die Notice darauf hindeutet dass der "Rückgabewert" null ist und die Fehlermeldung letztenendes durch (null)->query(...); entsteht.

        Da stimme ich dir nicht zu. Auch null ist ein konstanter Wert (was Fall A entspricht), und andererseits gibt isset() auch bei null NICHT true zurück. $GLOBALS['DB'] muss also existieren und nicht null sein. Warum dann index not defined zurückkommt verstehe auch ich allerdings nicht, da hast du recht, das ist seltsam.

        dann wird aus irgendeinem Grund $DB gelöscht und ses_write wird danach noch mal aufgerufen, was die Notice und die Fehlermeldung hervor bringt.

        Plausible These - aber der Grund muss eigentlich zu finden sein.

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
        1. Aloha ;)

          Da stimme ich dir nicht zu. Auch null ist ein konstanter Wert (was Fall A entspricht), und andererseits gibt isset() auch bei null NICHT true zurück. $GLOBALS['DB'] muss also existieren und nicht null sein. Warum dann index not defined zurückkommt verstehe auch ich allerdings nicht, da hast du recht, das ist seltsam.

          Simpler Debugvorschlag an den TO: direkt vor der Stelle, die den Fehler erzeugt folgendes:

          print_r($GLOBALS);  
          
          

          Eventuell noch an einer zweiten Stelle, nämlich innerhalb if-isset, zum Vergleichen.

          Das sollte die Unklarheiten, vor denen wir eben stehen, beseitigen.

          Grüße,

          RIDER

          --
          Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
          ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
  2. Tach!

    ich möchte auf eine Super globale Variable in einer Funktion zugreifen
    Die super globale Variable hat eine Instanz auf die Klasse MySQL in der meine Scripts zum Datenbank zugriff liegen.

    Superglobale Variablen kannst du nicht selbst erstellen. Sie sind beschränkt auf das was PHP vorgibt.

    Definition der Super Globalen Variable DB im Script: common.php
    $DB = new \System\Database\MySQL(DB_SERVER,DB_USER,DB_PASSWORD,DB_NAME,DB_PORT);

    Das ist lediglich eine normale globale Variable, wenn sie im globalen Scope erstellt wurde.

    Aus irgend einem grund kann ich nicht auf diese Variable zugreifen.

    Zugreifen in Funktionen geht nur über das Schlüsselwort global oder das $GLOBALS-Array.

    Kann mir jemand helfen?

    Üblicherweise ist sowas aber schlechter Stil. Man sieht der Funktion nicht an, dass sie bestimmte Dinge voraussetzt. Eine Übergabe als Parameter zeigt das hingegen deutlich. Ein "global" gleich zu Beginn der Funktion mag einen einfach sichtbaren Hinweis demjenigen geben, der den Quelltext liest. Aber eben nur dem. Weiterhin ist eine Initialisierungsreihenfolge vorgeschrieben, ohne dass sie sich aus dem Code selbst ergibt. Wenn du das DB-Handle als Parameter übergeben müsstest, geht daraus bereits klar hervor, dass dieses zunächst erstellt werden muss.

    dedlfix.

    1. Aloha ;)

      Kann mir jemand helfen?

      Üblicherweise ist sowas aber schlechter Stil. Man sieht der Funktion nicht an, dass sie bestimmte Dinge voraussetzt. Eine Übergabe als Parameter zeigt das hingegen deutlich. Ein "global" gleich zu Beginn der Funktion mag einen einfach sichtbaren Hinweis demjenigen geben, der den Quelltext liest. Aber eben nur dem. Weiterhin ist eine Initialisierungsreihenfolge vorgeschrieben, ohne dass sie sich aus dem Code selbst ergibt. Wenn du das DB-Handle als Parameter übergeben müsstest, geht daraus bereits klar hervor, dass dieses zunächst erstellt werden muss.

      Schlechter Stil - ja. Grundsätzlich schon. Trotzdem ist es an manchen Stellen imho gerechtfertigt so vorzugehen. Z.B. dann, wenn laut Zielsetzung des Programms nie eine andere als die global definierte Datenbank zum Einsatz kommt. Dann spart ein globales Einbinden Funktionsparameter und Codekomplexität, die Klarheit, dass auf $DB zugegriffen wird, leidet aber nicht.

      Trotzdem, ob schlechter Stil hin oder her:

      Der Zugriff durch $GLOBALS müsste ja funktionieren (wie du ja erwähnt hast). Der Fehlergrund bleibt also ominös.

      Grüße,

      RIDER

      --
      Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
      ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
      1. Tach!

        Schlechter Stil - ja. Grundsätzlich schon. Trotzdem ist es an manchen Stellen imho gerechtfertigt so vorzugehen.

        Lieber fertig werden, als in Schönheit sterben. Solchen Mehraufwand bezahlt ja keiner. Allerdings kommt manchmal das böse Erwachen später, wenn durch die Folgen von verbesserungswürdiger Programmierung noch mehr Aufwand entsteht.

        Z.B. dann, wenn laut Zielsetzung des Programms nie eine andere als die global definierte Datenbank zum Einsatz kommt. Dann spart ein globales Einbinden Funktionsparameter und Codekomplexität, die Klarheit, dass auf $DB zugegriffen wird, leidet aber nicht.

        Nun, das global $DB; braucht es in jeder verwendenden Funktion. Wenn man sich nicht $GLOBALS['DB'] antun möchte. Es ist jetzt nicht so übermäßig Mehraufwand, $DB in die Parameterliste zu nehmen und beim Aufruf zu übergeben. So wie es aussieht verwendet der OP ja eine Klasse, also kann man das dem Konstruktor reinreichen und der legt sich das intern ab. Dann braucht es auch keinen Parameter, aber ein $this->db beim Verwenden. Ergebnis: kein spürbarer Mehraufwand, schlechter Stil vermieden und auch die Nebenwirkungen.

        Der Zugriff durch $GLOBALS müsste ja funktionieren (wie du ja erwähnt hast). Der Fehlergrund bleibt also ominös.

        Vielleicht ist der gezeigte Code ja nicht ganz das, was wirklich vorliegt.

        dedlfix.

        1. Aloha ;)

          Nun, das global $DB; braucht es in jeder verwendenden Funktion. Wenn man sich nicht $GLOBALS['DB'] antun möchte. Es ist jetzt nicht so übermäßig Mehraufwand, $DB in die Parameterliste zu nehmen und beim Aufruf zu übergeben. So wie es aussieht verwendet der OP ja eine Klasse, also kann man das dem Konstruktor reinreichen und der legt sich das intern ab. Dann braucht es auch keinen Parameter, aber ein $this->db beim Verwenden. Ergebnis: kein spürbarer Mehraufwand, schlechter Stil vermieden und auch die Nebenwirkungen.

          Nun, das stimmt, das ist tatsächlich eine saubere Lösung ohne Nebenwirkungen. Habenich so zwar nochnie verwendet, leuchtet aber total ein und ist des Einsetzens und Verbreitens jedenfalls würdig. Noch ein fachlich hilfreich gefällig?

          Der Zugriff durch $GLOBALS müsste ja funktionieren (wie du ja erwähnt hast). Der Fehlergrund bleibt also ominös.

          Vielleicht ist der gezeigte Code ja nicht ganz das, was wirklich vorliegt.

          Treffend formuliert. Ja, ich denke tatsächlich, das könnte das Problem sein ;)

          Grüße,

          RIDER

          --
          Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
          ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
          1. Hallo,
            und danke mal an alle! :-)

            Ich versuche jetzt mal den kompletten Code hier zu Posten oder besser den speziellen Teil um den es sich hier dreht.
            Ich vermute das es was mit dem Befehl "session_set_save_handler" zu tun hat.

            Ok. der Code setzt sich aus 4 Dateien zusammen.
            Prinzipiell geht es um das Thema Login
            Logge dich ein und deine Session wird gespeichert

            Start mit index.php was die Scripte
            checkLogin.php und class.Login.php aufruft/benutzt

            Schickt der User das Formuar ab, wird in der Funktion checkLoginData() geprüft, ob es sich um den richtig Benutzer handelt.
            -> Die Funktion ses_write würde ich gerne in der Klasse "classLogin.php" einbauen. Momentan ist diese im Script "checkLogin.php".

            Jetzt der Code
            Index.php

              
            <?php  
            require_once "../../common.php";  
            require_once "classes/class.Login.php";  
              
              
              
              
            //Kopf erstellen  
            System\HTML::printHead();  
            //Body erstellen  
            System\HTML::printBody();  
            //Überschrift erstellen  
            System\HTML::printHeadline("Login-Test");  
              
            //Neue Instanz der Klasse 'class.Login.php' anlegen -> $Login ist das Objekt  
            $LOGIN = new Scripts\Login();  
              
            echo "<br />";  
            echo "Eine richtige Kombination ist folgende:<br />";  
            echo "Login: <b>lkwpeter</b><br />";  
            echo "Passwort: <b>2FhJ1#d</b>";  
            echo "<br /><br />";  
              
            //Mit dem Objekt "Login" die Funktion "printLoginForm aufrufen - Übergabe welche funktion zum Check der Daten genommen werden soll.  
            $LOGIN->printLoginForm("checkLogin.php");  
              
              
            //Ende der Seite  
            System\HTML::printFoot();  
            ?>  
            
            

            CheckLogin.php

              
            <?php  
            require_once "../../common.php";  
            require_once "classes/class.Login.php";  
            require_once "../session/mySession.php";  
              
              
            //Login-Objekt erstellen  
            $LOGIN = new Scripts\Login();  
            //Login-Daten checken  
            $loginOK = $LOGIN->checkLoginData();  
              
            //Kopf erstellen  
            System\HTML::printHead();  
            //Body erstellen  
            System\HTML::printBody();  
            //Überschrift erstellen  
            System\HTML::printHeadline("Login-Test");  
              
            //Prüfen, ob die Authentifizierung erfolgreich war  
            if($loginOK==true){  
            	echo "<span style='color:green;'>\n";  
            	echo "Sie sind als";  
            	echo " <b><u>".$_POST['login']."</u></b> ";  
            	echo "authentifiziert worden.</span>\n";  
            	echo "<br>";  
            	ses_write('1234', 'data') ;  
            	}  
            else  
            	{  
                echo "<span style='color:red;'>";  
            	echo "Falsche Kombination angegeben.</span><br />\n";  
            	echo "<a href='index.php'>Zum Login-Formular</a>";  
            }	  
            	  
              
              
            //Ende der Seite  
            System\HTML::printFoot();  
            ?>
            

            Class Login.php

              
            <?php  
              
            namespace Scripts;  
              
              
              
            class Login  
            {  
            	  
               /**  
                * Stellt ein Login-Formular dar.  
                *  
                * @param varchar Pfad des Testskriptes für den Login  
                */  
               public function printLoginForm($checkScript = null){  
              
                //PHP-Ausgabe beenden, um "reinen" HTML-Code zu schreiben  
               ?>  
                <fieldset style="padding:2px;width:180px;border:1px solid steelblue;">  
                <legend>Login</legend>  
               	<form id="noSpaces" action="<?php echo $checkScript ?>" method="post">  
               	  
               	Login:<br />  
               	<input type="text" class="standardField" name="login" size="30" maxLength="100"><br />  
               	Passwort:<br />  
               	<input type="password" class="standardField" name="password" size="30" maxLength="100"><br />  
               	<input type="submit" onFocus="blur();" class="standardSubmit" name="doLogin" value="Anmelden">  
               	<input type="reset" onFocus="blur();" class="standardSubmit" name="reset" value="Löschen">  
               	</form>  
                </fieldset>  
                <?php  	  
                 	  
               }  
              
              
              
              
               /**  
                * Prüft, ob eine korrekte Benutzername-Password-Kombination  
                * eingegeben wurde.  
                *  
                * @return boolean Gibt zurück, ob der Login erfolgreich war oder nicht  
                */  
               public function checkLoginData(){  
               	  
               	//Erster Buchstabe des Loginnamens  
               	$firstChar = substr($_POST['login'],0,1);  
               	//Eingeschränkte Ergebnismenge  
               	$sql = "SELECT login,password FROM user WHERE login LIKE '".$firstChar."%'";  
               	//Direkt auf das globale Objekt zugreifen  
               	$result = $GLOBALS['DB']->query($sql);  
               	  
               	  	  
               	//Eingaben noch "trimmen" auf max. 100 Zeichen  
               	//ohne führende Leerzeichen  
               	$login    = trim(substr($_POST['login'],0,100));  
               	$password = trim(substr($_POST['password'],0,100));  
              
               	foreach($result as $combi){  
               		if(($login == $combi['login']) && (md5($password) == $combi['password'])){  
               				//korrekte Kombination  
            				//require_once "../session/mySession.php";  
            				echo '<br>' ; echo 'Session ID in DB schreiben - Funktion ses_write<br> <br>' ;  
               				//ses_write('1234', 'data') ;  
               				return true;  
               		}//ENDIF  
               	}//ENDFOREACH
            

            mysession.php

              
             <?php  
              
            	require_once "../../common.php"; //einbinden!!!  
              
              
                // Lifetime auf eine Stunde setzen  
                ini_set('session.gc_maxlifetime', 3600);  
                // gc mit einer Wahrscheinlichkeit von 1% aufrufen  
                ini_set('session.gc_probability', 1);  
                ini_set('session.gc_divisor', 100);  
              
                function ses_open($path, $name) {  
                    return TRUE;  
                }  
              
                function ses_close() {  
                    return TRUE;  
                }  
              
                function ses_read($ses_id) {  
                    $sql = "SELECT ses_value FROM Sessions  
                            WHERE ses_id = $ses_id";  
                    $result = @mysql_query($sql);  
                    // Fehler im Query, return leeren String  
                    if (!$result)  
                        return '';  
                    // Session nicht gefunden, return leeren String  
                    if (!mysql_num_rows($result))  
                        return '';  
              
                    // Session gefunden, return Daten der Session  
                    $row = mysql_fetch_assoc($result);  
                    return $row["ses_value"];  
                }  
            	  
                function ses_write($ses_id, $data) {  
                    $sql = "Replace INTO Sessions (ses_id, ses_time, ses_value) VALUES ('1235000', '111234', '123')";      //		('".$ses_id."', '".time()."', '".$data."')";  
            		echo '--------------- <br>  print global außerhalb if: '; echo '<br>' ;  
            		//print_r($GLOBALS); echo '<br>' ;  
            		  
            		if (isset($GLOBALS['DB'])) {  
            			echo '--------------- <br>Variable DB neu ist gesetzt! <br>' ;  
            			echo 'print global innerhalb if: '; echo '<br>' ;  
            			//print_r($GLOBALS); echo '<br>' ;  
            		}  
            		$result = $GLOBALS['DB']->query($sql);  
              
            		  
            		return $result ;  
              
                    //return (bool)@mysql_query($sql);  
                }  
              
                function ses_destroy($ses_id) {  
                    $sql = "DELETE FROM Sessions WHERE ses_id = $ses_id";  
                    return (bool)@mysql_query($sql);  
                }  
              
                function ses_gc($life) {  
                    $ses_life = time()-$life;  
              
                    $sql = "DELETE FROM Sessions  
                            WHERE ses_time < ".$ses_life." ";  
                    return (bool)@mysql_query($sql);  
                }  
              
            	session_set_save_handler ('ses_open',  
                                          'ses_close',  
                                          'ses_read',  
                                          'ses_write',  
                                          'ses_destroy',  
                                          'ses_gc');  
            	  
            	echo '<br> Session gestartet <br>' ;	  
            	session_start();  
            	  
            ?> 
            
            1. Hallo,
              habe den kompletten Code nochmal durchgeschaut.

              Leider nichts gefunden.

              Nur eins ist mir aufgefallen.

              Sobald ich im Script 'mySession.php' den Befehl
              // session_set_save_handler ('ses_open', 'ses_close', 'ses_read', 'ses_write', 'ses_destroy', 'ses_gc');
              auskommentiere funktioniert alles.

              Allerdings benötige ich doch diesen Befehl, um in meine Datenbank zu schreiben.

              Kann mir jmd. sagen woran das liegt. Muss ich auf dem Server eine Einstellung ändern?

              1. Tach!

                habe den kompletten Code nochmal durchgeschaut.

                Ich kann das nicht, weil er nicht komplett war. Das heißt aber nicht, dass du den gesamten Code posten sollst.

                Sobald ich im Script 'mySession.php' den Befehl
                // session_set_save_handler ('ses_open', 'ses_close', 'ses_read', 'ses_write', 'ses_destroy', 'ses_gc');
                auskommentiere funktioniert alles.

                Logisch, weil ja dann keinerlei problematische Funktionen mehr aufgerufen werden.

                Kann mir jmd. sagen woran das liegt. Muss ich auf dem Server eine Einstellung ändern?

                PHP hat immer Recht. Wenn PHP meint, dass da ein Index nicht existiert, dann existiert der Index nicht (zu diesem Zeitpunkt).

                Ich würde das anders strukturieren und die Abhängigkeiten als Parameter reinreichen. Dann weißt du, dass das was nicht existiert, vorher nicht ordentlich initialisiert wurde.

                Die Session-Funktionen würde ich als Methoden in eine Klasse schreiben. Dazu einen Konstruktor, der das DB-Objekt übergeben bekommt und als private Eigenschaft ablegt. Von diesem Session-Objekt erstellst du eine Instanz und übergibst dann die Methoden an session_set_save_handler() à la array($obj, 'methodenname')

                dedlfix.

            2. Moin!

              mysession.php

              function ses_open($path, $name) {
                      return TRUE;
                  }

              function ses_close() {
                      return TRUE;
                  }

              ?>

                
              Wenn du nicht willst, dass sich zwei parallele Zugriffe innerhalb einer Session gegenseitig überschreiben, musst du in diesen beiden Funktionen zwingend Locking in der Datenbank setzen und wieder freigeben!  
                
              Alle Beispielskripte, die das in Tutorials unter "Session in Datenbanken ist doch ganz einfach" abhandeln, kümmern sich um diesen entscheidenden Punkt nicht. Leider auch viele wichtige, verbreitete und große Frameworks nicht (zu kleinen kann ich nichts sagen).  
                
              Außerdem stimmt deine Aussage nicht: "Logge dich ein und deine Session wird gespeichert" ist unsinn. Eine Session existiert genau dann, wenn man session\_start() aufruft. Und es ist von der Nutzung her auch schlau, gedanklich von "Es existiert IMMER eine Session" auszugehen, und dann in den Session-Variablen nach gültigen Anmeldedaten zu gucken.  
                
              Ein Abspeichern von Session-Daten in eine Datenbank macht die Session nicht schöner. Kannst du beschreiben, warum du das machen musst?  
                
               - Sven Rautenberg
              
  3. mein Senf hierzu als Tipp:

    1. lege die MySQL-Zugangsdaten in einer Konfigurationsdatei ab, z.B. in einer .ini
    2. erstelle eine Basisklasse MySQL welche nur den DB-Handle liefert als Verbindung zu MySQL, nur diese Basisklasse braucht die Konfiguration.ini mit den Credentials

    Jetzt hast Du die Wahl:

    a) SQL-Statements überall im Code notieren zu können, einfach das DB-Handle mit new MySQL erstellen
    b) weitere DB-Klassen erstellen zu können mit auf die spezielle Anwendung zugeschnittenen Methoden, diese Klassenerweiterungen erben von der Basisklasse das Handle

    (b) hat den Vorteil, dass in Deinem Code keine SQL-Statements notiert sind, Du rufst einfach nur noch die Methoden auf. Das wird sehr übersichtlich.

    MfG

  4. Lieber tom1921,

    $DB = new \System\Database\MySQL(DB_SERVER,DB_USER,DB_PASSWORD,DB_NAME,DB_PORT);

      
    Das ist beileibe nicht dasselbe wie das hier:  
      
    ~~~php
    $GLOBALS['db'] = new \System\Database\MySQL(  
        DB_SERVER,  
        DB_USER,  
        DB_PASSWORD,  
        DB_NAME,DB_PORT  
    );
    

    Die superglobale Variable $GLOBALS speichert keinesfalls irgend welche im globalen Scope definierten Variablen als Array-Elemente! Wenn Du $GLOBALS['key'] haben willst, dann darfst Du nicht $key definieren, sondern musst explizit $GLOBALS['key'] notieren!

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Tach!

      Die superglobale Variable $GLOBALS speichert keinesfalls irgend welche im globalen Scope definierten Variablen als Array-Elemente!

      Ähm, doch, genau das ist ihre Aufgabe. $GLOBALS — References all variables available in global scope. Sie bietet Zugriff auf die im globalen Scope vorhandenen Variablen über deren Namen als Key.

      dedlfix.

      1. Lieber dedlfix,

        Ähm, doch, genau das ist ihre Aufgabe. $GLOBALS — References all variables available in global scope.

        schon wieder etwas gelernt. Danke!

        Sie bietet Zugriff auf die im globalen Scope vorhandenen Variablen über deren Namen als Key.

        Ändert sie dabei die Groß-Kleinschreibung? $DB wird dann sicherlich zu $GLOBALS['DB'] und nicht zu $GLOBALS['db']...

        Liebe Grüße,

        Felix Riesterer.

        --
        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. Tach!

          Ändert sie dabei die Groß-Kleinschreibung? $DB wird dann sicherlich zu $GLOBALS['DB'] und nicht zu $GLOBALS['db']...

          Variablennamen sind case-sensitive. Da $DB ungleich $db ist, muss das auch in $GLOBALS genauso geschrieben werden.

          dedlfix.