Dropdown in DB-Abrage durch Checkbox ergänzen

  • Thread Starter Thread Starter
  • #21
Bei dem von dir vorgeschlagenem Code sagt mir phpMyAdmin:


Oder war da was nicht vollständig? Dein Beitrag sieht ja etwas abgehakt aus.


Okay, aber lassen wir das mal Nebensache sein. Ich versuche jetzt den Code vom Eingangspost entsprechend anzupassen. Wenn ich

[src=mysql]SELECT
`Modelljahr`,
...
`Mehrausstattung`
FROM `haupt`, `mehrausstattung`[/src]

ausführe, bekomme ich ja 2 Spalten zurückgegeben. Ich hätte es gerne so, dass wenn einer der Mehrausstattungscodes in der Spalte verfügbar ist, nur eine Spalte zurückgegeben wird, aber auch alle anderen Codes anzeigt werden, sprich so wie hier mit Paint erstellt:



Was wäre denn da das Stichwort, wie ich da vorgehen muss? Oder sollte man es dennoch alles abfragen und das zusammenführen erst danach in PHP durchführen?

Liebe Grüße
HanZ
 
Zuletzt bearbeitet:
In der Tat kannst du das machen wie es dir besser passt.
Bisher habe ich das meistens in der Anwendung umgesetzt.

Du kannst aber auch so etwas machen wie [src=mysql]SELECT
`Modelljahr`,
...
, Group_Concat(Mehrausstattung order by Mehrausstattung SEPERATOR ', ')
FROM `haupt`, `mehrausstattung` group by haupttabelle.id[/src]

(Ich hoffe mysql versteht haupttabelle.id, ich springe regelmäßig von mssql zu mysql - bzw. aktuell fast nur MSSQL und der Syntax ist nur "ähnlich".. was sie Sache nicht gerade einfacher macht ;) )

zu der Sache mit dem Primary-key:
Eigentlich war das schon vollständig. Es gibt auch irgendwo im phpmyadmin ein Menü zum ändern des Primary-Key - z.B. bei Editieren der Tabellenstruktur? (Habe leider gerade keinen zum testen griffbereit).
 
Wäre schon fürs Internet. Wieso würdest du das nicht machen?
Du solltest zumindest auf OWASP gehen und das Ergebnis in Bezug auf die Häufigsten Angriffsarten checken, insbesondere SQL-Injections.
Gleichzeitig Datenbank/SQL/... lernen und dann das Ergebnis gleich ins Internet stellen ist nicht unbedingt ein guter Weg.
Wenn du auf OWASP warst kannst du das Ergebnis sicher hier auch mal zeigen und dir Feedback einholen.
 
  • Thread Starter Thread Starter
  • #24
Perfekt, GROUP_CONCAT war das, was ich gesucht habe. Bis jetzt funktioniert es schonmal größtenteils mit der Ausgabe.
Ein Manko gibt es noch: Wenn ich dann eine Mehrausstattung ausgewählt habe, wird im Ergebnis natürlich auch nur diese angezeigt und nicht die anderen. Gibt es da auch eine elegante Lösung?

Fühl mich fast bisschen schlecht, Fragen über Fragen :( Aber danke schonmal für die bisherige sehr gute Hilfe!



Danke für den Hinweis. Bevor wir da irgendwas öffentlich machen, werde ich da nochmal alle Kriterien durchlesen und mich informieren. So richtig "ins Internet gestellt" wird das auch gar nicht; das ist vor allem für die Szene und wird nur wenige stark interessieren. Da sich VW aber bis heute weigert Informationen jeglicher Art da für die Community bereitzustellen, wollen wir das jetzt mal selbst machen.
Mir ist aber natürlich auch klar dass es in dem Bezug kein "nur so halb ins Internet gestellt" gibt und wenige Nutzer kein Kriterium für Sicherheit sind :)
 
hm - das mit der Auswahl verstehe ich nun gerade nicht ...

edit:
mach nen .htaccess mit einem mind 12 Zeichen langen Benutzer + Passwort, Groß,Klein,Zahl,Sonderzeichen davor (Kann ja jeder Benutzer aus ner Textdatei kopieren bis auf weiteres)
dann ist es sicher ;)
 
  • Thread Starter Thread Starter
  • #26
Also ich habe ja einen Eintrag x, und der hat dann z.B. 10 Mehrausstattungen. Wenn ich jetzt danach filter, wer die Mehrausstattung "014" hat, dann soll der Eintrag x erscheinen, aber eben mit ALLEN Mehrausstattungen die Eintrag x besitzt. Mit der Lösung oben wird nur die "014" ausgegeben von SQL.

Das mit der .htaccess meinst du jetzt vorgeschalten auf der Webseite bis ich alles mit SQL-Injection überprüft habe?
 
hmmm die Gruppierung sollte eigentlich nach dem Select mit Eingrenzung (Where) stattfinden.
Hast du einen Beispiel-SQL Dump und eine Abfrage die du gemacht hast damit man das mal ausprobieren kann?
 
  • Thread Starter Thread Starter
  • #28
