globale Konstante in einer Klasse definieren

erpelinho

Grünschnabel
Hallo,

kann mir einer erklären, wie ich folgende Problematik lösen könnte?

Ich habe verschiedene Schemata in meiner PostGreSQL-DB, je nachdem welcher User sich einloggt, soll als globale Konstante dieses Schema gesetzt werden.

Login-Formular enthält also zB:
1. Schema (per select-option)
2. name
3. passwort

Bisher habe ich nur ein Schema verwendet und dieses in meiner settings.php so definiert:
Code:
define("DB_SCHEMA", "schema1");

Nun hat sich das aber anders ergeben und soll quasi beim Login dynamisch passieren...
Bis jetzt läuft das so ab:

Zuerst common.php:
Code:
if(!isset($GLOBALS['DB_SCHEMA'])) {
	$DB_SCHEMA = new Schema('sessions');
}

Schema-Klasse:
Code:
class Schema { 

    public $schema;

	public function __construct($schema) {

        $this->schema = $schema;
    }
    
	public function __toString()
     {
         return $this->schema;
     }
}

Und dann beim Login:
Code:
$GLOBALS['DB_SCHEMA'] = new Schema($schema);
Wobei $schema dann das jeweilige Schema enthält..

Aber dann verändert sich der Wert von $GLOBALS['DB_SCHEMA'] nie und ist immer 'sessions'.
Liegt es daran, dass man $GLOBALS nicht mehr verändern kann, wenn es einmal zugewiesen ist? Wenn ja, wie mach ich das sonst?

Ich hoffe die Problematik ist verständlich geschildert :-)

Viele Grüße
Eric
 
Zuletzt bearbeitet:
Aber dann verändert sich der Wert von $GLOBALS['DB_SCHEMA'] nie und ist immer 'sessions'.
Liegt es daran, dass man $GLOBALS nicht mehr verändern kann, wenn es einmal zugewiesen ist?

Bist du sicher, dass sich das nicht verändert?
Das ist ja der wichtigste Unterschied zwischen Variablen und Konstanten, dass man Variablen ändern kann.

Kurzer Test:
Code:
<?php

if(!isset($GLOBALS['DB_SCHEMA'])) {
	$DB_SCHEMA = new Schema('sessions');
}


class Schema { 

    public $schema;

	public function __construct($schema) {

        $this->schema = $schema;
    }
    
	public function __toString()
     {
         return $this->schema;
     }
}

$GLOBALS['DB_SCHEMA'] = new Schema('testschema');

echo $DB_SCHEMA;
?>

Ausgabe: testschema
...die Variable wurde also geändert.
 
Hm liegt das vielleicht daran, dass der Aufruf innerhalb einer anderen Klasse erfolgt?

Code:
$GLOBALS['DB_SCHEMA'] = new Schema('testschema');
 
Nö, auch daran sollte es nicht liegen.
Hast du dein error_reporting() aktiviert?
Vielleicht tritt dort irgendwo ein anders gearteter Fehler auf.
 
Hallo,

bin nun wieder da...
Also der ändert den Wert von $GLOBALS['DB_SCHEMA'] wirklich. :-)

Probleme scheint also der Zeitpunkt der Ausgabe bzw. das Objekt an sich zu machen!?
Meine index.php sieht so aus:
Code:
<?php 

require_once("common.php");

//HTML-Objekt erstellen 
$html = new HTML();
$html->printHead(); 
$html->printBody();
 
//Inhalt der Startseite: 
?>
Startseite
<?php
 
$html->printFoot();
?>

In der common.php steht folgendes:
Code:
<?php 

#Projektpfade (Web und lokaler Pfad)  
include("paths.php");

#Datenbanksettings und weiter systemweite Einstellungen 
require_once(PROJECT_DOCUMENT_ROOT."/settings.php");

#Alle Basis-Klassen einbinden 
require_once(PROJECT_DOCUMENT_ROOT."/inc/includeAllClasses.php"); 

if(!isset($GLOBALS['DB_SCHEMA'])) {
	$DB_SCHEMA = new Schema(); // Wenn kein Parameter dann = 'sessions'
}

#Datenbankobjekt erstellen (wenn nicht bereits erstellt) 
if(!isset($GLOBALS['DB'])) {
	$DB = new PostGreSQL();
}

#global verfügbares Session-Objekt. 
new SessionHandler(); 

?>

Da bekommt $GLOBALS['DB_SCHEMA'] also den Wert 'sessions' zugewiesen.

In printHead() lasse ich mir einfach immer den Wert von $GLOBALS['DB_SCHEMA'] ausgeben. Dort steht dann aber immer 'sessions' auch nach erfolgreichem Login.
In der Login-Klasse wird aber der Wert von $GLOBALS['DB_SCHEMA'] verändert, dass habe ich bereits getestet.

Kann es sein, dass ich irgendwie auf das falsche Objekt zugreife?!
Also das mein HMTL-Objekt noch das alte ist und deshalb sich nix ändert?
Nach dem Login rufe ich einfach die Startseite wieder auf.. aber das erzeugt doch trotzdem n neues HTML-Objekt oder!?
Code:
header("Location: ".PROJECT_HTTP_ROOT);

Gruß Eric
 
Zuletzt bearbeitet:
Dort steht dann aber immer 'sessions' auch nach erfolgreichem Login.
In der Login-Klasse wird aber der Wert von $GLOBALS['DB_SCHEMA'] verändert, dass habe ich bereits getestet.
[...]
Nach dem Login rufe ich einfach die Startseite wieder auf.. aber das erzeugt doch trotzdem n neues HTML-Objekt oder!?
Code:
header("Location: ".PROJECT_HTTP_ROOT);

Variablen sind idR. nur für die Skriptlaufzeit gültig(mal von Umgebung-,Session- und Cookie-Variablen abgesehen).

Wenn du nach dem Login zu einer anderen Seite weiterleitest, ist deine beim Login erstellte Variable futsch.
 
Zurück