Ersten Wert von group_by ermitteln lassen

truckdriver

Mitglied
Hallo zusammen,

mittels PHP lasse ich Adressen aus einer Datenbank ausgeben. Per group_by werden die Adressen nach der jeweiligen Stadt sortiert, so dass der User auf der entsprechenden Seite eine Select-Box mit den Städten vorfindet. Wähl er eine Stadt aus, werden ihm alle Adressen zu der von ihm ausgewählten Stadt angezeigt.

Jetzt gibt es allerdings folgendes Problem, bei dem ich absolut nicht weiter weiß. Und zwar möchte ich als Default-Wert vom System automatisch den ersten Wert der group_by Abfrage ermittelt und als Standardwert setzen (also wenn der User noch keine Auswahl getätigt hat).

Leider habe ich momentan keinen Plan, wie sich das realisieren lässt. Ich hoffe, dass ich hier hilfreiche Tipps bekomme.

Danke im Voraus.
 
Dem Vorschlag kann ich nicht wirklich folgen.

Das Select-Feld wird ja durch die group_by Abfrage mit den Städten gefüllt. Wenn die Seite allerdings erstmalig aufgerufen wird, dann wird halt noch keine Stadt ausgewählt (also keine Stadt per $_GET übergeben).

Momentan habe ich das ganze manuell gelöst (s. Code), was ich aber jetzt durch PHP lösen lassen möchte:

PHP:
$auswahl = isset($_GET["city"]) ? $_GET["city"] : "Bonn";

Wo “Bonn” steht, soll PHP nun automatisch den ersten Eintrag der group_by Abfrage eintragen. Also dann, wenn per $_GET nichts übergeben wurde.
 
Hi,

warum setzt Du beim Füllen der Selectbox nicht einfach beim ersten Durchlauf der Schleife das selected-Attribut, wenn keine Stadt übergeben wurde?

LG
 
Setz dir vor der Schleife ein Kennzeichen, das du beim Erstellen der <option> Zeilen abfragst. Beim ersten Durchlauf wird es zurücksetzt und auch das selected Attribut setzt. Die Abfrage kannst du auch gleich mit der Abfrage auf die übergebene Auswahl verknüpfen.
PHP:
$kennzeichen = 1;
while (irgendwas){
    if ($kennzeichen || ($_GET[city] == $zeile[city])){
        echo '<option selected>'.$stadtname.'</option>';
        unset($kennzeichen); 
   }else
        echo '<option>'.$stadtname.'</option>';
}
 
Danke für die Tipps, aber leider klappt das noch nicht so ganz mit der Umsetzung.

Lt. Quelltext der Seite wird zwar nur der erste Wert als selected markiert, aber es werden mir trotzdem alle Adressen zu allen Städten ausgegeben und nicht nur zur ersten Stadt.

So sieht der Code aus:

PHP:
$auswahl = $_GET["city"];
$query = "SELECT adresse, city FROM table GROUP BY city";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
$kennzeichen = 1;
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){
    if ($kennzeichen || ($_GET["city"] == $row["city"])){
        echo '<option selected>'.$row["city"].'</option>';
        unset($kennzeichen); 
   }else
        echo '<option>'.$row["city"].'</option>';
}
 
Zuletzt bearbeitet:
Hi,

Du müsstest uns schon zeigen, wo Du denn die Adressen abfragst und ausgibst. Das gruppierte Statement liefert Dir ja nur einen Datensatz pro Stadt.

LG
 
Ok, abgesehen davon, daß du bei den options noch den dazugehörenden value vergessen hast, solltest du, wenn möglich, nochmal die Strukturierung deiner Tabellen überdenken. So wie ich das von dem Ausschnitt überblicke, entspricht die nämlich nicht unbedingt der Normalform. Wenn du die Städte nämlich in eine eigene Tabelle packst, bräuchtest du nämlich nur diese sehr viel kürzere Tabelle zur Auswahl verwenden, was auch der Performance zugute kommt.

Ansonsten ist hier eh noch einiges durcheinander. Das dargestellte select soll nur die verschiedenen Städte darstellen. Warum nimmst du dann überflüssigerweise die Adressen mit? Die müssen doch erst geladen werden, wenn jemand die Stadt gewählt hat. Sind hier also völlig unnütz. Normalerweise müßte danach ein zweites select kommen, in dem dann die ganzen Adressen zur gewählten Stadt aufgelistet werden.
 
Also bisher läuft es wie folgt:

Zunächst habe ich die Variable definiert, die per $_GET übergeben wird und die entsprechende Abfrage erstellt:

PHP:
$auswahl = $_GET["city"];
$query  = "SELECT name, adresse, city FROM table WHERE city LIKE '$auswahl%' ORDER BY name ASC";

Und dann folgt die Gruppierung der Länder inkl. der Ausgabe in einem Selectfeld:

PHP:
$query = "SELECT city FROM table GROUP BY city";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error()); 
echo '<select name="city">';
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo '<option value='.$row["city"].'>'.$row["city"].'</option>';
}
echo '</select>';

Hier ist jetzt der neue Codeblock (selected) noch nicht mit drin.

Über eine Umstrukturierung der Datenbank wäre sicher nachzudenken. Da stimme ich vollkommen zu. Allerdings stehe ich momentan vor diesem Problem und möchte das möglichst erst lösen.
 
Ich denke mal, daß mit einer Umstrukturierung sich das Problem vielleicht von ganz alleine löst. Ich versteh es aber immer noch nicht so ganz. Du hast die ausgewählte Stadt und holst dann die ganzen Adressen dieser einen Stadt. Das "like" ließe sich durch Normalisierung beseitigen, was gleichzeitig auch Tipfehler ausschließt. Wozu dann anschließend nochmal die Gruppierung der Städte?
Wie gesagt, nach dem, was ich jetzt hier sehe, würde sich das Problem durch eine Umstrukturierung und vor allem auch eine logische Überarbeitung des Ablaufes von alleine erledigen.
 
Zurück