Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [PHP] Dynamisches Füllen einer SELECT-Liste
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 05.12.2004, 04:41 Nach oben    #1
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard [PHP] Dynamisches Füllen einer SELECT-Liste

Dynamisches Füllen einer SELECT-Liste


Vorwort

Dieses Tutorial beschreibt in vielen kleinen und hoffentlich auch einfach zu verstehenden Schritten, wie man es schafft eine SELECT-Liste dynamisch mit Inhalt zu füllen. Dabei ist es egal, wie die Daten gespeichert werden. In unserem Beispiel wählen wir als Speicherform eine MySQL-Datenbank aus, weil dieses Szenario wohl am häufigsten vorkommt. Prinzipiell könnten die Daten aber auch in einer XML- oder Textdatei gespeichert sein.

Es wird eine Funktion geschrieben, die es uns ermöglicht zum Einen die Daten in der Liste unterzubringen, zum Anderen aber auch noch einen Eintrag vorzuselektieren.

Dieses Tutorial soll Euch nicht nur eine Lösung für ein Problem von Euch geben, sondern es soll Euch auch dazu animieren selbst einmal darüber nachzudenken, was in dieser Funktion passiert, wie sie arbeitet.
Es sollte gesagt sein, dass man für das volle Verständnis dieses Tutorials sicherlich kein (My)SQL-Experte sein muss, allerdings ist es nicht hinderlich, wenn man schon mal mit PHP auf eine MySQL-Datenbank zugegriffen hat, da darauf in diesem Tutorial nicht eingegangen wird.


Nun aber genug des Vorworts, auf geht es.


Inhaltsübersicht
  1. Füllen der Datenbank mit Testdaten
  2. Planen der eigentlichen Funktion
  3. Implementierung der Funktion build_selectlist
  4. Test der Funktion
  5. Nachwort

Geändert von Jann Hendrik (26.05.2007 um 10:11 Uhr)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2006, 17:49 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

1. Schritt - Füllen der Datenbank mit Testdaten

Wir brauchen natürlich einige Testdatensätze in einer MySQL-Datenbank, damit wir dieses Tutorial durcharbeiten können. Wir müssen schließlich etwas zum Auslesen haben.
Wir legen uns also eine Beispieltabelle an.
Hier ist der von PHPMyAdmin generierte SQL-Code.
SQL Code:
  1. CREATE TABLE `selectDemo` (
  2. `id` INT( 3 ) NOT NULL AUTO_INCREMENT ,
  3. `name` VARCHAR( 30 ) NOT NULL ,
  4. PRIMARY KEY ( `id` )
  5. );
  6.  
  7.  
  8. INSERT INTO `selectDemo` (`name`) VALUES ('Ben');
  9. INSERT INTO `selectDemo` (`name`) VALUES ('Jann Hendrik');
  10. INSERT INTO `selectDemo` (`name`) VALUES ('Denise');
  11. INSERT INTO `selectDemo` (`name`) VALUES ('Maria');
  12. INSERT INTO `selectDemo` (`name`) VALUES ('Peter');

Diesen könnt Ihr jetzt per PHPMyAdmin ausführen oder PHP arbeiten lassen.
Das könnte dann z.B. so aussehen.
PHP-Code:
<?php

     
/*
      * An dieser Stelle muss schon eine Verbindung zu einer MySQL-Datenbank bestehen.
      */

    // Erstellen einer Beispieltabelle namens selectdemo
    
$sql 'CREATE TABLE `selectdemo` 
            ( 
              `id` INT( 3 ) NOT NULL  AUTO_INCREMENT ,
              `name` VARCHAR( 30 ) NOT NULL ,
              PRIMARY KEY ( `id` ) 
            );'
;

    
mysql_query($sql) or exit('<p>Fehler beim Erstellen der Testtabelle.</p>' mysql_error());

    
// Einfügen der Testdatensätze in die zuvor erstellte Tabelle
    
