Daniel: confirm abhängig von select-Auswahl

Hallo @ all!

Ich habe folgendes Problem:

In einem Formular habe ich über eine Suchanfrage eine Combobox dynamisch (mittels PHP und MySQL) gefüllt. Nun hat der Nutzer die Möglichkeit, ein Ergebnis auszuwählen und über einen Button dieses in die Datenbank zu schreiben. Das klappt auch alles.
Nun möchte ich aber, dass abhängig davon, welches Ergebnis ausgewählt wurde, ein confirm-Fenster erscheint und den Nutzer fragt, ob er das wirklich tun möchte. Da dieses aber nicht bei allen Datensätzen abgefragt werden brauch, soll die confirm-Meldung eben nur bei einigen Ergebnissen erscheinen.
Mir ist schon klar, dass ich dafür eine neue DB-Abfrage machen muß(was auch nicht das Problem ist), jedoch "hänge" ich einfach an dem Problem serverseitig<-->browserseitig...

  1. Hallo Daniel,

    Du legst in der Datei, die die Funktion bestaetigen() oder wie immer die heisst, ein leeres Array an, sagen wir conf_required = new Array();

    Dann fuellst Du im PHP-Script deine Selectbox in der while-Schleife nach der DB-Abfrage. Diejenigen Eintraege, die ein confirm() erfordern, schiebst Du derweil in ein Array, sagen wir $conf_arr.

    Nach der while-Schleife faengst Du einen neuen String mit <script type="text/javascript"> an
    und haengst mit foreach fuer alle $conf_arr ein conf_required.push() an, mit andern Worten du fuellst den Javascript-Array mit den Daten aus dem PHP-Array

    Jetzt kannst Du auf der fertigen mit onchange auf der Selectbox dein Javascriptereignis aufrufen, dabei jedesmal durch den conf_required durchgehen und nachschauen ob du ein confirm() machen willst oder nicht.

    Gruß,

    Dieter

    1. Hallo, Dieter!

      Vielen Dank erst einmal für Deine Antwort!

      Was ich jetzt noch nicht ganz verstanden habe, ist folgendes: Wie fülle ich das JavaScript-Array mit dem Inhalt des PHP-Arrays? Innerhalb des neu angefangenen Javascriptes oder noch in PHP?

      Daniel

      1. Hallo Daniel,

        Ich mach Dir mal ein Beispiel, und behaupte in der Tabelle waere ein Feld 'conf' ggf. mit den Texten fuer die Bestaetigung

        $query = 'SELECT...
        $result = mysql_query ...
        while($data = mysql_fetch_assoc($result))
        {
          // In $data stehen, der Wert der Option, der Text und der Bestaetigungstext
          $options .= '<option value="' . $data['value'].... // da befuellst du deine Selectbox
          if(!empty($data['conf']))
          {
            $js_arr[$data['value']] = $data['conf'];// assoziatives Array mit Optionwert als Key
          }
        }
        $js_string = "<script type="text/javascript">\n";

        foreach($js_arr as $key => $value)
        {
          $js_string .= 'JSConfArray[' . $key . '] = ' . $value . ";\n";
        }
        $js_string .= "<script>\n";

        Im Ergebnis sieht das so aus
        <select ... onchange="bestaetigen....>
        <option value="foo"....
        </select>
        <script type="text/javascript">
          JSConfArray[foo] = 'Wollen Sie das foo wirklich loeschen';
          JSConfArray[bar] = 'Wollen Sie das bar wirklich ueberschreiben';
        </script>

        Jetzt kannst Du mit for..in jedesmal das Array darauhin durchsuchen, ob eine Betaetigung erforderlich ist, und wenn ja, mit welchem Text.

        Gruß,

        Dieter

        1. Hallo, Dieter!

          Vielen Dank für Deine Mühe. Ich habe es jetzt (fast) genauso umgesetzt, aber irgendwie will es noch nicht laufen. Ich poste hier mal die wichtigen Quellcodestellen:

          //MySQL-Abfrage:
          $result3 = mysql_query ("SELECT * FROM ....");

          //Combobox und Hilfsarray:
          printf ("<SELECT NAME="oidv" SIZE="%s">\n", min (5, mysql_num_rows ($result3)));
             while ($row3 = mysql_fetch_array ($result3)) {
                  printf ("<OPTION VALUE="%s">%s\n", $row3["VOID"], $row3["Name"]);
                      if($row3["OID"]==0)
                      $pruefung[$row3["VOID"]]=0;
                  else $pruefung[$row3["VOID"]]=1;

          }
                           echo "</SELECT>";

          //String für JS-Array und JS-Funktion:
          $js_string = "\n<script type="text/javascript">\n";
                                  foreach($pruefung as $key => $value)
                                  {
                                  $js_string .= 'JS_Array[' . $key . '] = ' . $value . ";\n";
                                  }
             $js_string .= "function Ueberpruefen(v_oid){\n";
                $js_string .= "if(JS_Array[v_oid]==1){\n";
             $js_string .= "ok=confirm("Dieser Veranstaltungsort besitzt bereits ein Objekt. Überschreiben?");} \n";
             $js_string .= "return ok;}\n";
             $js_string .= "</script>\n\n";
             echo $js_string;

          //Darstellung Button und Aufruf JS-Script
          echo "<BR><INPUT TYPE="SUBMIT" NAME="addVera" onclick= " return Ueberpruefen(window.document.addVeraForm.oidv.options[window.document.addVeraForm.oidv.options.selectedIndex].value);" VALUE="Hinzuf&uuml;gen"></td>";

          Vielen Dank!

          Daniel

          1. Hallo Daniel,

            1. Was geht nicht, gibt es eine Fehlermeldung?
            2. Wie sieht die fertige Seite im Quelltext aus?

            Gruß,

            Dieter

            1. Hallo, Dieter!

              zu1.: Der ausgewählte DS wird ohne die gewünschte Abfrage einfach in die DB geschrieben.

              zu2.:

              ...
              <OPTION VALUE="1029">a
              <OPTION VALUE="1030">b
              <OPTION VALUE="1268">c
              <OPTION VALUE="1468">d
              <OPTION VALUE="1598">e
              <OPTION VALUE="2025">f
              <OPTION VALUE="1841">g
              <OPTION VALUE="1842">h
              <OPTION VALUE="1983">i
              <OPTION VALUE="1843">j
              </SELECT>
              <script type="text/javascript">
              JS_Array = new array();
              JS_Array[1029] = 0;
              JS_Array[1030] = 0;
              JS_Array[1268] = 0;
              JS_Array[1468] = 1;
              JS_Array[1598] = 1;
              JS_Array[2025] = 0;
              JS_Array[1841] = 1;
              JS_Array[1842] = 1;
              JS_Array[1983] = 0;
              JS_Array[1843] = 0;
              function Ueberpruefen(v_oid){
              alert(JS_Array[v_oid])
              if(JS_Array[v_oid]==1){
              ok=confirm("Dieser Veranstaltungsort besitzt bereits ein Objekt. Überschreiben?");
              return ok;}
              else return true;}
              </script>
              ...
              <INPUT TYPE="SUBMIT" NAME="addVera" onclick= " return Ueberpruefen(window.document.addVeraForm.oidv.options[window.document.addVeraForm.oidv.options.selectedIndex].value);" VALUE="Hinzuf&uuml;gen">
              ...

              Danke!

              Daniel

              1. Hallo Daniel,

                Erstmal die formalen Sachen

                • Wenn Du xhtml oder auch einfach nur gutes HTML anstrebst, sollten dein options die Form <option value="1234">a</option> haben, also klein geschrieben und geschlossen. Es waere auch nett, die options wegen der Uebersicht etwas einzuruecken. Das bezieht sich im Prinzip auf alle Elemente.
                • JavaScript mag auch eingerückt werden
                • Deine Benamungen sollten aussagekräftiger sein.
                  Die Formalien haben den Sinn, dass das Script uebersichtlicher wird und vor allem , dass sich Dritte, so wie ich, oder aber du selbst Du in 6 Wochen, darin zurechtzufinden.

                Zum Javascript

                • Du musst, wenn Du PHP schreibst, error_reporting auf 2047 (E_ALL) haben. Bei Javascript musst Du ebenfalls einen Debugger haben. Eine gute Kombination ist die Javascript-Konsole von Mozilla oder Firebird zusammen mit der Web Developer Extension von Chris Pederick. Haettest Du einen Debugger, waere dir aufgefallen, dass Javascript das Array JS_Array nicht kennt. Der Grund ist, dass JavaScript zwischen Groß- und Kleinschreibung unterscheidet , es muss also new Array() heissen, nicht new array().
                • Dein ursprüngliches Anliegen war, wenn ich Dich richtig verstanden habe:
                    - wenn die Option keiner Ueberpruefung bedarf, soll die Form einfach abgeschickt werden
                    - wenn eine Ueberpruefung notwendig ist, soll die Form nur bei Zustimmung abgeschickt werden
                • Demnach muss die Funktion onsubmit (der Form) ausgefuehrt werden, nicht onclick (des Buttons). Siehe Kommentare in der Funktion fuer weiteres

                Im Ergebnis sieht das so aus:

                <form name="addVeraForm" action="foo.php" onsubmit="return Ueberpruefen(this.oidv.options[this.oidv.options.selectedIndex].value)">
                <select name="oidv">
                  <option value="1029">a</option>
                  <option value="1468">d</option>
                </select>
                <script type="text/javascript">
                  JS_Array = new Array();
                  JS_Array[1029] = 0;
                  JS_Array[1468] = 1;

                function Ueberpruefen(v_oid)
                  {
                    if(JS_Array[v_oid] == 1) //confirm() ausgeben oder nicht
                    {
                      ok = confirm("Dieser Veranstaltungsort besitzt bereits ein Objekt. Überschreiben?");
                      if(ok) // ok geklickt oder cancel?
                      {
                        return true;// wenn ok, dann abschicken
                      }
                      else return false; // wenn cancel, nicht abschicken
                    }
                    else return true;// Kein confirm(), also abschicken
                  }
                </script>
                ...
                <input type="submit" name="addVera">

                Gruß,

                Dieter

                1. Hallo, Dieter!

                  Jetzt geht es! Vielen, vielen Dank für Deine Mühe und auch für die Hinweise zum JavaScript-Debugger!

                  Viele Grüße!

                  Daniel

                  1. Hallo Daniel,

                    Jetzt geht es! Vielen, vielen Dank für Deine Mühe und auch für die Hinweise zum JavaScript-Debugger!

                    Prima, gerngeschen!

                    Gruß,

                    Dieter