[PHP5] Objekt Gültigkeit innerhalb eines Projekts

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [PHP5] Objekt Gültigkeit innerhalb eines Projekts

    Hallöchen Skripter und Skripterinnen.

    Ich bin (mal wieder ) ein bisschen verzweifelt. Mein Projekt läuft gut, aber es hat sich mal wieder eine seltsame Verhaltensweise meines Skripts ergeben.

    Ich erhalte folgenden Fehler:

    PHP-Code:
    Fatal errorCall to a member function assign() on a non-object in /login.php on line 13 
    In dieser Zeile wird eine Funktion der SMARTY-Klasse aufgerufen:

    PHP-Code:
    $tpl->assign('page_title''Login'); 
    Tatsächlich wird $tpl vor diesem Aufruf nicht generiert, da dies bereits in der index.php erledigt wird, in welche die login.php per require_once() eingebunden wird.

    Dort funktioniert die Klasse ohne Probleme.

    Die Frage ist jetzt wie ich es schaffe, dass das $tpl Objekt im gesamten Skript mit allen eingebundenen Dateien gültig ist.
    Ich habe es schon mit global versucht, was aber zu keinem Ergebnis geführt hat.


    Ich hoffe, mein Problem ist verständlich und ihr könnt mir helfen
    This is what happens when an unstoppable force meets an immovable object.

  • #2
    Die Frage ist jetzt wie ich es schaffe, dass das $tpl Objekt im gesamten Skript mit allen eingebundenen Dateien gültig ist.
    Wenn $tpl nicht gerade in einer Funktion o.ä. definiert wird, dann ist es in allen eingebundenen Dateien Verfügbar. Aber natürlich erst nachdem es definiert wurde:

    PHP-Code:
    include 'vorher.php';
    $tpl = new Smarty;
    include 
    'nachher.php'
    Hier ist es logischerweise erst in $nachher verfügbar, daher erscheint ein Fehler beim Ausführen von vorher.php

    Anderes Beispiel, was auf deine Situation passen könnte:

    PHP-Code:
    require_once 'inc.php';
    $tpl = new Smarty;
    require_once 
    'inc.php'
    Hier wird der Fehler von inc.php verursacht. Möglicherweise hast du nicht berücksichtigt, dass inc.php bereits vor der Definition von $tpl ausgeführt wird, daher die Fehlermeldung.

    Aber ich kann nur spekulieren. Hier musst du selbst mit konequentem Debugging ran...

    Kommentar


    • #3
      Ich bin dabei...

      Mittlerweile scheint es mir so, dass er die login.php nicht tatsächlich einbindet, da sämtliche andere Seiten, die eingebunden werden, über alle bereits definierten Objekte verfügen können.

      Deine Fehlerquellen habe ich berücksichtigt. Die Objekte werden in Zeile 23 - 27 definiert und der require_once() Befehl wird erst in Zeile 126 angewendet.

      Und auch vorher wird kein anderer include(), require() oder require_once() Befehl ausgeführt.

      Seltsamerweise also funktionieren sämtlichen anderen eingebundenen Seiten mit allen Objekten, nur diese eine eben nicht.

      Und für mein Auge sind darin keine wesentlichen Unterschiede zu den anderen Dateien zu sehen.

      Die erste Anweisung bei dieser und allen anderen Seiten ist oben genannter SMARTY-Befehl um eine Variable in die Templates zu speichern. Danach kommen sozusagen 08/15-Anweisungen einer Login-Oberfläche mit Passwortprüfung, Fehlerausgabe und Weiterleitung...
      This is what happens when an unstoppable force meets an immovable object.

      Kommentar


      • #4
        Tja, dann musst du gucken, wo der unterschied liegt. Von "außen" kann man dir jedenfalls so nicht helfen.

        Kommentar


        • #5
          Original geschrieben von ApoY2k
          Deine Fehlerquellen habe ich berücksichtigt. Die Objekte werden in Zeile 23 - 27 definiert und der require_once() Befehl wird erst in Zeile 126 angewendet.

          Und auch vorher wird kein anderer include(), require() oder require_once() Befehl ausgeführt.
          Wie kannst du ein Objekt definieren, bevor du Smarty überhaupt mit require oder include eingebunden hast? Oder arbeitest du mit Autoloading?

          Kommentar


          • #6
            Smarty wird indirekt über eine eigene Klasse, die ich geschrieben habe (Templates) eingebunden (per extends-Befehl) und vor dem definieren dieser Klasse natürlich auch mit require_once() eingebunden.

            Die Klasse Templates wird wiederum über eine __autoload()-Funktion geladen.

            Das kann aber nicht das Problem sein da es bei anderen Seiten, die genauso aufgebaut sind, funktioniert... nur bei "login.php" nicht...
            Zuletzt geändert von ApoY2k; 25.07.2008, 22:38.
            This is what happens when an unstoppable force meets an immovable object.

            Kommentar


            • #7
              Hast de Fehler immer noch nicht gefunden?

              Du brauchst doch nur Zeile für Zeile ne Testausgabe zu machen. (in der langsamsten Variante)

              Kommentar


              • #8
                Nein ich versteh einfach die Welt nicht mehr.

                Eigentlich ist das Skript total simpel...

                1. Konfigurationsdatei einbinden (Beinhaltet: Definition von Konstanten, Globalen Variablen und die __autoload()-Funktion für Klassen
                2. Einige Objekte erstellen (per __autoload werden die Dateien eingebunden)
                3. Einzubindende Datei suchen (Startseite, News, etc... Login ebenso)
                4. Datei einbinden (require_once())

                In dieser Datei werden dann alle weiteren Operationen, je nach Seite, erledigt...

                Das funktioniert auch bei allen Seiten wunderbar - News werden angezeigt, die Startseite wird geladen, statische Seiten ebenso - auch Memberlisten, Fehlerseiten... alles... nur nicht Login...

                Irgendwie ist das schon fast gruselig.


                Ich habe jetzt zum Spaß die Login komplett geleert. Theoretisch sollte nun also die index.php "leer" erscheinen, also ohne Seiteninhalt (das Gerüst außenrum erscheint ja dennoch, da dies im index Template steht).

                Ergebnis: Eine weiße Seite ohne alles.

                Anscheinend überspringt das Skript bei der Login-Seite den Befehl des Einbindens (require_once) - was aber einfach nicht sein kann, da es mit jeder anderen Seite funktioniert.

                Kann das irgendwas mit .htaccess zu tun haben? Wobei mir das auch spanisch vorkommen würde...


                Zu den Testausgaben: Ich habe mir mal in den require_once-Befehl der index-Datei reingeschrieben, dass er mir die anzuzeigende Seite ausgeben soll.

                Ergebnis was wie gewollt:

                http://www.domain.de/seite1 -> 'seite1'
                http://www.domain.de/start -> 'start'

                Aber, und jetzt kommt das schärfste:

                http://www.domain.de/login -> <gähnende leere>
                (soll heißen: weiße seite wie about:blank ^^)
                Zuletzt geändert von ApoY2k; 25.07.2008, 22:47.
                This is what happens when an unstoppable force meets an immovable object.

                Kommentar


                • #9
                  Was gibt var_dump($tpl)?

                  Ergebnis: Eine weiße Seite ohne alles.
                  Haste nen Link dahin?

                  Kommentar


                  • #10
                    Oh mein Gott... das hab ich ja noch nie gesehen.

                    Okay Leute, Panikmache ist vorbei - wobei, vll gehts auch grade erst los.

                    Ich habe grade mal vor lauter Verzweiflung zum testen einen abschließenden Slash nach login gemacht...

                    Siehe da: Die Seite wird angezeigt.


                    Also, ich bin ja mittlerweile echt kein Vollpfosten mehr was PHP und Servergeschichten angeht, aber: Was zum Teufel?!.

                    Seit wann kann ein fehlender Abschlussslash (wasn Wort o,O) das komplette Skript durcheinanderwürfeln? Das ist ja... Horror!

                    Wenn irgendein DAU jez auf die Idee kommt mal die URL selbst einzugeben ohne Slash is die Seite gleich down für ihn? Das ist ja... omg...


                    Erklär mir das bitte einer. Ist zwar schön, dass ich jetzt weiß, woran es liegt... aber warum es daran liegt, würde ich jetzt natürlich auch noch gerne wissen!
                    This is what happens when an unstoppable force meets an immovable object.

                    Kommentar


                    • #11
                      Tja, scheint als hättest du deine rewrite rules nicht unter kontrolle.

                      Erklär mir das bitte einer. Ist zwar schön, dass ich jetzt weiß, woran es liegt... aber warum es daran liegt, würde ich jetzt natürlich auch noch gerne wissen!
                      Könntest du auch alles durch gezieltes Debuggen (u.a. Testausgaben) selbst herausfinden, aber irgendwie muss ich das trotzdem in jedem Thread erwähnen. In diesem hier sogar mehrfach. my2ct.
                      Zuletzt geändert von TobiaZ; 25.07.2008, 23:37.

                      Kommentar


                      • #12
                        Ja schön... aber wie soll ich denn mit Testausgaben drauf kommen, dass es an einem abschließenden / liegt?
                        Wenn ich irgendwo eine Ausgabe hinmach, wird sie ja entweder garnicht erst geschrieben oder sie stimmt, wenn ich eine andere seite aufrufe...

                        Also meine RewriteRule sieht folgendermaßen aus...

                        Code:
                        !\.[a-z]+$ index.php
                        Ich erkenne da für mein (zugegeben für RegExp ungeübtes) Auge eigtl. kein PRoblem, das mit einem abschließenden Slash zu tun haben könnte...
                        Zuletzt geändert von ApoY2k; 26.07.2008, 09:03.
                        This is what happens when an unstoppable force meets an immovable object.

                        Kommentar


                        • #13
                          Wenn ich irgendwo eine Ausgabe hinmach, wird sie ja entweder garnicht erst geschrieben oder sie stimmt, wenn ich eine andere seite aufrufe...
                          Naja, normalerweise ist es üblich, dass die Rewirte-rule auch bestimmte Parameter übergibt. Wenn diese dann nicht erscheinen, kann man davon ausgehen, dass schon VOR der PHP-Verarbeitung etwas nicht stimmen kann.

                          Ich erkenne da für mein (zugegeben für RegExp ungeübtes) Auge eigtl. kein PRoblem, das mit einem abschließenden Slash zu tun haben könnte...
                          Ach was? Du willst mir sagen, dass du nichtmal erkennst, dass du das abschließende / nicht annähernd berücksichtigt hast?

                          Kommentar


                          • #14
                            Mir kam einfach nie in den Sinn, dass ein fehlendes / auch nur annähernd irgendwelche Probleme verursachen könnte. Das is mir völlig neu...

                            Aber naja, man lernt dazu wo man kann^^
                            This is what happens when an unstoppable force meets an immovable object.

                            Kommentar

                            Lädt...
                            X