Hey zusammen,

mit etwas Hilfe per PN ist es jetzt fast so wie ich es haben wollte. Nur noch kleine Anpassungen und etwas schöneren Code, aber ansonsten funktioniert es grundlegend schonmal. Danke für die ganze Hilfe bis hierher. Wenn ich mich dann mit SQL-Injections beschäftige, melde ich mich hier nochmal.

LG
HanZ
 
Du kannst auch einen entsprechenden MySQL Wrapper verwenden, dann brauchst Du Dich nicht um die SQL Injections kümmern. Mein Favorit ist da MeekroDB.
Sehr einfach einzusetzen und gut abgehangen.
 
  • Thread Starter Thread Starter
  • #30
Mal so grundsätzlich gefragt, ich weiß das sollte keine Praxis sein und ist es auch nicht, aber wenn der User der sich mit der Datenbank verbindet nur SELECT-Rechte hat und auch nur für diese Datenbank, dann sind SQL-Injections doch nicht möglich oder?
 
Doch auch da.

SQL Injections laufen ja so ab, dass man etwas übergibt, zum Beispiel einen SQL-Befehl, der wenn nicht richtig "escaped" (abgefangen) wurde ausgeführt wird.

Im Grunde ist sowas immer möglich. Häufige Fehler ist zum Beispiel "Blind" einen SQL Querystring zu bilden:
Böse wäre daher:
[kw]"SELECT * FROM table WHERE id=" + id[/kw]

Was hier schief läuft, das "id" wird nicht behandelt sonder blind angehängt. Mit etwas "Voodoo" könnte es passieren das "id" keine Nummer enthält, sondern einen bösartig gestalten Befehl der dann von SQL verarbeitet und ausgeführt wird.

Generell gilt, wenn man zum Beispiel HTML bekommt, [kw]htmlspecialchars[/kw], siehe hier oder ähnliche Befehle anzuwenden. Und immer daran denken, "User Input ist böse!" ;)

Was auch helfen kann:

Und das Beste: [kw]mysql_escape_string[/kw] !
 
  • Thread Starter Thread Starter
  • #32
Was könnte denn der SQL-Befehl da dann bewirken? Er hat ja nur Rechte für SELECT. Passwörter ändern oder andere böse Sachen sind da dann ja nicht möglich?
(Mir gehts nur ums Verständnis, ich werde natürlich beachten dass da keine SQL-Injections möglich sind)
 
Hm, zum Beispiel könnte "id" so aussehen:

[kw]SELECT * FROM table WHERE id=" + id[/kw]

Zum Beispiel dann einen Subquery:

Also sowas hier
[kw]1 AND officeCode IN (SELECT officeCode FROM offices WHERE country = 'USA';)[/kw]

Die 1 ist deine ID, soweit ja in Ordnung, aber das was dann als "AND" Code kommt, kann Daten publizieren die du nicht herausgeben wolltest. Im schlimmsten Fall.
 
  • Thread Starter Thread Starter
  • #34
Okay verstehe :)
Die Art der Abfrage im ursprünglichen Link ist ja gegen SQL-Injections entsprechend gewappnet, korrekt (mit dem bindValue, wenn ich das alles richtig verstehe)?
 
Ja.

Wobei:
[src=php]
$placeholder = [":p1", ":p2", ":p3", ":p4", ":p5"];
$filter = [];
$conditions = [];
$nr = 0;

// .... cutout

if ($_POST["Farbe"] != 'Alle') {
$filter[] = $_POST["Farbe"];
$conditions[] = "`Farbe` = " . $placeholder[$nr];
$nr++;
}[/src]

Die Abfrage läuft ja über "$nr" aus den Platzhaltern, das heißt der Nutzer kann theoretisch nur eine Nummer vorgeben und der korrekte Code Part wird dann aus den "$placeholder" herausgesucht. Von daher ist das ziemlich safe. Trotz des Verkettens mit [kw] $conditions[] = "`Farbe` = " . $placeholder[$nr];[/kw].

Aber das Bindvalue tut auch sein übriges. Wenn du es noch verbessern willst, kannst du einen Typen bzw. Einheit für einen Wert mitgeben:
Siehe hier:

Und auch das Implode hier, auch wenn es über Post übergeben wird:
[src=php]f (count($conditions)) {
$query .= " WHERE " . implode(" AND ", $conditions);
}
$query .= " ORDER BY `Preis` DESC";

$select = $db->prepare($query);
foreach ($filter as $nr => $f) {
$select->bindValue($placeholder[$nr], $f);
}[/src]
 
Zuletzt bearbeitet:
So zu programmieren wird letztendlich zwangsläufig zu SQL-Injections führen. Du solltest direkt umsteigen auf mysql wrapper wie von braegler erwähnt oder prepared statements ausschließlich nutzen. Niemals jemals wieder so ein Muster
Code:
Expand Collapse Copy
$part_of_my_query = "..." . $var
verwenden.
 
Zurück
Oben