Hyper: option via datenbank vorselektieren

Hey Leute

Ich habe folgendes Problem:

Ich habe ein normales select, welches aus der Datenbank ausgelesen wird:

  
<?php  
	include ('dbconnect.php');  
	  
	$query = mysql_query('SELECT * FROM xy');  
	  
	echo '<td><select name="yy">';  
	while($result = mysql_fetch_array($query)){  
		echo '<option value="'.$result['pid'].'">'.$result['xy'].'</option>';  
	}  
	echo '</select></td>';  
?>  

Das Formular ist so programmiert dass es, falls error meldungen nach dem versenden auftauchen der eingegebene Inhalt in allen textfields etc. bleibt, also die value nach dem versenden gesetzt wird.

Nun möchte ich aber gerne dass auch das ausgewähle option bleibt.

Hatt jemand eine Idee wie ich das versuchen könnte?

  1. Hi!

    Nun möchte ich aber gerne dass auch das ausgewähle option bleibt.
    Hatt jemand eine Idee wie ich das versuchen könnte?

    Das Lesen der Seite zu den Auswahllisten wäre nicht verkehrt.

    Lo!

    1. Das Lesen der Seite zu den Auswahllisten wäre nicht verkehrt.

      Wie man vorselektiert ist mir durchaus klar. Was mir nicht ganz klar ist, wie ich den Datenbankeintrag welcher selektiert wurde, danach indentifizieren kann damit ich das '<selected>' überhaupt setzen kann.

      1. Hi!

        Was mir nicht ganz klar ist, wie ich den Datenbankeintrag welcher selektiert wurde, danach indentifizieren kann damit ich das '<selected>' überhaupt setzen kann.

        Mit einem Vergleich. Welches Problem hast du konkret? Wenn du nicht weißt, was von den Eingabedaten zum Vergleichen geeignet ist, dann lass sie dir mal anzeigen: print_r($_POST) (oder var_dump() oder $_GET).

        Lo!

        1. Hmmhh...ein Vergleich wird schwer, aber ich versuchs ein bisschen ausführlicher:

          Also. Ich habe ein Formular, darin gibts ein dorp down menü. Das Drop Down menü wird von diesem while erzeugt:

            
          <?php  
                  include ('dbconnect.php');  
            
                  $query = mysql_query('SELECT * FROM xy');  
            
                  echo '<td><select name="yy">';  
                  while($result = mysql_fetch_array($query)){  
                          echo '<option value="'.$result['pid'].'">'.$result['xy'].'</option>';  
                  }  
                  echo '</select></td>';  
          ?>  
          
          

          Mein Problem ist:

          Wenn jemand das Formular ausgefüllt hatt. Und eine Eingabe vergessen hatt, wird oben im Formular ein error ausgegeben, soweit alles normal. Nur:

          Wenn die Seite neu ladet da <form action="xy.php"> angegeben ist, werden ja die bereits eingetragenen Daten gelöscht und der User muss von vorn beginnen.

          Bei den textfields ist dies kein Problem, da ich einfach das value setzen kann.

          Nun habe ich in der variable $x = $_POST['yy'] das value, von dem select welches der user ausgewählt hatt. Nun soll, wenn das Formular einen error erzeugt wird und neu ladet die gleiche while schlaufe wieder durchlaufen nur
          diesmal soll halt eben dieses $_POST['yy'] value welches der User vorhin ausgewählt hatt beireits ausgewählt sein.

          Und wie ich genau dass in die obere while einbinde ist mir nicht klar.

          1. Hmmhh...ein Vergleich wird schwer, aber ich versuchs ein bisschen ausführlicher:

            Nein, nicht schwer. Du willst vergleichen ob die Zeile (<option>...), die aktuell geschrieben wird zuvor ausgewählt wurde.

            Ich habe ein paar Änderungen in deinen Code geschrieben. Wenn du die findest weißt du wies geht. Das kann man noch anders gestalten und so, aber im Prinzip macht man das so.

              
            <?php  
            include ('dbconnect.php');  
              
            $query = mysql_query('SELECT * FROM xy');  
              
            echo '<td><select name="yy">';  
            while($result = mysql_fetch_array($query)){  
            if ($result['pid'] == $_POST['yy']) $sel = 'selected="selected"';  
            else $sel = '';  
            echo '<option value="'.$result['pid'].'" '.$sel.'>'.$result['xy'].'</option>';  
            }  
            echo '</select></td>';  
            ?>  
            
            
          2. Hello,

            Hmmhh...ein Vergleich wird schwer, aber ich versuchs ein bisschen ausführlicher:

            Also. Ich habe ein Formular, darin gibts ein dorp down menü. Das Drop Down menü wird von diesem while erzeugt:

            <?php
                    include ('dbconnect.php');

            $query = mysql_query('SELECT * FROM xy');

            echo '<td><select name="yy">';
                    while($result = mysql_fetch_array($query)){
                            echo '<option value="'.$result['pid'].'">'.$result['xy'].'</option>';
                    }
                    echo '</select></td>';
            ?>

            
            >   
            > Mein Problem ist:  
              
            Dass Du Datenbeschaffung aus der DB, Aufbereitung zur Anzeige, Entgegennahme und Auswertung des (rückerhaltenen) Requests nicht sauber trennst.  
              
            Außerdem ist es für derartige \_Vorgänge\_ immer wichtig, dass man sich für eine Strategie entscheidet  
            - vorgangsaktuell  
            - requestaktuell  
              
            Für eine vorgangsaktuelle Strategie werden alle benötigten Daten am Anfang des Vorganges aus der Datenhaltung beschafft und z.B. in der Session zwischengespeichert. Ein Vorgang kann aus mehreren Roundturns (Request - Response) bestehen. Sind alle Daten dann vollständig, wird \_versucht\_, sie unter Beachtung von Konkurrenzsituationen in die Datenhaltung einzutragen. Konnten alle Änderungen fehlerfrei durchgeführt werden, ist der Vorgang abgeschlossen.  
              
            Eine requestaktuelle Bearbeitung eines komplexeren Vorganges habe ich bis heute noch nicht hinbekommen ohne eine umfangreiche und aufwändige Transaktionssteuerung zur Verfügung zu haben. Mit MySQL also bisher meiner Meinung nicht möglich.  
              
            Leider wird auf konkurrierende Zugriffe in den meisten Webapplikationen überhaupt nicht geachtet. Daher kommen dann immer die Buchungsfehler :-O  
              
              
              
            Baue die also eine Anzeigefunktion für das <select>, die nur Daten übernimmt z.B. in zwei Arrays. Sorge dafür, dass bei einer Rückführung der Daten beim Folgerequest auch eindeutog erkannt werden kann, zu welchem <select> diese gehören und welche zulässig sind.  
              
            Dazu musst Du (bei der Strategie "vorgangsaktuell") die letzte Abfrage aus der DB zwischenspeichern in der Session. Dann kannst du vergleichen, ob die gewählte Option zulässig ist, bzw. welcher Klartext zum Option-Index gehört.  
              
              
              
              
            Liebe Grüße aus dem schönen Oberharz  
              
              
            Tom vom Berg  
            ![](http://selfhtml.bitworks.de/Virencheck.gif)  
              
            
            -- 
             ☻\_  
            /▌  
            / \ Nur selber lernen macht schlau  
            <http://bergpost.annerschbarrich.de>
            
            1. Hey Tom,

              Könntest du mir vielleicht erklähren was du mit Sessions meinst?
              Um ein vom User eingegebenes Formular in eine Datenbank zu speichern, braucht es nicht wirklich Sessions, oder etwa doch?

              1. Hello Sophie,

                Könntest du mir vielleicht erklähren was du mit Sessions meinst?

                Eine Session ist eine "Arbeitssitzung eines Benutzers", in der (Windows-)Praxis aber meistens eines Clients, bzw. des Gerätes, auf dem der Client läuft.

                Um ein vom User eingegebenes Formular in eine Datenbank zu speichern, braucht es nicht wirklich Sessions, oder etwa doch?

                Wenn man Wert darauf legt, dass alle Schritte einer Vorgangsbearbeitung in vorgedachten Bahnen ablaufen, wird man nicht ohne eine Session auskommen. Jede Vorgangsbearbeitung, die mehr als einen Roundturn (Request + Response) benötigt, benötigt zur Absicherung eine Session.

                Dies wird im HTTP-Umfeld, in dem Requests ja erstmal alle einzeln dastehen, also keinem Client zugeordnet werden können, ganz besonders wichtig. Man erzeugt durch die Session eine Zustandsorientierung. HTTP ist ohne Sessions "zustandslos". Jeder Request fängt quasi wieder bei Null an.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. @Tom

                  Hättest du mir ein Beispiel oder ein Artikel darüber, wo ich mich ein bisschen ausführlicher darüber informieren könnte?

                  1. Hello Sophie,

                    Hättest du mir ein Beispiel oder ein Artikel darüber, wo ich mich ein bisschen ausführlicher darüber informieren könnte?

                    Speziell bei PHP schaust Du als erstes mal bei http://www.php.net/manual/en/book.session.php

                    Dort kannst Du schon eine Menge nachlesen. Wenn dann weitere Fragen bestehen, frag hier einfach nochmal nach.

                    Und um die Unterscheidungen zwischen den Protokollen zu verstehen:

                    http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
                    http://de.wikipedia.org/wiki/Routing

                    Die Übersicht, die ich Dir verlinken wollte, ist leider nicht mehr erreichbar. Vielleicht kennt hier ja noch jemand eine vernünftige Übersicht über Protokolle der Datenkommunikation.

                    Liebe Grüße aus dem schönen Oberharz

                    Tom vom Berg

                    --
                     ☻_
                    /▌
                    / \ Nur selber lernen macht schlau
                    http://bergpost.annerschbarrich.de