Ankündigung

Einklappen
Keine Ankündigung bisher.

Werte aus SQL-Abfrage in HTML-Tabelle bringen

Einklappen

Neue Werbung 2019

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

  • Werte aus SQL-Abfrage in HTML-Tabelle bringen

    Hallo,

    ich komme mal wieder nicht weiter:
    Ich habe folgende MySQL-Abfrage, die mir alle Familienmitglieder, die zu einer Familien gehören aus einer Tabelle liest
    Code:
    $daten_members = mysql_fetch_array( mysql_query("SELECT * FROM `$table_family_members` where id='$id'") );
    Ausgehend von dieser Abfrage will ich nun eine Tabelle füllen, die wie folgt aussieht:

    Vorname Geburtsdatum
    Mann
    Frau
    Kind
    Kind
    Kind

    Ich habe gerade überhaupt keinen Ansatz, wie ich das reinbringen könnte
    Die Spalten (Vorname, Gebdatum) sollen Inputfelder sein, die jeweils einen eigenen Namen haben, z.B: Vorname_Mann, Gebdatum_Mann, Vorname_Frau, Gebdatum, Frau, etc.

    Bin für jeden Vorschlag offen.

    Danke und Gruß,
    Marcel

  • #2
    Hallo maeck,

    an sich musst du lediglich die Datensätze aus der DB holen (mysql_fetch_assoc()) und die Daten in die Strukur einer Tabelle ausgeben. Das geht beispielsweise so:

    PHP-Code:
    $select ''SELECT FROM '.$table_family_members.' where id=\''.$id.'\';';
    $result mysql_query($select);

    echo 
    '<table>';

    while(
    $data mysql_fetch_assoc($result)){

       echo 
    '<tr>';

       echo 
    '<td>'.$data['Vorname'].', $data['GeburtsDatum'].'</td>';
       echo '
    <td>'.$data['Frau'].'</td>';
       echo '
    <td>'.$data['Mann'].'</td>';

       echo '
    </tr>';

    }

    echo '
    </table>'; 
    Das ist jedoch nur ein rudimentäres Beispiel, das dich zum Denken anregen soll. Ob du nun den Text blanko oder in einem Input-Feld ausgibst ist dabei zweitrangig. Hättest auch selbst drauf kommen können, denn ich glaube zu diesem Thema wurde hier im Forum schon n mal diskutiert.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Hallo dr.e.,
      danke für die Antwort.
      Ist es egal ob ich es so mache wie du, oder so wie ich schon gepostet hatte?
      PHP-Code:
      $daten_members mysql_fetch_arraymysql_query("SELECT * FROM `$table_family_members` where id='$id'") ); 

      und dann einfach nur

      while($daten_members){ 

      ?

      Gruß Marcel

      Kommentar


      • #4
        Hallo maeck,

        ich mag deine verschachtelte Schreibweise mit mysql_fetch_array(mysql_query()) nicht da das schwer zu lesen ist. Theoretisch sollte es aber auch so gehen. Die Listendarstellung musst du dann eben nach gusto anpassen.
        Viele Grüße,
        Dr.E.

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Think about software design [B]before[/B] you start to write code!
        2. Discuss and review it together with [B]experts[/B]!
        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
        4. Write [I][B]clean and reusable[/B][/I] software only!
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Kommentar


        • #5
          Okay, danke für deine Hilfe.
          Werde mich dran versuchen und mich ansonsten nochmal melden.

          Schönen Tag,
          Marcel

          Kommentar


          • #6
            Nein das geht so nicht, denn mysql_query() liefert dir eine Resource. Mittels mysql_fetch_*() holst du genau einen Datensatz dieser Resource ab. Danach wird der interne Zeiger der Resource um eins erhöht. Um die restlichen Datensätze auch noch abzuholen, musst du die Resource erneut mit einer mysql_fetch_*() Funktion aufrufen. Solange bis irgendwann alle Datensätze abgerufen sind und FALSE zurückgegeben wird.

            Wenn du mysql_query() aber direkt in mysql_fetch_*(<-- hier -->) aufrufst, wird die Resource nicht gespeichert und geht verloren. Somit hast du nur einen Datensatz abgeholt, der Rest verliert sich im Nirvana.

            Das heißt, wenn du mehrere Datensätze zu erwarten hast, musst du den Rückgabewert von mysql_query() speichern und in einer Schleife an mysql_fetch_*() übergeben. Mögliche Rückgabewerte von mysql_fetch_assoc() sind FALSE oder ein Array.

            Verwende also am Besten folgendes Konstrukt:
            PHP-Code:
            <?php
            $sql 
            "SELECT * FROM tabelle";
            $res mysql_query($sql) or die(mysql_error());
            while (
            $line mysql_fetch_assoc($res)) {
              
            // $line ist ein Array, dessen Schlüssel die Spaltennamen der Tabelle und dessen Werte der Inhalt ist
            }
            ?>
            http://de.php.net/mysql_query
            http://de.php.net/mysql_fetch_array
            http://de.php.net/mysql_fetch_assoc
            http://de.php.net/mysql_fetch_object

            Kommentar


            • #7
              Mein Problem weitet sich ein wenig aus:
              Zu Anfang dachte ich, es reicht wenn ich die Mitglieder der angemeldeten Familie auslese und ausgebe. Dies reicht nicht, denn was ich mache ist ein AdminTool für die Anmeldungen und da muss es auch möglich sein, dass man weitere Personen zu der Familie hinzufügt.

              Also z.B. eine Familie hat sich mit 1 Ehepartner und 2 Kindern angemeldet, dann hätte ich drei Zeilen mit diesen drei Personen drin.
              Eigentlich müsste ich aber die Möglichkeit haben, im Admintool noch den 2.Ehepartner und ein zusätzliches Kind nachzutragen.

              Bei der Anmeldung ist es schon nicht perfekt, denn da gebe ich fix 2 Erwachsene und 6 Kinder vor (in der Hoffnung, dass keine Familie mit mehr als 6 Kindern kommt). Würde das gerne irgendwann mal dynamisch machen, aber das kann ich noch nicht.

              Deshalb bräuchte ich im Admintool jetzt auch so eine Tabelle mit Zeilen für 2 Ehepartner und 6 Kinder. Nach dem Beispiel oben, würde dann nur die Zeile des einen Ehepartners und der 2 Kinder ausgefüllt sein, aber ich könnte noch den zweiten Ehepartner nachtragen.

              Sorry, dass es so kompliziert ist, aber ich weiß echt nicht wie ich es machen soll

              Muss ich dann jetzt in der while-Schleife alle Inhalte aus der DB auslesen und in Variablen schreiben (z.B. mit einer extra for-Schleife, durch die ich die Variablen mit nem Counter hochzähle) und die Variablen dann in die Tabelle schreiben?

              Danke für eure Hilfe, langsam wirds mir zu komplex.

              Gruß Marcel

              Kommentar


              • #8
                Hallo,
                verstehe jetzt den Zusammenhang zum Anfangsposting nicht, aber das ist Datenbank-technisch kein Problem. Eine dynamische Anzahl 0..n (bei 0..1 kannst du ein Feld füllen oder leer lassen) setzt du in einer relationalen Datenbank immer durch eine dynamische Anzahl an Datensätzen um, also nicht etwa über Spalten. Wenn du allerdings noch nicht einmal mehrzeilige SELECTs ausgegeben bekommst, wird es sehr kritisch.
                Lies dir mal den Artikel in Wikipedia durch:
                http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)
                (Link kaputt, kopiers bitte manuell)
                Zumindest bis zur dritten Normalform.

                Auch dieser Artikel könnte interessant sein:
                http://de.wikipedia.org/wiki/SQL
                Speziell JOINS im Zusammenspiel bei normalisierten Datenbanken.

                Bitte lies dir zumindest Normalisierung durch, sonst macht eine weitere Diskussion keinen Sinn, denn für dich die Arbeit erledigen kann keiner.

                Eine Tabellenstruktur bei dynamischer Anzahl Ehepartner (0..1) und Kindern (0..n) könnte dann so aussehen:
                Code:
                family
                id
                
                persons
                id | family| gender | is_parent / is_child | lastname | firstname
                family hat keine Eigenschaft, außer ihre Familienmitglieder. Du kannst höchstens das Familien-Passwort oder den "Nicknamen" festlegen.
                Die Personen haben ihren Nach- und Vornamen, Geschlecht und Flag ob sie Kind oder Elternteil sind. Natürlich könntest du hier auch den Nachnamen auslagern oder vom Vater/Mutter ableiten, aber was wenn Mutti Meyer, Vati Müller und das Kind Meyer-Müller heißen soll? Du solltest beim Datenbankdesign immer den Worst-Case im Blick haben.

                Du kannst jetzt soviele Kinder (und als Nachteil, auch soviele Elternteile) hinzufügen wie du möchtest, bzw. deine Applikation zuläßt.

                Kommentar


                • #9
                  Hallo Zergling,

                  okay, ich versuche es nochmal anders. Bitte ein bisschen Geduld.
                  Das Problem liegt nicht darin, dass ich keine SELECTs erstellen kann, oder nicht weiß, dass man ein assoziatives Array durch eine While-Schleife ausliest (auch wenn das in diesem Post so scheint ).
                  Meine Datenbank ist bereits normalisiert (hoffe ich) und sieht folgendermaßen aus:

                  Tabelle family
                  id | regdate | lastname | street | zipcode | land | city | phone | fax | email

                  Tabelle family_members
                  id | famid (fremdschlüssel zu family.id) | surname | sex | birthday

                  Jetzt folgt die Beschreibung meines Problems :
                  Ich habe ein Anmeldeformular, wo sich eine Familie mit allen Mitgliedern anmelden kann (eben max. 6 Kinder, weil ich es noch nicht geschafft habe, über JS dynamisch weitere Eingabefelder hinzuzufügen).

                  Zu dieser Anmeldung habe ich ein AdminTool geschrieben, wo man sich alle Familien inkl. der Mitglieder auflisten lassen kann. Hier soll man nun die Möglichkeit haben, die Familien nochmals zu bearbeiten. D.h. noch ein weiteres Kind hinzufügen, oder vielleicht einen Ehepartner löschen.

                  Dazu wollte ich eine Tabelle mit Input-Felder erstellen und die Values direkt aus der Datenbank füllen. Dann könnte ich etwas verändern und danach wieder alles in die DB zurückschreiben.

                  Erster Ansatz war, dass ich einfach alles aus der DB auslese und dies anzeige. Dann hätte ich aber nicht die Möglichkeit, ein weiteres Kind hinzuzufügen oder dergleichen.

                  Deswegen dachte ich mir jetzt, dass ich ein Formular erstellen muss, was ungefähr so aussieht: http://www.forum-altoetting.de/beispiel.html

                  Um das füllen zu können, muss ich aber die Werte aus der DB über eine Whileschleife auslesen und in Variablen speichern. Diese Variablen kann ich dann in die Valuetags schreiben, damit die Werte angezeigt und verändert werden können.

                  Dazu dachte ich, dass ich eine While-Schleife erstelle, und darin eine for-schleife, die einen counter hochzählt und damit die variablen füllt; also vorname1, vorname2, ... .

                  Und jetzt die Frage:
                  Geht das auch einfach??

                  Danke für deine / eure Geduld,
                  schöne Grüße, Marcel

                  Kommentar


                  • #10
                    Dazu dachte ich, dass ich eine While-Schleife erstelle, und darin eine for-schleife, die einen counter hochzählt und damit die variablen füllt; also vorname1, vorname2, ... .

                    Und jetzt die Frage:
                    Geht das auch einfach?? :Wink:
                    Hmm, dir fehlt es an Grundlagen, oder einfach am Mut das beschriebene auch auszuprobieren. Wie ich bereits gesagt habe (gaaanz weit oben) macht es keinen unterschied, ob du Daten ausliest und als plain/text darstellst oder in ein Input-Feld. das sieht dann ganz einfach so aus (Kategorie Q&D):

                    PHP-Code:
                    <form action="" method="">
                    <?php
                    $sql 
                    "SELECT * FROM tabelle";
                    $res mysql_query($sql) or die(mysql_error());
                    while (
                    $line mysql_fetch_assoc($res)) {

                       echo 
                    'Vorname: <input type="text" name="surname" value="'.$line['surname'].'" />';
                       echo 
                    '
                    '
                    ;
                       echo 
                    'Name: <input type="text" name="name" value="'.$line['name'].'" />';

                     
                    // end while
                    }
                    ?>
                    </form>
                    Fertig. Nun kannst du das erweitern.
                    Viele Grüße,
                    Dr.E.

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    1. Think about software design [B]before[/B] you start to write code!
                    2. Discuss and review it together with [B]experts[/B]!
                    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                    4. Write [I][B]clean and reusable[/B][/I] software only!
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    Kommentar


                    • #11
                      Argh
                      Ja das weiß ich doch, aber das ist nicht mein Problem

                      Wenn ich es so mache, wie du beschreibst, dann habe ich doch so viele Zeilen, wie ich Einträge in der DB habe. Also 4 Familienmitglieder in der DB ergibt dann nach der Whileschleife, vier Zeilen.

                      Ich muss aber 8 Zeilen (2Ehepartner, 6 Kinder) haben, die nur zum Teil aus der DB gefüllt sind:

                      Mann gefüllt aus DB
                      Frau
                      K1 gefüllt aus DB
                      K2 gefüllt aus DB
                      K3
                      K4
                      K5
                      K6

                      Die, die nicht gefüllt sind, kann ich jedoch noch füllen, weil ja alle über ein INPUT-Feld verfügen.

                      Versteht mich denn keiner

                      Kommentar


                      • #12
                        dr.e. hat einen kleinen aber feinen Fehler gemacht, und zwar musst du an die <input name> Attribut-Werte eckige Klammern hängen, damit werden die übergebenen Werte für PHP zu einem Array.

                        Beispiel:
                        Code:
                        <input type="lastname[]" value="Müller" />
                        <input type="lastname[]" value="Meyer" />
                        abgeschickt per submit kommt bei PHP folgendes raus:
                        PHP-Code:
                        <?php
                        // $_POST = array('lastname' => array(0 => 'Müller', 1 => 'Meyer'));
                        ?>
                        So kannst du per JavaScript ganz einfach einen Button verlinken, der zB folgendes Skript ausführt:
                        Code:
                        function addChild() // child diesmal im wahren Sinne
                        {
                          var input = document.createElement("INPUT");
                          input.type = "text";
                          input.name = "lastname[]";
                        
                          var form = document.forms["MEINFORMULAR"];
                          form.appendChild(input);
                        }
                        Ist der Code nicht selbsterklärend? Erstelle dynamisch einen <input> Tag mit, den Attributen type="text" und name="lastname[]" und häng es direkt vorne ins Formular. Du kannst die Funktion 10x ausführen und ohne Neuladen wird 10x ein neues Eingabefeld ins Formular gehängt. Der Benutzer kann also selbst entscheiden, wieviele Kinder er eintragen möchte. Da du für den Array keinen expliziten Schlüssel festlegst (zwischen [] könnte ja zB ein Index stehen - assoziativ oder numerisch - wenn keiner drinsteht, wird eine fortlaufende Zahl verwendet), wird in PHP eben ein durchnummerierter Index verwendet, das heißt es kommt ein PHP-Array für $_POST['lastname'] an, der alle 10 hinzugefügten Werte enthält. Easy oder?

                        Ums zu verdeutlichen:
                        PHP-Code:
                        <html>
                        <head>
                          <script type="text/javascript">
                          function addChild() // child diesmal im wahren Sinne
                          {
                            var input = document.createElement("INPUT");
                            input.type = "text";
                            input.name = "lastname[]";

                            var form = document.forms["meinformular"];
                            form.appendChild(input);
                          }
                          </script>
                        </head>
                        <body>

                        <? if (array_key_exists('lastname', $_POST)) { ?>
                        <ul>[*]<?=implode("[*]"$_POST['lastname'])?>[/list]
                        <? } ?>

                        <form name="meinformular" method="post">
                        <button onclick="addChild();return false">neues Kind</button>
                        <input type="submit" />
                        </form>

                        </body>
                        </html>

                        Kommentar


                        • #13
                          Schau Dir doch mal phpMyAdmin an, wie es dort z.B. zum Anlegen eines neuen Tabellenfelds umgesetzt ist. Oder Du nutzt das verlinkte Formular und generierst per Javascript und/oder php nach Wiederaufruf automatisch ein neues Eingabefeld mit einem dynamisch vom Vorgängerfeld abhängigen name-Attribut
                          EDIT: Ups, sorry, 2. Seite des Threads übersehen...
                          [COLOR="#F5F5FF"]--[/COLOR]
                          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                          [COLOR="#F5F5FF"]
                          --[/COLOR]

                          Kommentar


                          • #14
                            Danke Zergling!
                            Zitat von Zergling
                            Erstelle dynamisch einen <input> Tag mit, den Attributen type="text" und name="lastname[]" und häng es direkt vorne ins Formular. Du kannst die Funktion 10x ausführen und ohne Neuladen wird 10x ein neues Eingabefeld ins Formular gehängt. Der Benutzer kann also selbst entscheiden, wieviele Kinder er eintragen möchte. Da du für den Array keinen expliziten Schlüssel festlegst (zwischen [] könnte ja zB ein Index stehen - assoziativ oder numerisch - wenn keiner drinsteht, wird eine fortlaufende Zahl verwendet), wird in PHP eben ein durchnummerierter Index verwendet, das heißt es kommt ein PHP-Array für $_POST['lastname'] an, der alle 10 hinzugefügten Werte enthält. Easy oder?
                            Aber wenn ich die INPUT-Felder dynamisch erstelle, dann kann ich darauf nicht über JS zugreifen, um z.B. Berechnungen anzustellen, oder?

                            Z.B.: Ich habe nicht nur ein Inputfeld sondern auch SELECT-Felder, in dem für die Person ausgewählt werden kann, welches Essen derjenige möchte. Also ob Frühstück, und/oder Mittag-/Abendessen.
                            Wenn dort ein Essen ausgewählt wird, soll eine Funktion aufgerufen werden, die bei jedem Mitglied der Familie schaut, was an Essen ausgewählt wurde, den Gesamtpreis berechnet und dies in einem Feld anzeigt.
                            Wenn ich die Felder aber nicht mit Namen auseinander halten kann, weil sie alle "name="Essen[]" heissen, dann kann ich sie auch nicht ansprechen, oder?

                            Ich merke, dass ich mit dieser Geschichte wirklich an meine Grenzen stoße und bin dankbar von euch zu lernen.

                            Schöne Grüße,
                            Marcel

                            Kommentar


                            • #15
                              Zitat von maeck
                              Aber wenn ich die INPUT-Felder dynamisch erstelle, dann kann ich darauf nicht über JS zugreifen, um z.B. Berechnungen anzustellen, oder?
                              Doch das geht. Über den DOM Baum kannst Du die Objekte unabhängig von ihrem name Attribut über ihren Typ (Tagname) und einen Index ansprechen. Da du wahrscheinlich ohnehin für jede Person die gleiche Menge Eingabefelder benutzt, kannst Du das gute in einer Schleife abarbeiten. Sinnvollerweise zählst Du beim Erstellen neuer Inputfelder gleich die Anzahl in einer globalen Variablen mit.
                              [COLOR="#F5F5FF"]--[/COLOR]
                              [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                              [COLOR="#F5F5FF"]
                              --[/COLOR]

                              Kommentar

                              Lädt...
                              X