Daten aus Db in selectbox anzeigen

D

Deejoy

Hi,
ich habe ein Formular wo mehrere persönliche Daten eigegeben werden.
Nun möchte ich wenn jemand die Postleitzahl eingibt eine selectbox angezeigt wird wo der passende Ort zur Postleizahl steht. Das ganze soll nach der eingabe der PLZ erfolgen und ohne das der User einen Submitbutton oder ähnliches klicken muß.
Das ganze soll "laut anderer" mit Javascript funktionieren. Davon habe ich jeoch überhaupt keine Ahnung.
Wie müßte sowas den ausehen
 
Du müsstest in irgendeiner Art die Daten(Postleitzahl/Ort) im Dokument für Javascript verfügbar machen, bspw.in einem Array.

Angesichts der Vielzahl an Postleitzahlen alleine in Deutschland dürfte dein Dokument dadurch mehrere MB gross werden....also kaum praktikabel.

Eine andere, sinvollere Lösung wäre, z.B. in einem versteckten iFrame/Frame nach Eingabe der PLZ ein PHP-Skript(oder sonstiges serverseitiges Skript)aufzurufen, welches den passenden Ort aus deiner DB holt und dann das entsprechende Formularfeld erstellt/ändert/o.ä.
 
Eine andere, sinvollere Lösung wäre, z.B. in einem versteckten iFrame/Frame nach Eingabe der PLZ ein PHP-Skript(oder sonstiges serverseitiges Skript)aufzurufen, welches den passenden Ort aus deiner DB holt und dann das entsprechende Formularfeld erstellt/ändert/o.ä.

Das hört sich net an hast du mal ein beispiel kann mir das gerade in der funktion schlecht vorstellen
 
Beispiel: (habs mal mit Berliner Postleitzahlen gemacht)

Meine Seite enthält folgendes:
  • ne verstecktes <iframe> mit dem Namen dummie
  • ein Formular mit dem Namen frm
  • darin ein Textfeld
  • und ein <select> mit namens loc_out, welches erstmal mit visibility:hidden versteckt wird

in dem Textfeld rufe ich bei Tastatureingaben eine Funktion auf:
Code:
<input type="text"name="plz_in"maxlength="5"onkeyup="show_location(this)">

Die aufgerufene Funktion:
Code:
function show_location(objInput)
{
if(!String(objInput.value).match(/^\d{5}$/))
    {
    objInput.form.loc_out.style.visibility="hidden";
    }
else
    {
    window.dummie.location="plz.php?plz="+objInput.value;
    }
}
....überprüft, ob die Eingabe aus 5 Ziffern besteht.
Wenn nicht, wird das <select> versteckt(falls es sichtbar war :))
Ansonsten wird im versteckten iFrame ein PHP-Skript aufgerufen, welchem als Parameter die eingegebene Zahl übermittelt wird.

Das PHP-Skript sucht in der DB nach der Postleitzahl und schreibt je nach Suchtreffer den nötigen JS-Code in die Seite, mit welchem die Liste im Elternfenster manipuliert wird.

Der statische Teil dieses JS-Codes:
Code:
<script type="text/javascript">
<!--

function get_location()
{
if(typeof parent.dummie=='object' && typeof parent.document.frm.loc_out=='object')
    {
    objList = parent.document.frm.loc_out;
    objList.options.length=0;
    //Hier kommt der dynamische Teil, der durch PHP erzeugt wird
    }
}
if(self==top)
    {
    document.location='index.htm';
    }
else
    {
    get_location();
    }
//-->
</script>

...das Skript löscht erstmal die <option>'s aus der Liste.

Der dynamische Teil: (Es besteht bereits eine Variable $location, welche den String "unbekannt" enthält)
PHP:
 <?php
    //Wurde Parameter übergeben?
    if(isset($_GET['plz']))
        {
        //Existiert die gesuchte PLZ?
        //Ich hab statt einer DB alles in einem assoziativen Array($locations) abgelegt,
        //und prüfe, ob ein Element mit dem Schlüssel PLZexistiert
        if(isset($locations[$_GET['plz']]))
            {
            $location=$locations[$_GET['plz']];
            }

        //Ich splitte $location und sortiere ihn ein wenig ...falls die Postleitzahl gefunden wurde,
        //könnte sie zu mehreren Ortsteilen gehören...welche ich
        //jeweils kommasepariert in den Arrayelementen habe
        $location=explode(',',$location);
        array_unique($location);
        sort($location,SORT_STRING);

        //Für jede Option, welche ich in die Liste einfügen will, folgende JS-Anweisung erzeugen
        foreach($location as $key=>$value)
            {
            echo "\n\tparent.add_option('".$value."');";
            }
        }
       ?>

Die Funktion add_option(), welche sich wiederum im Elternfenster befindet, sieht folgendermassen aus:
Code:
function add_option(strText)
{
objList=document.frm.loc_out;
objList.options[objList.options.length]=new Option(strText);
objList.style.visibility='visible';
}
....sie bekommt als Parameter eine Zeichenkette übergeben...den Text der einzufügenden <option>
Sie erzeugt diese Option und zeigt die Liste an(falls dies noch nicht der Fall ist)

Wenns fertig ist, siehts dann so aus.

Also, wenn du so willst, fast soetwas wie eine DB-Abfrage per Javascript, ohne (sichtbares) (re)loaden.
 
