Contao-Camp 2024
Ergebnis 1 bis 13 von 13

Thema: Neuer DB-Eintrag wird nicht gleich mit ausgegeben

  1. #1
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard Neuer DB-Eintrag wird nicht gleich mit ausgegeben

    In folgendem Script kann ich keinen Fehler finden. Dennoch wird nicht so agiert, wie ich es mir wünsche und meiner Meinung nach auch sein sollte.
    Es gibt ein Formular und wenn man es sendet, kommt man zu einer Seite mit diesem Script. Der Sende-Button heißt 'intoDB'. Hier frage ich ab, ob er gedrückt wurde und wenn ja, dann sollen die Daten in die DB eingetragen werden. Das klappt auch.
    Ruft man diese Seite direkt auf, dann werden alle, entsprechend der SQL-Anweisung, Einträge gelistet. Auch das klappt.
    Nun soll es aber so sein, daß beides zusammen funktionert. Also mit Klick auf den Button der anderen Seite den Datensatz in die DB eintragen und danach alles auflisten. Das geht auch, aber gerade der hier neu eingetragenen Datensatz wird nicht mit übernommen. Diesen kann ich erst sehen, wenn ich die Seite reloade oder wieder direkt aufrufe. Also eingetragen wird er, aber nicht gleich direkt mit ausgegeben.
    Wieso geht das nicht? Normalerweise muß das doch funktionieren. Ich dachte auch erst an ein Cache-Problem, aber selbst wenn ich alle Chaches ausschalte, ändert sich daran nichts.
    Kann sich das bitte mal jemand anschauen?

    PHP-Code:
    protected function compile()
    {
        if(
    $this->Input->get('intoDB'))
        {
            
    // echo "eingetragen";
            // In DB schreiben
            
    $time time();
            
    $arrIntoDB = array
            (
                
    'tstamp'        => $time,
                
    'sessionID'        => session_id(),
                
    'id'            => $this->Input->get('id'),
                
    'name1'         => $this->Input->get('name1'),
                
    'name2'         => $this->Input->get('name2'),
                
    'nummer'        => $this->Input->get('nummer'),
                
    'anzahl'        => $this->Input->get(anzahl)
            );
            
    $insertId $this->Database->prepare("INSERT INTO tl_kfz %s")->set($arrIntoDB)->execute()->insertId;
        }


        
    // echo "anzeigen";
        // Inhalte aus DB für aktuelle Session auslesen
        
    $objKFZ $this->Database->execute("SELECT *, SUM(anzahl) AS anzahl
                                                FROM tl_kfz
                                                WHERE sessionID = '" 
    session_id() . "'
                                                GROUP BY nummer"
    );
        
    $arrKFZ = array();

        
    $total $objKFZ->numRows;
        if (
    $total == 0)
        {
            
    $this->Template->message_noEntry "Noch keine Einträge vorhanden.";
        }

        while (
    $objKFZ->next())
        {
            
    $arrKFZ[] = array
            (
                
    'name1'      => $objKFZ->name1,
                
    'name2'      => $objKFZ->name2,
                
    'nummer'     => $objKFZ->nummer,
                
    'anzahl'     => $objKFZ->anzahl
            
    );
        }

        
    $this->Template->dataKFZ $arrKFZ;


    Napalm

  2. #2
    Contao-Fan Avatar von Bandyt
    Registriert seit
    22.04.2010.
    Ort
    Bremen
    Beiträge
    808

    Standard

    Kenne ich. Contao cached das Ergebnis.


    Probiere mal:
    Code:
    $objKFZ = $this->Database->executeUncached("SELECT *, SUM(anzahl) AS anzahl
                                                FROM tl_kfz
                                                WHERE sessionID = '" . session_id() . "'
                                                GROUP BY nummer");
    Meine Erweiterungen: League Manager | Forum

  3. #3
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard

    Super, das klappt wunderbar. Tausend Dank!
    Ganz ehrlich: Ich hätte jetzt nicht gedacht, daß es so einfach geht.
    Napalm

  4. #4
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard

    Ich muß jetzt leider doch noch einmal wegen einem ähnlichen Problem nachfragen. Und zwar geht es darum, auch ein eingebundenes Modul zu 'reloaden'.
    Also ich habe zusätzlich noch ein Modul - Infobox. Dies habe ich ins Seitenlayout als festes Modul mit eingebunden. Navigiere ich durch die Website, wird es mir auch ausgeben und ev. vorhandener Inhalt angezeigt. Wenn jetzt aber ein User ein neues KFZ vormerken möchte, dann wird dieses Modul auch nicht gleich aktualisiert, sondern man sieht den neuen Eintrag erst, wenn man wieder einen Reload macht oder irgendeine andere Seite aufruft. Ich meine, wenn ich ein KFZ vormerke, dann wird doch die Seite schon neu geladen.
    Gibt es hier eine ähnliche Lösung wie mit 'executeUncached'?

    Im Grunde funktioniert das ähnlich wie bei einem Shopsystem, in dem man einen Artikel in den Warenkorb legt und der Inhalt des Warenkorbes irgendwo auf der Seite mit ausgegeben wird.
    Napalm

  5. #5
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Äh? DOM-Manipulation? Ajax? Das hat doch gar nichts mit Contao zu tun
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  6. #6
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard

    Tut mir leid, aber ich weiß nicht was du meinst.
    Napalm

  7. #7
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Zitat Zitat von Napalm Beitrag anzeigen
    Ich meine, wenn ich ein KFZ vormerke, dann wird doch die Seite schon neu geladen.
    Aber es könnte sein, daß Dein "Anzeigemodul" vor dem "Vormerkmodul" bearbeitet wird. Damit wäre der neue Eintrag dann noch nicht in der Datenbank gespeichert.

    Grüße,
    Andreas
    Geändert von fiedsch (06.11.2011 um 18:01 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  8. #8
    Contao-Fan Avatar von Bandyt
    Registriert seit
    22.04.2010.
    Ort
    Bremen
    Beiträge
    808

    Standard

    Naja, im Prinzip wir die Seite neu geladen und dabei das KFZ vorgemerkt. Je nachdem welche Reihenfolge die Module haben, sind das Inhalts schon erstellt.

    Du könntest nach den Änderungen an der Datenbank aber nochmal die Seite neu laden.
    Meine Erweiterungen: League Manager | Forum

  9. #9
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard

    Also vormerken heißt ja schon in die DB eintragen. Wie in meinem kleinem Hinweis darunter erwähnt, ist es ja ähnlich wie bei einem Shop. Man legt einen Artikel in den Warenkorb (bei mir vormerken) und der Warenkorb wird daraufhin angezeigt. Zusätzlich wird der Inhalt der Warenkorbes auch in der Box ausgegeben. Wenn also jetzt die Warenkorbseite geladen wird, dann ist ja da schon der Artikel drin. Aber eben nicht in der Box, obwohl die ja als Modul im Frontend in das Layout mit eingebunden ist. Normalerweise müßte die ja auch 'neu' laden und den Artikel mit anzeigen. Ja und das geht eben leider nur, nach einem Reload.
    Das 'Anzeigemodul' ist ja der 'Warenkorb' selbst, was auch ein Modul ist, welches in einer Seite eingebunden werden kann.
    Napalm

  10. #10
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.942

    Standard

    Zitat Zitat von Napalm Beitrag anzeigen
    Wenn also jetzt die Warenkorbseite geladen wird, dann ist ja da schon der Artikel drin. Aber eben nicht in der Box, obwohl die ja als Modul im Frontend in das Layout mit eingebunden ist. [...] Ja und das geht eben leider nur, nach einem Reload.
    Das 'Anzeigemodul' ist ja der 'Warenkorb' selbst, was auch ein Modul ist, welches in einer Seite eingebunden werden kann.
    Was Bandyt und ich meinten war: Du merkst ein Kfz vor, "schickst also die Seite ab", die daraufhin neu erstellt wird.

    Dabei geschehen (u.a.) folgende Punkte.

    (a) Eintrag in die Detanbank
    (b) Auslesen der Datenbank (Warenkorb anzeigen).

    Wenn jetzt aber das Modul, das (b) macht vor dem Modul, das (a) macht gerendert wird, ist der neue Eintrag noch nicht in der Datenbank und kann daher nicht im Warenkorb erscheinen. Wenn die Seite ausgeliefert wird, ist er dann aber in der Datenbank eingetragen, so daß nach einem Reload -- ohne (a) -- alles "korrekt" angezeigt wird.

    Andreas
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  11. #11
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard

    Der Eintrag ist auf jedenfall in der Datenbank, was mir ja auf der aufgerufenen Seite auch angezeigt wird. Natürlich sehe ich den Eintrag auch, wenn ich direkt in die Datenbank schaue. Also b vor a wird hier nicht gemacht, daß nur bei der Box, obwohl da a ja vorhanden ist. Seltsam, aber wahrscheinlich wird wirklich nicht die komplette Seite neu geladen. Vom Code her, habe ich zweimal die selbe Abfrage. Einmal auf der Seite und einmal in der Box. Aber das sollte ja keine Rolle spielen.
    Lösbar muß es aber sein.
    Napalm

  12. #12
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard Halbe Lösung gefunden

    Ich verstehe jetzt, daß es so in der Tat nicht funktionert. Der Button wird gedrück und diese Seite aufgerufen. Dann wird erst der Datensatz gespeichert und danach alles geladen. Die Box, bekommt davon natürlich noch nichts mit, weil sie ja beim Aufruf dieser Seite nur das listet, was momentan in der Datenbank ist. Da ist aber eben der neue oder erste Eintrag noch nicht vorhanden.

    PHP-Code:
    class fe_liste extends Module
    {
        protected 
    $strTemplate 'fe_liste';

        protected function 
    compile()
        {

            
    // Button
            
    if($this->Input->get('intoListe'))
            {
                
    $arrIntoListe = array
                (
                    
    // etc...
                
    );

                
    $insertId $this->Database->prepare("INSERT INTO tl_ms_liste %s")->set($arrIntoListe)->execute()->insertId;
            }

            
    $objListe $this->Database->executeUncached("SELECT *, SUM(anzahl) AS anzahl
                                                        FROM tl_ms_liste
                                                        WHERE sessionID = '" 
    session_id() . "'
                                                        GROUP BY kfzID"
    );
            
    $arrListe = array();

            while (
    $objListe->next())
            {
                
    $arrListe[] = array
                (
                    
    // etc...
                
    );
            }

            
    $this->Template->liste $arrListe;

        }

    Wie man sieht, wird der Datensatz in die DB eingetragen, wenn erkannt wird, daß vorher der intoListe-Button gedrückt wurde. Danach wird dann auch gleich alles aus der Datenbank abgefragt und ausgegeben. Auch der neue Datensatz.

    Gut, aber wie kann man sowas lösen? Geht das vielleicht mit der PHP-Ausgabenpufferung? Als Lösung habe ich jetzt gefunden, daß es funktioniert, wenn ich das Speichern zusätzlich mit in das Modul-Script von der Box eintrage. Aber wie ich finde, ist das 'doppelgemoppel'.

    Daher die Frage jetzt (meine OOP-Kenntnisse sind wirklich sehr begrenzt): Gibt es die Möglichkeit dies in eine Funktion (externe Datei) zu legen (klar) und dann in den entsprechenden Klassen zu integrieren? Oder geht sogar, eine Funktion in einer Klasse aus einer anderen Klasse (andere Datei) direkt auszurufen?

    Aber, ich bin der Lösung schon mal sehr viel näher gekommen. Ich danke euch auch schon jetzt einmal für die bisherigen Wortmeldungen und vielleicht auch noch für kommende.
    Napalm

  13. #13
    Contao-Nutzer
    Registriert seit
    17.10.2011.
    Beiträge
    52

    Standard Ganze Lösung gefunden

    Zusätzlich in das Box-Script eintragen war dann doch nicht die beste Idee, denn dann wurde jeder Datensatz doppelt eingetragen. So ist dann die entgültige Lösung, daß ich den Speichern-Code nur in die Box eingetragen habe und diesen aus der Liste-Seite entfernte. Somit habe ich den Code auch nur einmal und bin eigentlich zufrieden damit.
    Trotzdem danke für eure Hilfe und Denkanstöße!
    Napalm

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •