Ngar: Kein vollständiges Neuladen der Seite trotz loction.reload()

Hallo,

ich habe mir eine Drop-Downliste gebastelt, mit Hilfe derer ich einen Eintrag in eine Datenbank veranlassen will.

Beim anklicken eines Eintrages, soll meine Seite neugeladen werden und in der URL werden die notwendigen Inhalte für den DB-Eintrag übergeben.

Anschliessend wird meine Seite durch den Inhalt der Datenbank wieder neu aufgebaut.

Beispiel (eine Tabelle mit folgenden Einträgen)
MS Office
Internet Explorer

In der Drop-Down-Liste wähle ich zB MS Outlook aus

Meine Seite wird neugeladen und dabei soll auch der Eintrag in die DB erfolgen.

Nun wird der Inhalt der DB ausgelesen um die Seite neu aufzubauen.

In meiner Seite steht dann auch
MS Office
Internet Explorer
MS Outlook

ABER: aber in phpMyAdmin steht dieser Eintrag NICHT - was mich noch mehr verwirrt, das die Seite nach den Informationen aus der Datenbank gefüllt wird, woher weiss dann meine Seite, das MS-Outlook in der Tabelle stehen sollte? Erst nach einem Reload meiner Seite kennt dann phpMyAdmin plötzlich den Eintrag MS Outlook.

Komisch wird das ganze noch dadurch, daß es nach IE-neustart und Aufruf meiner Seite ersteinmal einige Male funktioniert und nach dem 4ten oder 5ten entfernen/hinzufügen eines Eintrages plötzlich nicht mehr.

Was mach ich falsch? oder kann ich die Aufgabe auch anders lösen?

Danke

Ngar

  1. Hello,

    Was mach ich falsch? oder kann ich die Aufgabe auch anders lösen?

    wie löst du sie den im Moment? Bisher hast du nur geschrieben, dass es eine Dropdown und vermutlich eine Datenbank gibt. Wie hängt das zusammen. Wer schreibt Daten wie wohin und wer liest wann von wo?

    MfG
    Rouven

    --
    -------------------
    He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
    1. Hello,

      Was mach ich falsch? oder kann ich die Aufgabe auch anders lösen?
      wie löst du sie den im Moment? Bisher hast du nur geschrieben, dass es eine Dropdown und vermutlich eine Datenbank gibt. Wie hängt das zusammen. Wer schreibt Daten wie wohin und wer liest wann von wo?

      MfG
      Rouven

      Hallo,

      beim ersten Starten meiner Seite werden sämtliche Daten eines PC's aus einer Datenbank ausgelesen - dazu werden Daten aus 15 verschiedenen Tabellen in einem Formular dargestellt.

      Die DB enthält Informationen über sämtliche PCs eines Unternehmens mit verschiedenen relevanten Informationen. So zB auch über die Installierte Software. Da es nur eine begrenzte Software gibt wollte ich das "Hinzufügen" einer Software über dieses Drop-Down-Feld lösen.

      Die Tabellen pc und std_software haben eine n:m-Beziehung und sind über eine Tabelle pc_has_std_software verknüpft.

      Zuerst lese ich alle auf dem Rechner installierte Software aus und lege die Information in einem Array ab.
      $std_soft_qry = $db->query('SELECT phs.std_software_id,       std_s.std_software
         FROM std_software std_s,
          pc_has_std_software phs
         WHERE phs.pc_id = '' . $row['pc_id'] . ''
         AND std_s.std_software_id = phs.std_software_id
         ORDER BY std_s.std_software') OR die(mysql_error());

      Anschliessend ermittle ich sämtliche Verfügbar Software, die nicht auf dem Rechner installiert ist, das landet ebenfalls in einem Array:

      $m_std_soft_qry = $db->query('SELECT *
          FROM std_software
          WHERE std_software_id != ALL(
           SELECT s.std_software_id
           FROM std_software s,
               pc_has_std_software phs
           WHERE s.std_software_id = phs.std_software_id
           AND phs.pc_id = '' . $row['pc_id'] . '')') OR die(mysql_error());

      Beides übergebe ich dann an ein Template (Smarty).

      Die Drop-Down-List erstelle ich dann wie folgt:

      <select size='1'name='std_software' onchange='Go(this)'>
       <option value='leer'>Software hinzufügen</option>
        {section name=m_std_soft_row loop=$data[$row].m_std_software}
          <option value='{getURL}&pc_id={$data[$row].pc_id}&add_std_soft_id={$data[$row].m_std_software[m_std_soft_row].m_std_software_id}'>
         {$data[$row].m_std_software[m_std_soft_row].m_std_software}</option>
        {/section}
      </select>

      Durch das Auswählen wird dann die Seite mit folgender URL geöffnet, zB: index.php?section=edit_pc&pc_id=1&add_std_soft_id=3

      Dann wird die Seite mit allen Informationen wieder aus der Datenbank ausgelesen.

      Auf der Seite sieht es aus als wäre die Software mit der std_soft_id=3 hinzugefügt worden.

      Aber eine Abfrage in phpMyAdmin sagt sie steht nicht drin.

      Und das verwirrt mich, wenn die Seite von 0 aus aufgebaut wurde, also aus den Daten in der Datenbank, wie kann dann die Software auf meiner Seite angezeigt werden, obwohl sie nicht in der DB ist (lt phpMyAdmin).

      1. Hello,

        kann es schlicht und einfach sein, dass dein Browser dich mit irgendwelchem Caching zum Narren hält und nicht wirklich ein Reload macht? Ansonsten macht mich das Template-System misstrauisch, dem ich etwas ähnliches zutrauen würde.

        MfG
        Rouven

        --
        -------------------
        Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
        1. Hallo Rouven,

          bisher hat alles funktioniert, was ich mit dem Template versucht habe.

          Gerade habe ich weiter experimentiert.

          Dabei habe ich erhausgefunden, das zwar meine Methode zur DB-Anfrage aufgerufen wird und auch den richtigen STRING übergeben bekommt, aber mysql_query scheint nicht ausgeführt zu werden, da ich gar keinen Rückgabewert erhalte.

          mysql_query gibt doch immer was zurück?!
          entweder nen Fehlercode, ne 1 für Erfolg oder das Ergebnis eines Selects.

          Kann ich Skriptseitig das Cachen ausschalten?

          Wobei ich mir nicht vorstellen kann, das es daran liegt.

          Ich mache erst die Anfrage welche Software ist drin. Dann füge ich eine  Software hinzu - woher soll dann php-Wissen, wo er den neuen Eintrag anfügen soll? Also in welche der vielen Variablen die es in meinem Template gibt.

          DAnke

          Ngar

          1. Hello,

            mysql_query gibt doch immer was zurück?!

            unterdrückst du evtl. Fehler?

            MfG
            Rouven

            --
            -------------------
            Vegetarier essen meinem Essen das Essen weg.
            1. Hello,

              mysql_query gibt doch immer was zurück?!
              unterdrückst du evtl. Fehler?

              MfG
              Rouven

              Nein, ich erhalte zB. Fehlermeldungen wenn ich in einer UNIQUE Spalte den gleichen Wert nocheinmal eintragen möchte.

              PS: Dürfte ich dich evtl private anschreiben, Rouven

              1. Hello,

                PS: Dürfte ich dich evtl private anschreiben, Rouven

                ungerne.

                MfG
                Rouven

                --
                -------------------
                Vegetarier essen meinem Essen das Essen weg.
                1. Hello,

                  PS: Dürfte ich dich evtl private anschreiben, Rouven
                  ungerne.

                  MfG
                  Rouven

                  Ich wollte nur einen Link mitteilen, auf dem du den Fehler einmal erleben könntest - evtl siehst du etwas, was mir entgeht.

                  1. Hello,

                    Ich wollte nur einen Link mitteilen, auf dem du den Fehler einmal erleben könntest - evtl siehst du etwas, was mir entgeht.

                    dann tu dir (und uns) den Gefallen und poste ihn hier.

                    MfG
                    Rouven

                    --
                    -------------------
                    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
                  2. Moin!

                    Ich wollte nur einen Link mitteilen, auf dem du den Fehler einmal erleben könntest - evtl siehst du etwas, was mir entgeht.

                    Dein Fehler liegt im Javascript, und wo genau, hatte ich dir mitgeteilt.

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
                    1. Dein Fehler liegt im Javascript

                      Ich hatte diesen JS-Code nach eigenen Fehlversuchen im I-Net ergooglet - daher war ich in der Annahme das er funktionieren müsse.

                      Dank deiner Standhaftigkeit ;) - hab ich da mal was geändert - und endlich funktioniert es - habe ne halbe Stunde dran rumgeklickt - Fehler trat nicht mehr auf.

                      Ich danke euch beiden

                      mfg

                      Ngar

      2. Bei Auswahl einer Option im Drop-Down-Feld wird dann ein JavaScript ausgeführt:
        function Go (select)
        {
         var wert = select.options[select.options.selectedIndex].value;
         if (wert == 'empty')
         {
             select.form.reset();
          return;
         } else
         {
          location.reload();
             location.href = wert;
             select.form.reset();

        }
        }
        Das neuladen der Seite bewirkt das Ausführen folgenden Codes:

        case 'edit_pc' :
          if (isset($_GET['add_std_soft_id']))
          {
              echo 'starte INSERT INTO<br>';
              $db->query('INSERT INTO pc_has_std_software (pc_id, std_software_id) VALUES ('' . $_GET['pc_id'] . '' , '' . $_GET['add_std_soft_id'] . '')') OR die(mysql_error());
              echo 'INSERT INTO ausgeführt<br>';
          }
          $tpl->assign('data', $fq->getPCDetails($db));
        break;

        In $db->query() lasse ich mir den Rückgabewert von mysql_query ausgeben.

        Bei jedem auswählen einer der Drop-Down-Optionen steht dort nun:

        starte INSERT INTO
        1
        INSERT INTO ausgeführt

        Das bedeutet doch, der Eintrag in die Datenbank war erfolgreich. Warum erhalte ich dann bei einem SELECT das Tabelen-Inhalts unter phpMyAdmin, das der Eintrag noch nicht drin steht, sonder muss erst nochmal meine Seite neuladen?

        1. Hello,

          Das bedeutet doch, der Eintrag in die Datenbank war erfolgreich. Warum erhalte ich dann bei einem SELECT das Tabelen-Inhalts unter phpMyAdmin, das der Eintrag noch nicht drin steht, sonder muss erst nochmal meine Seite neuladen?

          hmh, das ist in der Tat merkwürdig. Also zunächst mal stimme ich zu, es sieht so aus als würde der INSERT-Code laufen. Wann machst du denn das SELECT in PHPMyAdmin, ich nehme schon an danach oder? Wenn du deine Seite einmalig neu laden muss, dann scheint da noch irgendwas im Busch zu sein, so dass das tatsächliche Schreiben erst beim zweiten Durchlauf stattfindet.

          MfG
          Rouven

          --
          -------------------
          Death is nature's way of telling you to slow down.
        2. Moin!

          Nach allem, was ich von Browsern und HTTP weiß, bist du hier im Irrtum:

          Bei Auswahl einer Option im Drop-Down-Feld wird dann ein JavaScript ausgeführt:
          function Go (select)
          {
          var wert = select.options[select.options.selectedIndex].value;
          if (wert == 'empty')
          {
               select.form.reset();
            return;
          } else
          {
            location.reload();

          // An dieser Stelle endet das Javascript, und die bereits einmal geladene URL wird neu geladen. Was nicht passiert: Das Formular wird nicht ausgewertet und der darin selektierte Wert wird nicht an den Server geschickt!

          Insofern kann auch deine Datenbank nicht reagieren.

          location.href = wert;

          // Das hier ist dein hilfloser Versuch, den Wert trotzdem irgendwie rüberzuretten und tatsächlich eine NEUE Seite aufzurufen - funktioniert aber nicht, KANN NICHT funktionieren.

          Würdest du vorher auf das reload() verzichten, wäre im Programmablauf des Skriptes aber spätestens hier Schluß, und der letzte Befehl wird so oder so nie ausgeführt.

          select.form.reset();

          }
          }
          Das neuladen der Seite bewirkt das Ausführen folgenden Codes:

          Das eben nicht. Ein Reload() bewirkt nur das, was durch das vorherige Laden schon einmal bewirkt wurde. Nie etwas neues, was man auf der Seite verursacht.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Hallo Sven,

            das location.reload() hatte ich auch schon an letzter Stelle stehen, weil mir von der reinen Logik her selbiges auch sinnig erschien - ich habe einige hilflose Versuche unternommen den Fehler zu finden - erfolglos.

            Der Witz ist, das es ja einige mal wie gewünscht funktioniert, aber nachdem ich 4 oder 5 mal eine Software in die Liste aufgenommen und entfernt habe, funktioniert es halt nicht mehr - erst nach einem erneuten reload meiner Seite - daher auch mein versuch mit location.reload() selbigen nicht von Hand machen zu müssen.

            mfg

            Ngar

            1. Moin!

              das location.reload() hatte ich auch schon an letzter Stelle stehen, weil mir von der reinen Logik her selbiges auch sinnig erschien - ich habe einige hilflose Versuche unternommen den Fehler zu finden - erfolglos.

              Weder vorn noch hinten gehört es hin. Wenn es vorn steht, verhindert es den Aufruf der neuen Seite mit location.href.

              Steht es hinten, ist es wirkungslos, weil location.href vorher eine andere Seite aufruft.

              Der Witz ist, das es ja einige mal wie gewünscht funktioniert, aber nachdem ich 4 oder 5 mal eine Software in die Liste aufgenommen und entfernt habe, funktioniert es halt nicht mehr - erst nach einem erneuten reload meiner Seite - daher auch mein versuch mit location.reload() selbigen nicht von Hand machen zu müssen.

              location.reload() wird fast nie benötigt. Lösche es raus. Verwende es nie mehr - außer du willst tatsächlich explizit die aktuell angezeigte Seite in ihrem alten Zustand neu laden. Aber wann will man das? Wenn sich am Zustand nichts ändert, muß man auch nichts neu laden - und wenn sich was ändert, will man eine komplett neue Version, nicht eine reloadete.

              reload steht eher nicht für "neu laden", sondern für "nochmal laden". Das ist etwas vollkommen anderes. Das Ergebnis _kann_, wenn der Server mithilft, identisch sein, muß es aber nicht.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
  2. Ich habe noch was vergessen ^^

    Ich glaube das die Seite nicht komplett weider neu geladen wird, obwohl in der JS-Funktion location.reload() steht.

    Ich habe eine Textausgabe eingefügt, jedesmal bevor eine Datenbank anfrage ausgeführt wird (ich verwende eine Methode um die DB-Anfragen auszuführen und in dieser ist die Ausgabe eingefügt) - und diese Ausgabe erscheint nicht immer wenn ich einen Eintrag im Drop-Downfeld auswähle.

    Eine Echo-Anweisung vor dem Methoden-Aufruf wird mir angezeigt, aber nicht die Text-Ausgabe in der ausführenden Methode.

    Nochmals Danke

    Ngar