selected im select

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

  • selected im select

    Hallo,

    ich habe ein Problem mit dem selected im select.
    2 Funktionen sollen das lösen:

    Die Erste bekommt immer einen distinct sql Befehl. Listet also alle Dinge die in einer Spalte vorkommen auf.(funktioniert auch mit leichten Abänderungen für sich alleine)



    function create_select($name, $size, $sql_statement, $spaltenname, $vergleichsstatement)
    {
    ociexecute($sql_statement,OCI_DEFAULT);
    echo "<select name=\"$name\" size=\"$size\">";
    while (OCIFetchInto($sql_statement,$results,OCI_ASSOC))
    {
    $wert = $results["$spaltenname"];
    echo "<option value='$wert'";
    if(vergleich($vergleichsstatement, $spaltenname) == $wert)
    {echo " selected";}
    echo '>$wert</option>';

    }
    echo "</select>";
    }



    Die Zweite ist nur eine Hilfsfunktion. Sie liesst aus einem langen Statement (50 Tabellenzeilen betreffend nur den Wert der Spalte aus, den man ihr mit gibt
    (ist immer nur ein Wert = Resultsarray hat immer genau ein Wert)



    function vergleich($sql_statement, $spaltenname)
    {
    ociexecute($sql_statement,OCI_DEFAULT);
    while (OCIFetchInto($sql_statement,$result,OCI_ASSOC))
    {
    $wert = $results["$spaltenname"];
    }
    return $wert;
    }



    Beide Funktionen bekommen aus unterschiedlichen sql-Statements die gleiche Spalte übergeben.

    Nun soll einfach an den beiden Stellen wo sich die Funktionen "treffen" ein selected ausgegeben werden. Warum funktioniert das so nicht?

    Gibt es da noch eine wesentlich einfachere Methode oder eine die nicht so Resourcen fressend ist?

  • #2
    Re: selected im select

    Original geschrieben von galaxy

    Die Zweite ist nur eine Hilfsfunktion. Sie liesst aus einem langen Statement (50 Tabellenzeilen betreffend nur den Wert der Spalte aus, den man ihr mit gibt
    (ist immer nur ein Wert = Resultsarray hat immer genau ein Wert)
    nei das macht sie nicht, wie denn auch . Was sie macht ist: immer den letzen Wert der Spalte zurückzugeben.

    Andererseits was willst du denn eigentlich machen? mach mal:

    - echo $sql_statement
    - echo $vergleichsstatement

    und poste mal die Ausgabe hierein.

    btw: bitte lesen: http://www.php-resource.de/forum/sho...threadid=47906

    Kommentar


    • #3
      Ich bins wieder. Musste mich neu anmelden als galaxy2 da ich als galaxy nicht mehr eingeloggt wurde.

      nei das macht sie nicht, wie denn auch . Was sie macht ist: immer den letzen Wert der Spalte zurückzugeben.

      das machst sie meiner Meinung nach schon. dieses Statement liefert ja auch nur jereils ein Wert pro Spalte, da es am ende mit where kundennummer=4(pk) limitiert ist.


      Grundlage:
      Erstellen eines selects in einem HTML-Formular:

      Ein sql Befehl liesst alle moglichen Personen aus (mit distinct) und liestet sie in einem select auf.
      !!!!!!!!!!die Funktion create select!!!!!!!!!

      Ein anderer sehr langer sql Befehl welcher unter anderem diese Spalte beinhaltet wird auch ausgeführt. Dieser befehl hat am Ende ... where kundennr =4;
      Somit liefert er nur ganz genau einen Wert für die Schnittmenge der Spalten zurück(Kundennummer ist Primary key)
      !!!Für die Funktion vergleich!!!!!!!!!!!!!



      Mit Hilfe von diesem 2ten Befehl soll dann deas entsprechende Element aus dem erstellten select(Auswahlliste) als selected markiert werden.
      Es funzt aber nicht

      Ziel des ganzen ist folgendes:
      Man kann auf der Formularoberfläche durch de ganzen Datensätze blättern
      per "Record". in den selects auf dem Formular sollen immer genau die Werte der Spalten markiert werden(also auf selected gesetzt werden) welche zu dem gerade angezeigten Datensatz passen.Die Datensätze werden mit dem sehr langen statement eingelesen (Umfasst 50 Spalten)
      Man soll in dem Formular aber auch Aenderungen vornehmen können. Dafür werden in den selects(Auswahlisten) alle möglichen felder noch mit einer 2ten Query mit distinct aufgelistet.wählt man nun bei einem gegebenen Datensatz ein anderen Wert im select aus so wird der neue Wert fest in die Datenbank geschrieben

      Kommentar


      • #4
        1. wenn die Abfrage nur einen Wert liefert, wozu dann die while-Schleife?

        2. ich verstehe nicht ganz was du machen willst

        übrigens, dein PC kann auch 'ne neue Tastatur vertragen

        Kommentar


        • #5
          Re: selected im select

          Original geschrieben von galaxy

          function vergleich($sql_statement, $spaltenname)
          {
          ociexecute($sql_statement,OCI_DEFAULT);
          while (OCIFetchInto($sql_statement,$result,OCI_ASSOC))
          {
          $wert = $results["$spaltenname"];
          }
          return $wert;
          }
          Wenn Du sowieso nur den Wert einer Spalte brauchst, warum fragst Du die dann nicht einzeln in Deinem $sql_statement ab, anstatt immer die gleiche komplexe Abfrage zu machen und dann nur ein Feld rauszusuchen.

          Ausserdem machst Du für jeden Wert, den die Abfrage in function create_select liefert, eine zweite Abfrage. Klar frisst das Ressourcen.

          Ohne jetzt Deine Tabellenstruktur zu kennen, würde ich sagen, dass das nach einem JOIN schreit.
          Felder aus einer Tabelle und dazu passende Werte aus einer anderen Tabelle mit variabler Spaltenangabe rauszusuchen.

          Kannst Du die SQL-Statement nicht mal posten (verkürzt). Würde helfen
          Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

          Kommentar


          • #6
            Also dann versuch ich es nocheinmal.

            Ich habe ein html Formular mit ca 30 select feldern 10 eingabefeldern und 2 Textareas. Nun möchte ich dieses mit Daten aus einer Datenbank (Oracle 9i) füllen.



            sql1: Select clientname,phone from ...
            .... where ...(hier stehen massenhaft joins).. and
            kundennummer="kundennummer"

            Die "kundennummer" wird aus einem Textfeld eingelesen. Kundennummer ist der primary key. Somit bekomme ich für jede Spalte dieses ellen langen Statements immer genau einen Wert. Und zwar immer den welcher der entsprechenden kundennummer zugeordnet ist.
            Bei diesem Statement wird über 4-6 Tabellen gejoint.
            dieses statement ist für die funktion vergleich (also pro Spalte immer genau einen wert)


            sql2: select distinct(clientname) from kunde
            select distinct(phone) from kunde

            diese statements dienen einzig allein dem Grund, das sie die select-Felder im Formular mit allem, was möglich ist, füllen. Z.B. alle Clientnamen die es gibt in ein selectfeld. sie lesen also alle inhalte in die selectfelder.
            Diese statements sind jeweils für die function create _select gedacht


            Das sql1 statement ist nun dazu da das alle Daten der selectfelder "richtig" dargestellt werden. Sql2 erzeugt ja wie gesagt die selects. Nun soll mit sql1 in jedem der selects die Werte auf selected gesetzt werden welche gerade zu der kundennummer passen. Habe eine Art Record auf der Seite sodass man die Möglichkeit hat eine Kundennummer einzugeben, ein hoch zu zählern etc .

            Wenn ich nun die Kundenummer hochzähle dann liefert sql1 ja kommplett neue Werte . Nun müssten diese dann in den jeweiligen selects auf selected gesetzt sein. Dafür habe ich mich für diese Strucktur entschieden
            Man soll dann die Möglichkeit haben bei einem Datensatz auch in einem select was anderes auszuwählen was dann am Ende in der Datenbank gespeichert wird. Soll so eine Art Intranet-system werden



            Wie lese ich denn den einen Wert aus dem resultsarray(OCI_ASSOC) in der Funktion vergleich heraus ohne whileschleife?
            $wert = $results["$spaltenname"]; => So geht das nicht.

            Wenn jemand eine viel einfacheren Vorschlag hat, bitte melden. Bin für alles offen. Geht aber wohl nicht Resourcen schonender


            Noch ne kurze Frage: Ich mus dass sql1 statement für jede spalte in der vergleichsfunktion neu ausführen, da sonst der cursor am ende steht. geht das auch anders. Also so das ich es einmal einlese und dann jede Spalte vergleichen kann mit den distinctfeldern von sql2

            Zuletzt geändert von galaxy2; 03.06.2005, 08:41.

            Kommentar


            • #7
              Original geschrieben von galaxy2



              sql1: Select clientname,phone from ...
              .... where ...(hier stehen massenhaft joins).. and
              kundennummer="kundennummer"

              Die "kundennummer" wird aus einem Textfeld eingelesen. Kundennummer ist der primary key. Somit bekomme ich für jede Spalte dieses ellen langen Statements immer genau einen Wert. Und zwar immer den welcher der entsprechenden kundennummer zugeordnet ist.
              Bei diesem Statement wird über 4-6 Tabellen gejoint.
              dieses statement ist für die funktion vergleich (also pro Spalte immer genau einen wert)

              Noch ne kurze Frage: Ich mus dass sql1 statement für jede spalte in der vergleichsfunktion neu ausführen, da sonst der cursor am ende steht. geht das auch anders. Also so das ich es einmal einlese und dann jede Spalte vergleichen kann mit den distinctfeldern von sql2
              Richtig erkannt!
              Die Abfrage liefert doch immer dasselbe Ergebnis für eine Kundennummer. Also brauchst Du sie auch nur einmal ausführen! Würde ich schon in der function create_select machen und das Ergebnis in einem ANDEREN Array als $results speichern.
              Dann kannst Du in der function create_select auf die Werte zugreifen.

              Wie lese ich denn den einen Wert aus dem resultsarray(OCI_ASSOC) in der Funktion vergleich heraus ohne whileschleife?
              $wert = $results["$spaltenname"]; => So geht das nicht.
              PHP-Code:
              OCIFetchInto ($sql_statement$resultsOCI_ASSOC); 
              Dann ist die erste Zeile des Ergebnisses in $results. Wenns nur eine gibt, brauchst du kein while
              Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

              Kommentar


              • #8
                @tommyk

                kannst du dich mal bitte etwas genauer ausdrücken?
                In etwas Quellcode. Weis nämlich nicht wie das mit dem 2 array funktionieren soll.





                PHP-Code:
                OCIFetchInto ($sql_statement$resultsOCI_ASSOC); 
                Das ist mir klar. Bekomme es aber so

                PHP-Code:
                $wert $results["$spaltenname"]; 
                oder so
                PHP-Code:
                $wert $results[0]; 
                nicht ausgelesen.

                Kann aber auch sein dass ich im moment ziemlich auf dem Schlauch stehe

                Kommentar


                • #9
                  Sorry hab mich mit den $-Variablen vertan

                  Also, in Deiner create_select machst Du erst die Vergleichsabfrage
                  PHP-Code:
                  OCIFetchInto ($vergleichsstatement$vergleichResultsOCI_ASSOC); 
                  DAnn hast Du alle Spalten in $vergleichResults und kannst mit
                  PHP-Code:
                  $vergleichswert $vergleichResults[$spaltenname]; 
                  drauf zugreifen.

                  Dann lautet Deine while-Schleife
                  PHP-Code:
                  while (OCIFetchInto($sql_statement,$results,OCI_ASSOC)) 
                  {
                  $wert $results["$spaltenname"];
                  $vergleichswert $vergleichResults[$spaltenname]
                  echo 
                  "<option value='$wert'";
                  if(
                  $vergleichswert == $wert)
                  {echo 
                  " selected";}
                  .... 
                  Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

                  Kommentar


                  • #10
                    Hab nun eine Lösung gefunden. Sie funktioniert sogar. Ob sie nun
                    performant ist weiss ich nicht. wenn jemand was besseres weiss dann
                    kann er ja änderungen vorschlagen


                    So sieht die Funktion create_select aus:
                    PHP-Code:
                    function create_select($name,$laenge$size$sql_statement$spaltenname$vergleichsstatement)
                    {
                      
                    ociexecute($sql_statement,OCI_DEFAULT);
                      echo 
                    "<select name=\"$name\" size=\"$size\" style=\"width:$laenge\">";
                      
                    $wert_aus_vergleich=vergleich($vergleichsstatement$spaltenname);
                      if (
                    $wert_aus_vergleich=="")
                      
                    $selected="selected";
                      else 
                    $selected="";
                      echo 
                    "<option value='null' $selected></option>";
                      while (
                    OCIFetchInto($sql_statement,$results,OCI_ASSOC))
                      {
                         
                    $wert $results["$spaltenname"];
                         if (
                    $wert_aus_vergleich==$wert)
                            
                    $selected="selected";
                         else 
                    $selected="";
                         echo 
                    "<option value='$wert$selected>$wert</option>";
                      }
                      echo 
                    "</select>";




                    So sieht die Funktion vergleich aus:
                    PHP-Code:
                    function vergleich($vergleichsstatement$spaltenname)
                    {
                     
                    ociexecute($vergleichsstatement,OCI_DEFAULT);
                     while (
                    OCIFetchInto($vergleichsstatement,$results,OCI_ASSOC))
                     {
                      
                    $wert $results["$spaltenname"];
                     }
                     return 
                    $wert;


                    @tommyk:

                    dann sag mir mal wie ich die vergleich Funktion ohne schleife schreiben soll. das array results hat definitiv immer genau einen Wert. Lass ich die whileschleife einfach weg, dann geht es nicht.

                    Danke nochmal für eure Hilfe

                    Kommentar


                    • #11
                      Auch wenns funzt, machst Du in der function Vergleich jedesmal die gleiche Abfrage, um jedesmal den gleichen Wert rauszukriegen.

                      Wie wärs damit ?
                      PHP-Code:
                      function create_select($name,$laenge$size$sql_statement$spaltenname$vergleichsstatement)
                      {
                        
                      #vergleichswert ermitteln mit vergleichsstatement, spalte
                        
                      ociexecute($vergleichsstatement,OCI_DEFAULT);
                        
                      OCIFetchInto ($vergleichsstatement$vergleichResultsOCI_ASSOC);  
                        
                      $vergleichswert $vergleichResults[$spaltenname];

                        
                      #Hauptabfrage durchführen
                        
                      ociexecute($sql_statement,OCI_DEFAULT);
                        echo 
                      "<select name=\"$name\" size=\"$size\" style=\"width:$laenge\">";
                        
                        if (
                      $vergleichswert =="")
                        
                      $selected="selected";
                        else 
                      $selected="";
                        echo 
                      "<option value='null' $selected></option>";
                        
                      # alle werte ausgeben
                        
                      while (OCIFetchInto($sql_statement,$results,OCI_ASSOC))
                        {     
                          
                      #wenn wert = vergleichswert, selected
                           
                      if ($vergleichswert==$wert)
                              
                      $selected="selected";
                           else 
                      $selected="";
                           echo 
                      "<option value='$wert$selected>$wert</option>";
                        }
                        echo 
                      "</select>";

                      Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

                      Kommentar

                      Lädt...
                      X