Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP Objekt serialisieren

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PHP Objekt serialisieren

    Hallo,

    ich serialisiere eine Objekt in PHP schreibe dieses in die Datenbank und möchte es später auslesen um damit weiter arbeiten zu können.

    Ich mache es so:

    PHP-Code:

    $connection
    ->Query("SELECT objekt from tbltmpobjekte WHERE userid = $tmpUserID");
    while(
    $row $connection->fetchRow())
    {
        
    $tmpObjekt $row["objekt"];
    }
    if (!
    $tmpObjekt)
        {
            
    $Umfrage = new Umfragen("Name"1);
            
    $Umfrage->addFrage($_POST['Frage'], $_POST['Antwort'], "input""");
            
    $tmpObjekt serialize($Umfrage);
            
    $tmpUserID $_SESSION["user_id"];
            
    $connection->Query("INSERT INTO tbltmpobjekte (objekt, userid) VALUES ('$tmpObjekt', '$tmpUserID' )");
            
    $connection->Disconnect();
        }
        else
        {
            
    $Umfrage unserialize($tmpObjekt);
            
    $Umfrage->addFrage($_POST['Frage'], $_POST['Antwort'], "input""");
            
    $tmpObjekt serialize($Umfrage);
            
    $connection->Query("UPDATE tbltmpobjekte Set objekt = '$tmpObjekt' WHERE userid = tmpUserID");
            
    //$connection->Query("INSERT INTO tbltmpobjekte (objekt, userid) VALUES ('$tmpObjekt', '$tmpUserID' )");
            
    $connection->Disconnect();

            }
        } 
    Nur leider habe ich das Gefühl, dass dort iwas nicht stimmt, wenn ich fertig bin und später über

    PHP-Code:
    $Umfrage->Speichern() 
    Alle Fragen, die sich in dem Objekt Umfrage befinden speichern will wird immer nur eine Frage gespeichert, es steht auch immer nur eine Frage in dem Objekt Umfragen. Mache ich etwas bei der Serialisierung falsch?

  • #2
    Zitat von PeterXV Beitrag anzeigen
    ich serialisiere eine Objekt in PHP schreibe dieses in die Datenbank und möchte es später auslesen um damit weiter arbeiten zu können.
    Das scheint mir Unfug zu sein. Lies die Daten/den Zustand des Objekts aus, speicher die Werte und bau später mit diesen Daten das Objekt wieder auf.

    Kommentar


    • #3
      Nein, das will ich eben nicht, denn ich will erst alle Fragen zu einer Umfrage hinzufügen und wenn es dann fertig ist, dann will ich die komplette Umfrage speichern.
      Ich reiche damit dieses Objekt nur an die nächste Seite weiter.

      Edit: Wenn du eine bessere Lösung dafür hast, dann könntest du mir diese natürlich vorstellen!

      Kommentar


      • #4
        Zitat von PeterXV Beitrag anzeigen
        Mache ich etwas bei der Serialisierung falsch?
        Code:
        [ ] Ja
        [ ] Nein
        [ ] Wasweissich
        [X] Du hast uns gar nicht gezeigt, wie du das machst

        Kommentar


        • #5
          Was genau fehlt denn in dem Code?
          Er serialisert es doch mit dem

          PHP-Code:
          $tmpObjekt serialize($Umfrage); 
          und holt es mit dem

          PHP-Code:
          $Umfrage unserialize($tmpObjekt); 
          Wieder zurück?!

          Kommentar


          • #6
            Die Implementierungen von __sleep() und __wakeup() z.B.? Wir wissen ja überhaupt nichts über deine Umfragen-Klasse. Und hast du dein "Gefühl" wenigstens mal versucht zu bestätigen indem du geschaut hast, wann dein Umfragen-Objekt welchen Zustand hat? Anders gefragt: hast du isoliert getestet ob unserialize(serialize($umfrage)) sich von $umfrage unterscheidet?

            Kommentar


            • #7
              tja peter .. dann überlegen wir doch nochmal was dein Programm da macht

              Datenbank abfragen -> jawoll
              Daten fetchen und .... -> jein ...

              Serialisieren .....

              JEIN schreib ich da, weil du in einer while-Schleife alle Zeilen der Ergebnistabelle durchackerst .. aber nur die letzte Zeile überlebt das ganze, weil du JEDESMAL die Variable $tmpObjekt mit den neueren Daten ÜBERSCHREIBST ( und die While-Schleife gleich wieder beendest)

              damit steht natürlich IMMER NUR DAS LETZTE ERGEBNIS der DatenbankAbfrage zur Verfügung fürs Serialisieren

              Feststellen würdest du dies auch, wenn du wie eigentlich gedacht, mal ordentlich debugst = gib das $tmpobjekt AUS, bevor es serialisiert wird. Und du hättest SOFORT gesehen, dass da nur eine Ergebniszeile drinsteckt

              Kommentar


              • #8
                Ich habe gerade festgestellt, dass die Daten in dem Objekt drin sind, das heißt in meiner Klasse ist ein Fehler beim speichern.

                Ich werde mich das jetzt nochmal genauer anschauen in der Klasse, wenn ich da nichts finden werden, dann werde ich die Klasse nochmal hier posten.

                Edit:

                Zitat von eagle275 Beitrag anzeigen
                tja peter .. dann überlegen wir doch nochmal was dein Programm da macht

                Datenbank abfragen -> jawoll
                Daten fetchen und .... -> jein ...

                Serialisieren .....

                JEIN schreib ich da, weil du in einer while-Schleife alle Zeilen der Ergebnistabelle durchackerst .. aber nur die letzte Zeile überlebt das ganze, weil du JEDESMAL die Variable $tmpObjekt mit den neueren Daten ÜBERSCHREIBST ( und die While-Schleife gleich wieder beendest)

                damit steht natürlich IMMER NUR DAS LETZTE ERGEBNIS der DatenbankAbfrage zur Verfügung fürs Serialisieren

                Feststellen würdest du dies auch, wenn du wie eigentlich gedacht, mal ordentlich debugst = gib das $tmpobjekt AUS, bevor es serialisiert wird. Und du hättest SOFORT gesehen, dass da nur eine Ergebniszeile drinsteckt
                Eben nicht, es steht nur eine Zeile in der TABELLE! Also ist deine Antwort hier nicht ganz richtig, ich habe immer ein serialisiertes Objekt in der Datenbank zu einer UserID, es kann niemals eine UserID 2 Objekte haben!

                Kommentar


                • #9
                  sry wegen doppelpost!

                  Kommentar


                  • #10
                    Zitat von PeterXV Beitrag anzeigen
                    Eben nicht, es steht nur eine Zeile in der TABELLE! Also ist deine Antwort hier nicht ganz richtig, ich habe immer ein serialisiertes Objekt in der Datenbank zu einer UserID, es kann niemals eine UserID 2 Objekte haben!
                    Dann ist while allerdings ziemlich unnötig.

                    Kommentar


                    • #11
                      Zitat von PeterXV Beitrag anzeigen
                      Eben nicht, es steht nur eine Zeile in der TABELLE! Also ist deine Antwort hier nicht ganz richtig, ich habe immer ein serialisiertes Objekt in der Datenbank zu einer UserID, es kann niemals eine UserID 2 Objekte haben!
                      Dann bleibt die Frage, warum du zur Auswertung eines garantiert einzelnen Datensatzes eine Schleife verwendest ...

                      Kommentar


                      • #12
                        Zitat von fab Beitrag anzeigen
                        Dann ist while allerdings ziemlich unnötig.
                        Alles klar, danke ich schau mir das mal an. Ich habe meinen Fehler gefunden, er war in meiner Klasse!

                        Danke trotzdem!

                        Kommentar


                        • #13
                          prüf bitte mit Debug-Ausgaben (vardumps / print_r ) , ob dein Deserialize überhaupt ein Objekt von deinem gewünschten Typ ergibt ....

                          außerdem ... so wie das klingt ... sind die einzelnen Fragen etwa ihrerseits wieder Objekte ? . wie verwaltet dein Umfrage-Objekt seine Fragen ?

                          im Falle das das wieder Objekte sind, musst du die wohl separat serialisieren / deserialisieren

                          Kommentar


                          • #14
                            Zitat von eagle275 Beitrag anzeigen
                            im Falle das das wieder Objekte sind, musst du die wohl separat serialisieren / deserialisieren

                            Ja, ich schreibe mir in dem Objekt Umfrage in ein Array Fragen die Fragen (auch als Objekt).

                            Das heißt ich müsste diese auch noch alle serialisieren, was natürlich logisch wäre.

                            Wobei, das mit den Fragen klappt aber, sie werden nun in die Datenbank geschrieben.


                            Hier mal meine Klassen:

                            PHP-Code:
                            <?php
                            require("mysql.php");
                            require(
                            "includes/config.php");
                            class 
                            Umfragen {
                                private 
                            $Name             NULL;     #Name der Umfrage
                                
                            private $FirmendID         NULL;        #ID der Firma, der diese Umfrage zugeordnet werden soll
                                
                            private $fragen         = array();    #Array für alle Fragen
                                
                            private $connection     NULL;
                                
                                
                            #Konstruktor
                                
                            public function __construct($UmfragenName$ID) {
                                    
                            $this->connection =  new DB_MySQL(HOSTDATENBANKUSERPASSWORT);
                                    
                            $this->Name $UmfragenName;
                                    
                            $this->FirmenID $ID;
                                    }
                                    
                                public function 
                            addFrage($Frage$FragenAntworten$typ$ParentID) {
                                    
                            $this->fragen[] = new Frage($Frage$typcount($FragenAntworten), $FragenAntworten$ParentIDcount($this->fragen));
                                }
                                
                            #Aufrufen, wenn die Umfrage komplett erstellt worden ist
                                
                            public function Speichern()    {
                                    
                            $i 0;
                                    
                                    for(
                            $x 0$x count($this->fragen); $x++) {     /* die Schleife läuft solang, wie x kleiner ist als count($DVD); */
                                            
                            $this->Connect();
                                            
                            $this->connection->Query("INSERT INTO tblumfragen (UmfrageName, FirmenID) VALUES ('$this->Name', '$this->FirmenID')");
                                            
                            $this->fragen[$x]->Speichern(mysql_insert_id());
                                            
                            $this->connection->Disconnect();
                                    }
                                }
                                public function 
                            getCountFragen() {
                                    return 
                            count($this->fragen);
                                    }

                                public function 
                            Connect() {
                                    
                            $this->connection =  new DB_MySQL(HOSTDATENBANKUSERPASSWORT);
                            }

                                }

                            class 
                            Frage {
                                private 
                            $frage                     NULL;        #Frage wird in dieser Variable gespeichert
                                
                            private $typ                     NULL;        #Typ der Frage wird in dieser Variable gespeichert
                                
                            private $anzahlmoeglichkeiten     NULL;        #Die Anzahlmöglichkeiten werden in dieser Variable gespeichert
                                
                            private $UmfragenID             NULL;        #Die Frage wird einer Umfrage anhand der UmfragenID zugeordnet, hier wird diese ID gespeichert
                                
                            private $ParentID                 NULL;        #ParentID -> für Unterfragen
                                
                            private $sort                     NULL;        #Variable für die Sortierung der Fragen
                                
                            private $antworten                 = array();
                                private 
                            $connection             NULL;

                                
                            #Konstruktor
                                
                            public function __construct($sFrage$typName$AnzahlMoeglichkeiten$FragenAntworten$iParentID$Sortierung) {
                                    
                            $this->connection = new DB_MySQL(HOSTDATENBANKUSERPASSWORT);
                                    
                            $this->frage $sFrage;
                                    
                            $this->typ $typName;
                                    
                            $this->anzahlmoeglichkeiten $AnzahlMoeglichkeiten;
                                    
                            $this->ParentID $iParentID;
                                    
                            $this->sort $Sortierung;
                                    foreach(
                            $FragenAntworten as $Antwort)
                                    {
                                        
                            $this->antworten[] = new Antwort($Antwort);
                                    }
                                }
                                public function 
                            Speichern($UmfrageID) {
                                    
                            $this->Connect();
                                    
                            $this->UmfragenID $UmfrageID;
                                    
                            $this->connection->Query("INSERT INTO tblfragen (Frage, TypID, AnzahlMöglichkeiten, UmfrageID, ParentID, sort) VALUES ('$this->frage', '$this->typ', '$this->anzahlmoeglichkeiten', '$this->UmfragenID', '$this->ParentID', '$this->sort')");
                                    
                            $this->antworten[$this->anzahlmoeglichkeiten]->Speichern(mysql_insert_id());
                                    
                            $this->connection->Disconnect();
                                }
                                
                                    private function 
                            Connect() {
                                    
                            $this->connection =  new DB_MySQL(HOSTDATENBANKUSERPASSWORT);
                            }    
                                
                            }

                            class 
                            Antwort {
                                private 
                            $antwort         NULL;        #Antwort wird in dieser Variable gespeichert
                                
                            private $FrageID         NULL;        #Hier wird die ID der Frage gespeichert, zu welcher die Antwort gehört
                                
                            private $connection     NULL;
                                
                                
                            #Konstruktor
                                
                            public function __construct($Value) {
                                    
                            $this->connection = new DB_MySQL(HOSTDATENBANKUSERPASSWORT);
                                    
                            $antwort $Value;
                                }
                                
                                public function 
                            Speichern($ID) {
                                    
                            $this->Connect();
                                    
                            $this->FrageID $ID;
                                    
                            $this->connection->Query("INSERT INTO tblantwortmöglichkeiten (FrageID, Antwort) VALUES ('$this->FrageID', '$this->antwort')");
                                    
                            $this->connection->Disconnect();
                                }
                                
                                private function 
                            Connect() {
                                    
                            $this->connection =  new DB_MySQL(HOSTDATENBANKUSERPASSWORT);
                            }    
                            }
                            ?>
                            Die Antworten werden leider nicht mehr in die Datenbank eingetragen, kann mir vielleicht jemand sagen wie ich den Vorschlag von eagle275 umsetzen kann?

                            Wäre es eine Lösung, wenn ich die Antworten und Fragen automatisch im serialisiere und beim speichern wieder mit unserialize aufrufe?

                            Kommentar


                            • #15
                              Zum Beispiel:

                              Aus Umfragen::Speichern:

                              PHP-Code:
                              for($x 0$x count($this->fragen); $x++) {     /* die Schleife läuft solang, wie x kleiner ist als count($DVD); */
                                  
                              $this->Connect();
                                  
                              $this->connection->Query("INSERT INTO tblumfragen (UmfrageName, FirmenID) VALUES ('$this->Name', '$this->FirmenID')");
                                  
                              $this->fragen[$x]->Speichern(mysql_insert_id());
                                  
                              $this->connection->Disconnect();

                              Das erstellt dir für jede Frage der Umfrage einen neuen Eintrag in tblumfragen. Ist das, was du willst?

                              Kommentar

                              Lädt...
                              X