Zuletzt bearbeitet:
Ich brächte da nochmal deine Hilfe.

Die plz.php sieht ja folgendermasen aus

PHP:
<script type="text/javascript">
<!--

function get_location()
{
if(typeof parent.dummie=='object' && typeof parent.document.frm.loc_out=='object')
    {
    objList = parent.document.frm.loc_out;
    objList.options.length=0;
<?php 
    //Wurde Parameter übergeben? 
    if(isset($_GET['plz'])) 
        { 
        //Existiert die gesuchte PLZ? 
        //Ich hab statt einer DB alles in einem assoziativen Array($locations) abgelegt, 
        //und prüfe, ob ein Element mit dem Schlüssel PLZexistiert 
        if(isset($locations[$_GET['plz']])) 
            { 
            $location=$locations[$_GET['plz']]; 
            } 

        //Ich splitte $location und sortiere ihn ein wenig ...falls die Postleitzahl gefunden wurde, 
        //könnte sie zu mehreren Ortsteilen gehören...welche ich 
        //jeweils kommasepariert in den Arrayelementen habe 
        $location=explode(',',$location); 
        array_unique($location); 
        sort($location,SORT_STRING); 

        //Für jede Option, welche ich in die Liste einfügen will, folgende JS-Anweisung erzeugen 
        foreach($location as $key=>$value) 
            { 
            echo "\n\tparent.add_option('".$value."');"; 
            } 
        } 
       ?> 



    }
}
if(self==top)
    {
    document.location='index.htm';
    }
else
    {
    get_location();
    }
//-->
</script>

Wie was wann wo muß da jetzt die db abfrage rein
PHP:
include ('inc/config.php');
@mysql_connect($sqlhost,$sqluser, $sqlpwd) OR die(mysql_error());  
mysql_select_db($db_name) OR die(mysql_error());          
$sql = "select ort from plz where plz='$_GET[plz]'";
$result= mysql_query($sql) OR die(mysql_error());
$row = mysql_fetch_array($result);
 
Bei dir sollte es reichen, falls du pro PLZ nur einen Ort hast, jenes(rot markierte):
Code:
$location=$locations[$_GET['plz']];
durch dass Ergebnis deines QUERY zu ersetzen....du musst halt dafür sorgen, dass in $location der passende Ort(falls gefunden) gespeichert wird.
 
Dann sollte es gehen, wenn du den "dynamischen" Teil so änderst:
PHP:
<?php 

    //Wurde Parameter übergeben? 
    if(isset($_GET['plz'])) 
        { 
include ('inc/config.php'); 
@mysql_connect($sqlhost,$sqluser, $sqlpwd) OR die(mysql_error());   
mysql_select_db($db_name) OR die(mysql_error());           
$sql = "select ort from plz where plz='$_GET[plz]'"; 
$result= mysql_query($sql) OR die(mysql_error()); 
 
        while($row = mysql_fetch_array($result)) 
            { 
            echo "\n\tparent.add_option('".$row['ort']."');"; 
            } 
        } 
       ?>
P.S: in dem "Ort" dürfen keine Zeilenumbrüche und einzelnen Anführungszeichen vorkommen.

$row = mysql_fetch_array($result);
 
Ich bin definitiv zu doof dafür. jetzt bekomme ich noch nichtmal ein fenster angezeigt


PHP:
<script type="text/javascript">
<!--

function get_location()
{
if(typeof parent.dummie=='object' && typeof parent.document.frm.loc_out=='object')
    {
    objList = parent.document.frm.loc_out;
    objList.options.length=0;
<?php 
    //Wurde Parameter übergeben? 

    if(isset($_GET['plz'])) 
        { 
include ('inc/config.php'); 
@mysql_connect($sqlhost,$sqluser, $sqlpwd) OR die(mysql_error());    
mysql_select_db($db_name) OR die(mysql_error());            
$sql = "select ort from plz where plz=$_GET['plz']"; 
$result= mysql_query($sql) OR die(mysql_error()); 

        while($row = mysql_fetch_array($result)) 
            { 
            echo "\n\tparent.add_option('".$row['ort']."');"; 
            } 
        } 
	   
        //Existiert die gesuchte PLZ? 
        //Ich hab statt einer DB alles in einem assoziativen Array($locations) abgelegt, 
        //und prüfe, ob ein Element mit dem Schlüssel PLZexistiert 
        if(isset($locations[$_GET['plz']])) 
            { 
            $location=$locations[$_GET['plz']]; 


            } 

        //Ich splitte $location und sortiere ihn ein wenig ...falls die Postleitzahl gefunden wurde, 
        //könnte sie zu mehreren Ortsteilen gehören...welche ich 
        //jeweils kommasepariert in den Arrayelementen habe 
        $location=explode(',',$location); 
        array_unique($location); 
        sort($location,SORT_STRING); 

        //Für jede Option, welche ich in die Liste einfügen will, folgende JS-Anweisung erzeugen 
        foreach($location as $key=>$value) 
            { 
            echo "\n\tparent.add_option('".$value."');"; 
            } 
        }
       ?> 



    }
}
if(self==top)
    {
    document.location='index.htm';
    }
else
    {
    get_location();
    }
//-->
</script>
 

Neue Beiträge

Zurück