[PHP5] Was bedeutet diese Meldung?

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

  • [PHP5] Was bedeutet diese Meldung?

    Nabend alle zusammen,

    Ich habe jetzt schon das zweite mal nach Monaten diese Meldung und weiß nicht ob ich da was falsch mache oder obs an meinem Server liegt.

    Ich schreibe ganz normal in die Session und nach 2 oder 3 x aktualisieren kommt diese Fehlermeldung.

    Warning: in_array() [function.in-array]: Wrong datatype for second argument .....
    Fatal error: Cannot use object of type __PHP_Incomplete_Class as array in......

    Das zerschießt mir jedesmal die komplette Session irgendwie.
    Was mach ich denn da falsch?
    Hoffe Ihr könnt mir hier einen Rat geben...

    Mario

  • #2
    versuche erst mal, den fehler zu reproduzieren. lass dir vor dem aufruf von in_array die parameter mit var_dump ausgeben und zeig, was der var_dump ergibt, wenn der fehler auftaucht, vielleicht hilft das.

    p.s. auch interessant: http://bugs.php.net/bug.php?id=23315
    you need to make sure that all the classes reference by the session object are loaded before you call session start.

    Kommentar


    • #3
      [PHP5] Fehler

      Also ich lasse in $_SESSION["module"] grundsätzlich nur einen String eintragen. var_dump gibt mir hier zB. string(5) "test2" aus.

      Ich vermute es hängt irgendwie mit meinen Klassen zusammen.
      Ich habe eine kleine Klasse "modul", in welches ich über wenige Methoden ganz einfach bestimmte Eigenschaften setzen lassen kann.
      Zusätzlich beinhaltet diese Klasse aber auch noch eine Methode "init", in der ich über eine weitere Klasse von mir einen DatenbankSelect ausführen lasse bzw. auch etwas in die DB schreiben lasse, wenn nötig.
      Könnte es evtl. mit dem Nutzen einer weiteren Klasse in der "modul"-Klasse liegen?`

      An der Stelle, wo ich den Datenbankzugriff braucht, erstelle ich auch erst das DB Objekt dafür...
      Ich hab in anderen Posts schon sowas ähnliches gelesen, dass man da beim beim anwenden von Klassen in Klassen aufpassen muss, WIE man vorgheht.

      Mario

      Kommentar


      • #4
        interessant ist die situation, in der der fehler auftritt.

        Kommentar


        • #5
          [PHP5] Fehler

          Ich hab gestern schon versucht den Fehler zu rekonstruieren und einzugrenzen. Es scheint meine Klasse für den Datenbankconnect zu sein, die den Fehler verursacht. Sobald ich dort einen query reingebe und er diesen erfolgreich ausführt, passiert der Fehler... allerdings erst nach 1 - 2 Refresh der Seite. Und genau das versteh ich halt nicht.

          Ich nutze diese Klasse schon länger. Bisher aber halt nur außerhalb von anderen Objekten. Und da lief sie absolut fehlerfrei bisher...
          Ich kann den Fehler nicht wirklich nachvollziehen oder sagen an welcher Position im Code das ganze passiert, da meine DB Klasse ansich fehlerfrei arbeitet.

          Mario

          Kommentar


          • #6
            Hi,

            die klassendeklaration ist nicht in der datei verfügbar in der
            du versuchst die instanz der klasse zu deserialisieren.

            Deswegen bekommst du eine incomplete class.
            Inkludiere die klassendeklaration in der entsprechenden datei.

            greets
            (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

            Kommentar


            • #7
              Fehler

              Ich befinde mich in meiner cms.php. In Dieser deklariere ich erstmal mein Modul auf zB folgende Weise:

              PHP-Code:
              $test = new modul"test" );
              $test->init(); 
              ... innerhalb dieses Objects versuche ich bisher in der "init" Methode meinen Datenbankzugriff durchzuführen. Hierzu deklariere ich erst IN der init Methode mein Datenbankobject wie folgt:

              PHP-Code:
              $db_modul_init = new db_query();
              $db_modul_init->add_query"SELECT......FROM...""MYSQL" );
              $db_modul_init->result(); 
              Wenn ich dich richtig verstanden habe, dann kann oder darf ich nicht einfach in einem Object wieder ein neues Object einer weiteren Klasse deklarieren... oder? Wie müsste ich dann vorgehen?
              Ich möchte ja zukünftig beliebig viele Objekte ineinander verschachtelt nutzen. Wenn ich meine Objecte außerhalb deklariere, dann habe ich ja innerhalb eines anderen Objects keinen Zugriff darauf.

              Mario

              Kommentar


              • #8
                Hi,

                nein du wirfst die begriffe declaration, definition und instanzierung
                durcheinander. Die deklaration gibt an wie deine klasse aufgebaut
                ist. D.h. welche member und welche methoden sie besitzt.
                In php werden declaration und definition von methoden in einer
                datei vorgenommen.
                PHP-Code:
                class Foo{
                   public function 
                bar($baz){ // <-- deklaration
                      //alles was hier passiert gehört zur definition
                         
                return $baz;
                   }

                Damit klassen die instanziert und später serialisiert wurden,
                an einer anderen stelle wieder vollständig deserialsiert werden können,
                muss der interpreter die deklaration der klasse kennen. Du musst
                also die datei in der die klasse deklariert wurder inkludieren.

                greets
                (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                Kommentar


                • #9
                  Fehler

                  Hi,

                  sämtliche Klassen werden bei mir generell in der Hauptdatei includiert, ich hab sie somit überall zur Verfügung.
                  Die Klasse wird ja auch einmal durchgeführt, also denke ich mal, dass es nicht daran liegen kann.

                  Wie muss ich mir das ganze visuell vorstellen, was hier passiert?


                  Ich kann einfach nicht nachvollziehen warum die Klasse einmal ordentlich durchgeführt wird und danach nicht mehr. Der Quelltext ändert sich ja in keiner Weise ....


                  Gruß
                  Mario

                  Kommentar


                  • #10
                    Hi,

                    ja nur der kontext ändert sich.

                    Stell dir das so vor. Die klassendeklaration ist deine aufbauanleitung
                    für die klasse.
                    Beim serialisieren in eine session wird deine klasse nun auseinander
                    gebaut und in der session abgegeben.

                    Jetzt willst du irgendwo an anderer stelle den klassenbausatz wieder
                    aus der session holen und zu einer klasse zusammen bauen.

                    Kein problem wenn du die anleitung hast. Da steht genau wie die
                    teile zusammen zu setzen sind.
                    Hast du die anleitung aber nicht (sie ist nicht sichtbar in dem bereich
                    in dem du das aufbauen vornimmst, weil sie vll. in einem anderen zimmer (datei) liegt), bekommst du es einfach nicht hin.
                    Genau so gehts dem armen interpreter. Du musst also rüber gehen
                    und die anleitung holen und sie dem interpreter zeigen.
                    Erst dann kann er alles richtig zusammen setzen.


                    So nun zeig doch mal genau wo der in_array() aufruf erfolgt.
                    Und sag welche klassen involviert sind.

                    greets
                    (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                    Kommentar


                    • #11
                      Fehler

                      Hallo,

                      nochmal kurz zum Verständnis: ich serialisiere überhaupt keine Klassen und übergebe diese auch nicht in meine Session. Unerklärlicherweise steht aber nach dem dritten 2. - 3. Refresh Teile meiner Klasse als Objekt in der Session .....

                      so hier nochmal zum visuellen Verständnis was ich alles an Klassen habe und wie und wo ich sie verwende...

                      Meine Hauptdatei ( cms.php ). Hier mache ich folgendes:
                      ( Ich habe auch schon versucht die phps vor dem SessionStart zu includieren )
                      PHP-Code:
                      start_session();
                      include( 
                      "klassen/class_datenbank.php" );
                      include( 
                      "klassen/class_module.php" );

                      $test = new modul"test" );
                      $test->init();
                      $test1 = new modul"test2" );
                      $test1->init(); 
                      Das ist die Modulklasse( grob )
                      PHP-Code:
                      class modul
                      {
                      private 
                      $modulname false;
                      ...
                      ...
                      public function 
                      modul$name ){
                          
                      $this->modulname $name;
                      }

                      public function 
                      init(){
                          
                          
                      $db_modul_init = new db_query();
                          
                      $db_modul_init->set_system_ini$this->system_ini_pfad$this->system_ini );
                          
                      $db_modul_init->add_query"SELECT.....""MYSQL" );
                          
                      $db_modul_init->result();

                      ...
                      ...
                      if ( 
                      $db_modul_init->num() == ){
                                  
                          if ( !isset( 
                      $_SESSION["module"] ) ) $_SESSION["module"] = array();
                          if ( !
                      in_array $this->modulname$_SESSION["module"] ) ) $_SESSION["module"][] = $this->modulname;

                      }
                      ...
                      ...
                      // hier weitere Anweisungen oder Ausgaben
                      ...
                      ...


                      Zur Datenbank Klasse: Ich erzeuge das Object... übergebe den Query und die Klasse kümmert sich um den DB Connect... führt den query aus und speichert die Results in Objectinternen Variablen oder Arrays, auf die ich wiederum über bestimmte Methoden zugreifen kann.
                      Mehr macht die Klasse eigentlich nicht...

                      Das was du hier alles siehst,ist ziemlich exakt der Aufbau, den ich in meiner Umgebung auch habe und derzeit durchführe.
                      Ich hoffe, dass der Code soweit ausrechend ist, um dir ein Bild von allem machen zu können. Die Klassen sind im gesamten leider viel zu groß um sie hier mit all ihren Methoden zu posten aber das was ich gepostet habe, sind die Methoden, die ich auch hier anwende.

                      Mario

                      Kommentar


                      • #12
                        erledigt

                        Hat sich erledigt...
                        Ich habe aber das gefühl, dass DAS nun wirklich ein kleiner BUG vom PHP Interpreter sein "könnte". Kleines Beispiel...

                        $_SESSION["test"]["muh"] = "sagt die Kuh";

                        ... so wenn ich nun ein echo $test; mache, dann gibt er mir ARRAY aus.
                        Wundert mich aber, dass er dies tut, weil die Session ja selbst auch ein Array ist und ich auf ein solches ja normalerweise nur mit $_SESSION[...] zugreifen kann...oder sehe ich das falsch?

                        Mario

                        Kommentar


                        • #13
                          Re: erledigt

                          Da du $_SESSION["test"]["muh"] angegeben hast, also unterhalb von $_SESSION["test"] noch einen Index in eckigen Klammern, wird $_SESSION["test"] automatisch zu einem Array.

                          Und wann immer du ein Array mit echo auszugeben versuchst, kommt da nur das Schlüsselwort Array bei heraus.

                          Funktioniert absolut haargenau so, wie es zu erwarten ist.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            Ist denn Session nicht immer ein Array
                            Ein assoziatives Array, das die Sessionvariablen für das aktuelle Skript enthält. Mehr über die Verwendung dieses Arrays finden Sie bei der Dokumentation zu den Session Funktionen.
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar


                            • #15
                              wenn das zweite argument in in_array bspw. SESSION["test"] war, dann nicht
                              **********
                              arkos
                              **********

                              Kommentar

                              Lädt...
                              X