$sql "INSERT INTO `selectdemo` (`name`) VALUES ('Ben');
            INSERT INTO `selectdemo` (`name`) VALUES ('Jann Hendrik');
            INSERT INTO `selectdemo` (`name`) VALUES ('Denise');
            INSERT INTO `selectdemo` (`name`) VALUES ('Maria');
            INSERT INTO `selectdemo` (`name`) VALUES ('Peter');"
;

   
mysql_query($sql) or exit('<p>Fehler beim Einfügen der Testdatensätze.</p>' mysql_error() );

?>

Wenn Ihr nun mittels PHPMyAdmin oder einer anderen Verwaltungsanwendung in die verwendete Datenbank schaut sollte dort eine Tabelle selectdemo mit fünf Datensätzen enthalten sein. Ist dies der Fall, so könnt Ihr zu Schritt zwei springen.
Sollten Probleme aufgetaucht sein, so versucht diese einzugrenzen und bewusst zu reproduzieren.

Wir haben eine Linkliste mit vielen Verweisen zu guten Anlaufstellen zum Erlernen von SQL zusammengestellt.
Interessantes Material für die Arbeit mit Datenbanken

Solltet Ihr z.B. Verständnisschwierigkeiten bzgl. des SQL-Codes haben, so empfehlen wir Euch dringends Euch mit einem SQL-Tutorial auseinanderzusetzen. Es ist einfacher, als man zu Beginn denkt.

Geändert von Ben (07.03.2007 um 09:10 Uhr)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2006, 17:50 Nach oben    #3
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

2. Schritt - Planen der eigentlichen Funktion

Da wir nun auf eine Datenbasis zurückgreifen können, können wir uns nun der eigentlichen Arbeit zuwenden. Wir erstellen also eine Funktion, die aus Daten, die in einem Array vorliegen eine SELECT-Liste füllt.
Warum die Daten in einem Array vorliegen werden wir etwas später sehen.

Bevor wir anfangen diese Funktion zu schreiben sollten wir uns erst einmal überlegen, was diese Funktion im Endeffekt alles können sollte und welche Informationen dafür benötigt werden.
  • Die Funktion benötigt die Daten, die angezeigt werden sollen.
  • Die Funktion braucht Informationen zur Konfiguration der SELECT-Liste.
    Name, ID, welcher Datensatz soll vorselektiert sein, ..
  • Die Funktion gibt optional den erstellten HTML-Code zurück oder gibt ihn direkt aus.

Da die Anzahl der Konfigurationsangaben für die SELECT-Liste variieren kann ist es clever hier auf ein assoziatives Array zurückzugreifen.

Die optionale Ausgabe innerhalb der Funktion ist natürlich kein Muss, allerdings ist es in manchen Fällen sinnvoll nicht direkt HTML-Code auszugeben, sondern diesen bis zu einem späteren Zeitpunkt zwischenzuspeichern.
In anderen Fällen ist dies wiederum nicht nötig.
Wir legen fest, dass standardmäßig der erstellte HTML-Code zurückgegeben werden soll.

