Werte aus mehreren Spalten DISTINCT auslesen

Frezl

Erfahrenes Mitglied
Hey allerseits,

ich google jetzt schon seit ner Stunde nach der Lösung für mein Problem, konnte bis jetzt aber keinen funktionierenden Code finden :p

Das Problem:
Ich habe eine Tabelle, in der Projekte gespeichert sind. Jedes Projekt kann maximal 3 Branchen zugeordnet werden. Dafür gibt es die Spalten branch_1, branch_2 und branch_3. Ich suche eine Möglichkeit, die Werte aus den drei Spalten auszulesen, ohne dabei Dubletten zu erhalten.

Beispiel

Code:
| id | branch_1 | branch_2 | branch_3 |
| 1 | automotive | electronics | |
| 2 | electronics | | |
| 3 | aero | electronics | plastics  |
| 4 | plastics | | |

Die Abfrage soll mir {automotive, electronics, aero, plastics } liefern.

Die Lösung, die zu meinem Problem passt, hab ich hier gefunden: http://www.spotlight-wissen.de/archiv/message/361423.html
Leider funktioniert sie nicht :-( Auf meinem Server läuft mySQL 5.1, es sollte also eigentlich klappen :p

Ich hoffe, ihr wisst Rat!
Gruß und Dank, Frezl
 
Ich liebe dieses Forum - bzw. seine User! Danke für die schnelle Antwort!

Code:
  // Branchen auslesen:
  $mysql_query = "SELECT DISTINCT branch 
                  FROM (
                          SELECT branch_1 AS branch FROM ".$_POST['table']['name']."
                    UNION SELECT branch_2 AS branch FROM ".$_POST['table']['name']."
                    UNION SELECT branch_3 AS branch FROM ".$_POST['table']['name']."
                       )";
  $result_branches = mysql_query($mysql_query, $mysql_link) or die('mysql_query() for branches failed - '.mysql_error());

Als Fehlermeldung bekomme ich: "mysql_query() for branches failed - Every derived table must have its own alias"
 
item: du solltest nicht direkt aus $_POST dein SQ zusammensetzen

item: Die Lösung deines Problems (hoff ich). Nach der letzten Klammer musst du ein Alias angeben. MySQL will für jedes Subquery ein Alias haben
SQL:
SELECT DISTINCT branch 
FROM (
        SELECT branch_1 AS branch FROM {$_POST['table']['name']}
        UNION SELECT branch_2 AS branch FROM  {$_POST['table']['name']}
        UNION SELECT branch_3 AS branch FROM  {$_POST['table']['name']}
    ) AS source;
 
Zuletzt bearbeitet von einem Moderator:
item: du solltest nicht direkt aus $_POST dein SQ zusammensetzen
Warum nicht?

Yeah, deine Lösung funktioniert :) Allerdings hab ich jetzt noch ein leeres Feld im Ergebnis-Array, da es ja in den Spalten auch leere Felder gibt. Wie kann ich das rausfiltern? "WHERE branch <> NULL" hat leider net funktioniert :-(



EDIT: "WHERE branch <> ''" funktioniert :)

Danke für deine Hilfe!
 
Zuletzt bearbeitet:
Kann man über POST-Variablen auch Code einschleusen? Bin davon ausgegangen, dass das nur mit GET-Variablen funktioniert, weil die in der URL übergeben werden...

D.h. ich sollte also erst mal alle übergebenen Variablen mit strip_tags() und dem ganzen Kram durchnehmen? Aber welche Funktionen brauch ich, damit die Variable wirklich sauber wird? Kann mir da bitte jemand ein Beispiel geben?

Gruß und Dank,
Frezl
 
Dazu hab ich noch ne Frage: Mein Script liest Datensätze aus einer Datenbank aus und gibt sie auf dem Bildschirm aus. Der Nutzer hat die Möglichkeit, die Tabelle nach bestimmten Werten zu filtern und zu sortieren. Diese Einstellungen speichere ich in einem POST-Array, das ich dann über ein verstecktes Eingabefeld übergeben kann. Darunter sind zum Teil Angaben, die der Benutzer machen kann (Sortierung nach Spalte x), zum anderen aber auch welche, die ich aus der Config lese (Tabellenname, etc.).

Muss ich, um das Script sicher zu machen, alle POST-Variablen überprüfen, oder reicht es, wenn ich die, die der Nutzer im Formular ändern kann, überprüfe?
Hab vom Thema Sicherheit in PHP ehrlich gesagt noch nicht so viel Ahnung :p

Grüße, Frezl
 
POST oder GET macht keinen Unterschied. Alles was dir der User durch seinen Browser schickt kann modifiziert werden. 'hidden' Felder zu überschreiben ist kein Zauberwerk. Lad dir mal die Firefox Erweiterung Webdeveloper runter - da kannst du dir einach alle Felder einblenden lassen, Drop-downlisten in Freitext Felder umwandeln etc.

Ein wichtiger Grundesatz ist - ALLES was von aussen in dein System kommt musst du prüfen!
 
Hey fassy,

danke für den Tipp mit Webdeveloper! Ich hab am Montag den ganzen Tag damit verbracht, mich in das Thema "Sichere PHP-Anwendungen" einzulesen und mir dann überlegt, mit welchem Tool ich die Eingaben zu Testzwecken manipulieren kann. Wusst aber net genau, nach was ich suchen soll und hab deshalb auch nix gefunden :p Dein Tipp kommt also wie gerufen :)

Gruß und Dank,
Frezl
 

Neue Beiträge

Zurück