2009-10-21 14 views
5

Das sollte funktionieren, also bin ich wirklich perplex darüber, warum es nicht funktioniert.PHP-Variablen an eine enthaltene Datei übergeben?

Ich überprüfe, ob ein Benutzer mit einer $ Session-Methode am oberen Rand jeder Admin-Seite angemeldet ist. Ich möchte jedoch die Headerdatei dynamisch anpassen, je nachdem, ob ein Benutzer angemeldet ist und auf welcher Rollenebene dieser Benutzer verfügt.

Also überprüfe ich $session->is_logged_in() und dann ging ich voran und definierte eine Variable namens $logged = true; später verwenden. Ich benutze dann eine $user->find_by_id($session->id) Methode, um ein neues Benutzerobjekt zu erstellen und $user->role_level in einer neuen Var zu speichern, die $role_level für einfache Verwendung genannt wird.

Dies geschieht alles oben auf der Seite. Weiter unten auf der Seite Vergangenheit Formularverarbeitung, etc., ist der include("../_layouts/header.php") Befehl. Dann verwende ich in der header.php-Datei kleine Überprüfungen wie if(!$logged) { ... } else { ... }. Allerdings ...

Ich erhalte die folgenden Fehler:

Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 119 
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 131 
Notice: Undefined variable: logged in /home/hips/html/_layouts/header.php on line 138 

Wie kann das sein? Ich definiere die vars in der Datei bevor ich header.php einfüge! Sollte das nicht funktionieren?

FYI, alles funktionierte gut, bis ich versuchte, $logged in der Datei header.php zu verwenden.

+1

"$ logged" ist in jedem Fall gesetzt? Es gibt keinen möglichen Weg im Code, dass es nicht gesetzt werden könnte? Wenn Sie '$ logged =" ";' am Anfang des Skripts (vor der Definition) hinzufügen, was passiert? –

+0

Es ist mir einmal passiert, dass ich eine Datei in eine Funktion eingefügt habe. Sofern Sie die Variablen nicht als Parameter übergeben oder global definieren, sind sie in der enthaltenen Datei nicht verfügbar. Nur ein Leckerbissen. – nalply

Antwort

4

Variablen werden an die enthaltenen Dateien weitergegeben, daher muss die Variable NICHT gesetzt sein, wenn Sie das Include aufrufen: versuchen Sie es zu überprüfen, dann finden Sie heraus, warum die Variable an diesem Punkt nicht gesetzt ist. Wenn Sie zum Beispiel $ innerhalb des "if" -Blocks oder in einer Funktion definiert haben, wird es nicht außerhalb davon propagiert: Sie müssen es im äußersten Bereich definieren (auf der gleichen Ebene, auf der Sie aufrufen.)

die Include-Anweisung). Und Sie müssen es für den Fall definieren, dass der Benutzer nicht angemeldet ist, nicht nur für den Fall, wenn der Benutzer angemeldet ist. Wenn die Variable nicht auf false initialisiert wird, wird die Überprüfung, ob (! $ Protokolliert) eine Warnung ausgeben. Sage $ logged = false; zu Beginn deiner Arbeit.

+0

Dank Ihnen beiden. Die $ protokollierte Variable wird am Anfang der Datei als $ logged = false gesetzt; - Es ist sehr verwirrend. – rhodesjason

+0

Es muss eine Art Fehler sein, weil es jetzt funktioniert. Danke an alle. – rhodesjason

1

Versuchen Sie, etwas sehr einfach, wie

// file1.php 
$var = "foobar"; 

// file2.php 
include("file1.php"); // or require("file1.php"); 
die($var); 

Funktioniert es? Vielleicht ist es ein Problem außerhalb Ihres Codes.

1

Nur eine Meinung ... anstelle von Code im globalen Raum auszuführen und abhängig von einer anderen globalen Variable, die definiert wird, fügen Sie Ihre Datei überall hinzu und lassen Sie den Code innerhalb von header.php in entsprechende Funktionen organisieren. Dann, wo Sie die Ausgabe von header.php wollen, rufen Sie die entsprechende Funktion mit dem geloggten $ als Argument auf. Dadurch wird Ihr Code zusammenhängender und einfacher zu testen (wie in Komponententests).

+0

Ich bin mir nicht sicher, ob ich folge, aber ich bin daran interessiert, was du sagst. Ich speichere Benutzerdaten in einer Sitzung, so dass ich nur in der Lage sein muss, den Header HTML basierend auf der Rolle/Berechtigungen des Benutzers zu ändern. Als header.php scheinbar die Variable $ session nicht aufrufen konnte, habe ich versucht, $ logged zu deklarieren. Es sieht so aus, als ob es einen Fehler gab, der mich daran hindern konnte, beides zu tun, also kann ich jetzt wahrscheinlich zurückgehen, um einfach $ session-> usw. anzurufen. Was hast du vorgeschlagen? – rhodesjason

+0

Es bezieht sich nicht speziell auf ein Problem, das Sie möglicherweise hatten, sondern eher auf die übliche Praxis, eine Datei mit globalem Code zu haben (dh der Code befindet sich nicht in einer Funktion) und diese Datei an der gewünschten Stelle einzufügen Ausgabe, um auf der Seite angezeigt zu werden. Was ich stattdessen vorschlage, ist, dass Sie diesen Code in eine Funktion einbinden. Anstatt den Code in dieser Datei zu verwenden, der Variablen verwendet, die auf der umgebenden Seite definiert werden sollen, schreiben Sie ihn leicht um, sodass der Code die Argumente der Funktion verwendet. Dann können Sie diese Datei am Anfang der Seite (oder irgendwo) hinzufügen und sie aufrufen. – grantwparks

+0

... so könnte man 'function getPageHeader ($ bIsLoggedIn) {tun, was auf $ bIsLoggedIn basiert und das HTML als String zurückgeben; } '. Wo die Ausgabe angezeigt werden soll, können Sie 'getPageHeader ($ logged);' Dies entkoppelt den Code von globalen Variablen usw. und macht ihn wiederverwendbar und testbar. Es ist nur sicherer und weniger wahrscheinlich, dass es kaputt geht. – grantwparks

1

Anstatt if (!logged) versuchen Sie if (empty($logged)). Dadurch wird keine Benachrichtigung generiert, wenn die Variable nicht festgelegt wurde.

Verwandte Themen