Wir können mit den bisherigen Informationen, die wir zusammengetragen haben also nun die Signatur der Funktion definieren
PHP-Code:
build_selectlist($data$config$display false
Wer nicht weiß, was dieses = false da macht, dem sei diese Erklärtung hier empfohlen:
Vorgabewerte für Parameter


Machen wir uns nochmal grob klar, wie eine SELECT-Liste in konkretem HTML-Code aussieht.
HTML-Code:
<select name="nameDerListe" size="anzahlDerAngezeigtenElemente"> 
  <option selected value="wert">Beschriftung</option>
  [..]
</select> 
Diese Struktur muss also am Ende von der Funktion generiert worden sein.
Nachdem wir uns nun klargemacht haben, was wir im Endeffekt erhalten wollen und was wir dazu brauchen, können wir nun zu Schritt 3 weitergehen, der Implementierung der Funktion.

Geändert von Ben (07.03.2007 um 09:12 Uhr)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2006, 17:50 Nach oben    #4
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

3. Schritt - Implementierung der Funktion build_selectlist

Der Titel dieses Kapitels trifft nicht 100%ig zu, da wir nicht nur die Funktion implementieren, sondern uns auch noch damit beschäftigen die benötigten Daten zu beschaffen. Das heißt, die Konfigurationseinstellungen für die Liste und die anzuzeigenden Datensätze.

Das ist auch unser erster Schritt.

Je nach der Tabellenstruktur, die Ihr in Eurer Produktivumgebung verwendet, müsst Ihr hier natürlich die SQL-Abfrage anpassen.

Mit diesem Code erstellen wir ein Array $data, welches dann die anzuzeigenden Datensätze enthält.
PHP-Code:
<?php

   
/*
    * Zu diesem Zeitpunkt muss eine Verbindung mit einer MySQL-Datenbank
    * bestehen.
    */
   
   // Auslesen der Daten
   
$sql 'SELECT
             id,
             name
           FROM
             selectdemo'
;      
   
   
$res mysql_query($sql) or exit('<p>Fehler beim Auslesen der Daten.</p>' mysql_error());

   
// Initialisierung des Datenarrays
   
$data = array();

   
// Füllen des Datenarrays
   
while($data[] = mysql_fetch_assoc($res));
   
array_pop($data);

?>
Das einzige, auf dass in dieser Codepassage näher eingehen möchte ist das Füllen des Datenarrays.

Mit $data[] wird, wie hier beschrieben, ein neuer Datensatz an das Ende des Arrays angehängt.

Lässt man das array_pop($data) nun weg erhält man bei einer Testausgabe mit
PHP-Code:
echo '<pre>';
var_dump($data);
echo 
'</pre>'
folgende Ausgabe
Code:
array(6) {
  [0]=>
  array(4) {
    [0]=>
    string(1) "1"
    ["id"]=>
    string(1) "1"
    [1]=>
    string(3) "Ben"
    ["name"]=>
    string(3) "Ben"
  }
  // ...
  [4]=>
  array(4) {
    [0]=>
    string(1) "5"
    ["id"]=>
    string(1) "5"
    [1]=>
    string(5) "Peter"
    ["name"]=>
    string(5) "Peter"
  }
  [5]=>
  bool(false)
}
Wie man sieht ist dort ein Element zu viel in das Array eingefügt worden. Dies geschieht, weil mysql_fetch_assoc() false zurückgibt, wenn kein Datensatz mehr vorhanden ist.
Aus diesem Grunde behandeln wir es mit array_pop().
Zitat:
array_pop() liefert den letzten Wert von array, und verkürzt array um ein Element.
Somit haben wir den ersten Teilschritt des Kapitels hinter uns.


Nun erstellen wir uns ein assoziatives Array, welches für die Konfiguration der SELECT-Liste zuständig sein wird.
In diesem Beispiel weisen wir der Liste einen Namen zu, geben an, wie viele Datensätze angezeigt werden sollen und definieren den vorselektierten Wert.

Ich emfehle einen Blick auf die möglichen Attribute, die bei einer SELECT-Liste verwendet werden können.
http://de.selfhtml.org/html/referenz...r SELECT-Liste
PHP-Code:
$config = array();

$config['name']  = 'demoliste';
$config['size']    = 1;
$config['preselected'] = 'Ben'
Somit haben wir alle Daten, die wir benötigen, um die Funktion zu implementieren.


Die eigentliche Funktion

Mit dem, was wir nun alles wissen, können wir folgende Funktion schreiben.
PHP-Code:
    function build_selectlist($data$config$display false) {
        
// Liste erstellen
        
$selectHTML '<select name="' $config['name'] . '" size="' $config['size'] . '">';
        
$selectHTML .= "\n";
        
        
// Daten in die Liste einfügen
        
foreach($data as $key) {
            
$selectHTML .= '<option value="' $key['id'] . '">' $key['name'] . '</option>';
            
$selectHTML .= "\n";
        }
        
        
// Liste beenden
        
$selectHTML .= '</select>';
        
        return 
$selectHTML;      
    } 
Die Variable $selectHTML wird jetzt also nach und nach mit dem generiertem HTML-Code gefüllt. Die Zeile
Code:
$selectHTML .= "\n";
fügt einen Zeilenumbruch ein, der nur der Übersichtlichkeit der Quelltextanzeige im Browser dient.
Man beachte, dass an dieser Stelle Anführungszeichen verwendet werden müssen. Hochkommata haben in Zusammenhang mit \n eine andere Wirkungsweise.


Die Funktion erstellt uns nun schon eine Liste mit den Daten aus der Datenbank. Wir müssen jetzt nur noch eine Abfrage einbauen, um den vorselektierten Wert zu markieren.
Diese Abfrage muss in die foreach-Schleife, da ja jeder Datensatz überprüft werden muss.
PHP-Code:
$preselected = ($config['preselected'] == $key['name']) 
           ? 
'selected '
           
''
Diese Abfrage ist im Prinzip sehr einfach. Ein vordefinierter Wert wird ja nur durch den Zusatz selected="selected" im option-Element gekennzeichnet.
Bitte beachtet, dass Ihr selected="selected" verwenden müsst, wenn Ihr XHTML-konform arbeiten möchtet.

Stimmen also der Name des aktuell geprüften Datensatzes und der im Konfigurationsarray definierte Name überein, so wird dieser Zusatz hinzugefügt. Ansonsten passiert nichts.
Ich nutze für diese Abfrage den ternären Operator.

Bauen wir diese Abfrage also in unsere Funktion ein erhalten wir folgendes Ergebnis.
PHP-Code:
    function build_selectlist($data$config$display false) {
        
// Liste erstellen
        
$selectHTML '<select name="' $config['name'] . '" size="' $config['size'] . '">';
        
$selectHTML .= "\n";
        
        
// Daten in die Liste einfügen
        
foreach($data as $key) {
            
            
$preselected = ($config['preselected'] == $key['name']) 
                           ? 
'selected '
                           
'';
            
            
$selectHTML .= '<option value="' $key['id'] . '" ' $preselected '>' $key['name'] . '</option>';
            
$selectHTML .= "\n";
        }
        
        
// Liste beenden
        
$selectHTML .= '</select>';
        
        return 
$selectHTML;      
    } 
Dies ist die Funktion, die es uns ermöglicht Datensätze aus einem Array in eine SELECT-Liste einzufügen.
Und jetzt merken wir auch, dass es egal ist, woher die Daten ursprünglich stammen. Es spielt keine Rolle, ob sie in einer Datenbank, Textdatei oder im XML-Format abgespeichert sind, solange man sie so ausliest, dass man beim Aufruf der Funktion ein Datenarray zur Verfügung hat.

Die Implementierung ist hiermit abgeschlossen und wir können unsere Arbeit austesten.
Wir springen also ins nächste Kapitel.

Geändert von Ben (07.03.2007 um 09:15 Uhr)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2006, 17:50 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

4. Schritt - Test der Funktion

Nachdem wir uns nun eine Funktion programmiert haben, die es uns ermöglich eine SELECT-Liste dynamisch mit Inhalt zu füllen und sogar einige Konfigurationen an ihr vorzunehmen sollten wir unsere Arbeit austesten, um zu sehen, ob wir wirklich das gewünschte Ergebnis erhalten.

An alle selbsternannten Profis:
Natürlich sollte man nicht erst nach Abschluss der Implementierung mit dem Testen anfangen. Aber an dieser Stelle passt das doch ganz gut ins Tutorial, oder?


Wir erstellen uns also eine Datei, die z.B. so aussehen könnte
PHP-Code:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>Dynamisches Füllen einer SELECT-Liste</title>
  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
 </head>
 <body>
 
 <h1>Dynamisches Füllen einer SELECT-Liste</h1>
  
<?php

    
/*
     * Anstelle dieser Zeile kann man auch einfach die Verbindung zur Datenbank 
     * herstellen.
     */
    
require_once('dbconnect.inc.php');

   
    
// Auslesen der Daten
    
$sql 'SELECT
              id,
              name
            FROM
              selectdemo'
;      
   
    
$res mysql_query($sql) or exit('<p>Fehler beim Auslesen der Daten.</p>' mysql_error());

    
// Initialisierung des Datenarrays
    
$data = array();
 
    
// Füllen des Datenarrays
    
while($data[] = mysql_fetch_assoc($res));
    
array_pop($data);

    
    
$config = array();
    
$config['name']        = 'demolist';
    
$config['size']        = 1;
    
$config['preselected'] = 'Denise';
    

    function 
build_selectlist($data$config$display false) {
        
// Liste erstellen
        
$selectHTML '<select name="' $config['name'] . '" size="' $config['size'] . '">';
        
$selectHTML .= "\n";
        
        
// Daten in die Liste einfügen
        
foreach($data as $key) {
            
            
$preselected = ($config['preselected'] == $key['name']) 
                           ? 
'selected '
                           
'';
            
            
$selectHTML .= '<option value="' $key['id'] . '" ' $preselected '>' $key['name'] . '</option>';
            
$selectHTML .= "\n";
        }
        
        
// Liste beenden
        
$selectHTML .= '</select>';
        
        return 
$selectHTML;      
    }
    
    
    echo 
build_selectlist($data$config);
    
?>

  </body>
</html>
Wir rufen die Datei also im Browser auf und freuen uns. *freu*
Es klappt so, wie wir das wollen.


Somit haben wir das erreicht, was wir wollten und können uns zufrieden dem nächsten Tutorial auf Developers-Guide.net zuwenden.

Geändert von Ben (09.02.2007 um 21:14 Uhr)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.03.2006, 17:51 Nach oben    #6
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.512
Standard

Nachwort

Nachdem Ihr nun dieses Tutorial durchgearbeitet habt, hoffe ich, dass es Euch insofern weitergeholfen hat, dass Ihr wisst,
  • .. wie man an ein solches Problem herangehen kann,
  • .. wie man eine Idee umsetzt
und natürlich
  • .. wie man Datensätze dazu verwendet, um eine SELECT-Liste dynamisch zu füllen .

Ich habe versucht so wenig Vorkenntnisse wie möglich vorauszusetzen und die benötigten Schritte bei der Implementierung bestmöglich zu erläutern.

Sollte es dennoch zu Fragen kommen, so könnt Ihr diese selbstverständlich in unserem PHP-Forum stellen, sofern Ihr ein registriertes Mitglied unseres Hilfeforums seid. Ist dies nicht der Fall, so könnt Ihr Euch hier, natürlich völlig kostenfrei, registrieren.

Solltet Ihr über die Suche keine Lösung für eventuell auftretende Probleme finden und einen Thread erstellen, so bitten wir Euch folgende Passage per Copy & Paste zu kopieren und im erstellten Thema in quote-Tags einzufügen.

Zitat:
Diese Frage bezieht sich auf das Tutorial Dynamisches Füllen einer SELECT-Liste
Bevor Ihr das tut möchte ich Euch diesen Thread hier ans Herz legen.
Dort werden zu Beginn vom Mitglied flupsi einige sehr gute Fragen gestellt. Vielleicht könnt Ihr dort noch etwas mitnehmen.
http://www.developers-guide.net/forums/showthread.php?t=3132

Solltet Ihr Verbesserungsvorschläge haben oder einen Fehler finden, so freue ich mich selbstverständlich über eine private Nachricht.

Bitte beachtet, dass es keine Problemhilfe per ICQ, PN, Mail etc. gibt. Genau für diese Fragen gibt es unser Hilfeforum.

Ich danke Euch für Euer Interesse an diesem Tutorial und würde mich freuen, wenn Ihr es weiterempfehlen würdet.
Bitte lest dazu: Weiterverwendung der Tutorials

In diesem Sinne, viel Spaß beim Programmieren.
Grüße Ben.

Geändert von Ben (07.03.2007 um 09:18 Uhr)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Frage zu dynamisches Füllen einer select Liste. Scout PHP-Programmierung 10 30.03.2007 09:49
Your most abnormal Query Guradia Datenbanken 21 19.04.2006 00:15
[PHP] Wie kann ich eine Textdatei erstellen und mit Inhalt füllen? Ben Tutorials 2 06.09.2005 11:17


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45