Phillip: [PHP / MySQL] Mehrere Drop Downs -> select

hi!

ich hab leider wieder ein kleines problemchen :(
also auf meiner liga seite kann man, nachdem man das ergebnis zu einem match eingetragen hat die zugehörigen torschützen für jedes tor angeben. das sieht dann in etwa so aus:
[img]http://emerge-media.de/eintragen.jpg[/img]
das speichern und ausgeben funktioniert auch wunderbar. nur möchte ich die schützen auch editieren können.
dazu soll man zu einer quasi gleichen ansicht wie beim eintragen gelangen. in höhre der anzahl der tore die drop downs mit jeweils allen spielern des vereins. allerdings sollen die bereits gespeicherten torschützen unter den spielern "selected" werden. ihr wisst denk ich mal, was ich meine :)
das habe ich versucht nur leider funktioniert das irgendwie nicht (min noch ausser acht lassen):
[IMG]http://emerge-media.de/edit.jpg[/IMG]
irgendwie wird also immer nur der letzte torschütze selected wie man an den beiden screenshots sehen kann.

hier ist mein zugehöriger code:
[php]<?php
$tore2 = $row["ergebnis_2"];
          $j = 0;

while ($j < $tore2)
            {
                $j++;
                echo "".$j.": ";

$sql_spieler_2 = @mysql_query("select * from ".$prefix."_spieler WHERE liga_id='".$rechts["liga_id"]."' AND vereins_id='".$rechts["vereinid"]."' order by name asc;", $sql_id);

echo "<select name="spieler_id_2[".$j."]" size="1">";
                echo "<option value="0">Bitte wählen</option>";

while($spieler_2 = @mysql_fetch_array($sql_spieler_2))
                    {
                        $sql_torsch_rechts = mysql_query("select * from ".$prefix."_liga_torschuetzen where match_id='".$_GET["match_id"]."' AND rechts='ja' AND spieler_id='".$spieler_2["id"]."' order by id desc;", $sql_id) or die (mysql_error());
                        $entrys_torsch_rechts = mysql_num_rows($sql_torsch_rechts);

if ($entrys_torsch_rechts == 1)
                            {
                                print "<option value="".$spieler_2["id"]."" selected>".$spieler_2["name"]." ".$entrys_torsch_rechts."</option>";
                            }
                        else
                            {
                                print "<option value="".$spieler_2["id"]."">".$spieler_2["name"]." ".$entrys_torsch_rechts."</option>";
                            }
                    }

echo "</select>";

$min2 = 0;
                echo "<select name="minute_2[".$j."]" size="1">";
                echo "<option value="0">Min.</option>";
                while($min2 < 120)
                    {
                        $min2++;
                        print "<option value="".$min2."">".$min2."'</option>";
                    }
                echo "</select><br>";
            }
?>[/php]
zur sicherheit auch nochmal hier: [url]http://nopaste.php-q.net/183833[/url]

hier sind meine beiden datenbankstrukturen:

CREATE TABLE dfc_liga_torschuetzen (
  id int(11) NOT NULL auto_increment,
  match_id int(11) NOT NULL default '0',
  links text NOT NULL,
  rechts text NOT NULL,
  spieler_id int(11) NOT NULL default '0',
  minute int(11) NOT NULL default '0',
  liga text NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;

CREATE TABLE dfc_spieler (
  id int(11) NOT NULL auto_increment,
  liga_id int(11) NOT NULL default '0',
  vereins_id int(11) NOT NULL default '0',
  name text NOT NULL,
  liga text NOT NULL,
  PRIMARY KEY  (id)
) TYPE=MyISAM;

hmm ich hoffe mir kann jemand von euch helfen :) ich bin nämlich schon am verzweifeln :(

vielen dank schonmal:)
phillip

  1. Hallo Phillip,

    zum einen ein paar Bedienungshinweise zum Forum, die Du auch in der Forums-Hilfe unter Postings formatieren findest. Du hast es mit "Trial and Error" probiert, halt nicht getroffen, was kein Beinbruch ist. Leerzeichen bei meinen Angaben weglassen. [1]

    Bilder kannst Du hier mit [ image:url ] einbinden.

    dazu soll man zu einer quasi gleichen ansicht wie beim eintragen gelangen. in höhre der anzahl der tore die drop downs mit jeweils allen spielern des vereins. allerdings sollen die bereits gespeicherten torschützen unter den spielern "selected" werden. ihr wisst denk ich mal, was ich meine :)
    das habe ich versucht nur leider funktioniert das irgendwie nicht (min noch ausser acht lassen):

    hier ist mein zugehöriger code:

    Syntaxhighlightning geht mit [ code lang=... ]Hier Dein Code[ /code ]. Es sind viele Sprachen möglich, siehe oben verlinkte (nicht vollständige) Doku. [2]

    <?php

    $tore2 = $row["ergebnis_2"];

    [...]

    ?>

      
    
    > zur sicherheit auch nochmal hier: <http://nopaste.php-q.net/183833>  
      
    anklickbare Links mit [ link:url ] erzeugen  
      
    
    > hier sind meine beiden datenbankstrukturen:  
    >   
    
    sql ist eine gültige Sprache für code :-)  
      
    ~~~sql
      
    
    > CREATE TABLE dfc_liga_torschuetzen (  
    >   id int(11) NOT NULL auto_increment,  
    >   match_id int(11) NOT NULL default '0',  
    >   links text NOT NULL,  
    >   rechts text NOT NULL,  
    >   spieler_id int(11) NOT NULL default '0',  
    >   minute int(11) NOT NULL default '0',  
    >   liga text NOT NULL,  
    >   PRIMARY KEY  (id)  
    > ) TYPE=MyISAM;  
    
    

    Hmm, ich habe Deinen Code nicht wirklich verstanden, weil er aus dem Zusammenhang gerissen ist, und die Initialisierung und der Zweck mancher Variablen mir unklar oder zweifelhaft ist. Deshalb einfach ein paar grundsätzliche Anmerkungen zur Problemlösung:

    Du fragst innerhalb von Schleifen mehrfach die Daten ab, die Du bereits im vorhergehenden Durchlauf abgefragt hast. Datenbankabfragen sind im Vergleich teuer, d.h. ressourcenintensiv. Du könntest diese deutlich einschränken.

    Weiterhin könntest Du die Gesamtaufgabe in einzelne überschaubare Abschnitte. Du wirst feststellen, dass einzelne Abschnitte sich immer wieder wiederholen, nur mit etwas anderen Ausgangsdaten. Dies sind ideale Kandidaten für Funktionen.

    Es ist eine gute Idee, innerhalb dieser Funktionen _keine_ Ausgabe zu generieren, sondern statt dessen Zeichenketten zusammenzubauen, die Du später ausgeben kannst.

    Du hast ein bestimmtes Match
    // Vier Abfragen an die Datenbank liefern Dir alle Daten,
    // die Du benötigst. [3] Speichere die Ergebnisse in Arrays ab.
    Ermittle die Spielerliste der Heimmannschaft
    Ermittle die Spielerliste der Gastmannschaft
    Ermittle die Details zu den Toren der Heimmannschaft
    Ermittle die Details zu den Toren der Gastmannschaft

    // Verarbeite die Tore der Heimmannschaft
    Du benötigst die Spielerliste der Heimmannschaft
    und die Torliste der Heimmannschaft

    Gebe ein numeriertes Array zurück. Jeder Array-Eintrag
    ist ein assoziatives Array mit den zwei Schlüsseln
    'Mannschaftsliste' und 'Zeitpunkt'

    Für jedes Tor dieser Mannschaft
        Beginne eine Select-Liste
        Für jeden Spieler der Mannschaft
            Erstelle einen <option>-Eintrag
            Wenn der Spieler der Torschütze ist
                Markiere den Eintrag als ausgewählt
            Ende Wenn
            Schreibe den Spielernamen
            Schliesse den Eintrag
        Ende Für
        Schliesse die Liste
        Speichere die Liste im Array-Eintrag
        Wenn der Zeitpunkt bekannt ist
            Speichere den Zeitpunkt im Array-Eintrag
        Ende Wenn
    Ende Für
    Gebe das Array zurück

    // Gehe diese Aufgaben mit den Toren der Gastmannschaft
    // auf gleiche Art und Weise durch

    // Gebe die Arrays in geeigneter Reihenfolge aus.

    Mit diesem Ansatz kannst Du die Anzahl der Datenbankzugriffe deutlich reduzieren und Deine Ergebnisse flexibel ausgeben, z.B. als Liste von Toren mit Detailangaben oder als Tabelle von Torschützen (Heim), Zeitpunkt (Heim), Torschützen (Gast), Zeitpunkt (Gast).

    Die benötigten Funktionen sollten sich aus dieser Vorgehensweise ebenfalls von selbst anbieten (mit Übergabe- und Rückgabeparametern).

    Freundliche Grüße

    Vinzenz

    [1] Ich bin im Moment zu bequem, um nach der Methode "Gunnar" vorzugehen.
    [2] Mal schauen, ob ich den Bugtracker noch bedienen kann.
    [3] Man käme mit zwei Abfragen aus, aber die vier hier scheinen mir angebracht.