Mysql query mit Bedingung

tsunami
Goto Top
Hallo zusammen,
ich habe ein Formular mit 3 select-Feldern. Monat, Kunde und Mitarbeiter.
Daraus soll eine dynamische DB Abfrage entstehen.
So, nun kann ich natürlich mit php 8 verschiedene ifs bauen. Es soll entweder gefiltert werden, wenn zB ein spezifischer Kunde gewählt wurde, wenn kein spezifischer Kunde gewählt wurde, sollen alle Datensätze angezeigt werden.
Also kunde spezifisch ja nein, Mitarbeiter spezifisch ja nein, Datum spezifisch ja nein:


Was ich bräuchte ist sowas wie:

Ich hatte gesehen, dass es so was ähnliches mit case gibt, aber das war nur für die Ergebnisse. Also was weiß ich case monat=10 jahrezeit = Herbst.
Mein Problem ist, dass dann natürlich das "from kunden" nicht komplett rein darf, wenn kein Kunde gewählt ist. Lasse ich es weg, kennt er die Tabelle nicht. weil es sonst zuviele Datensätze ausgibt. Hatte noch versucht, dass um Codeschipsel zu erweitern.


Funktioniert nur für einen Teil der Kombis, weil je nach Filter der from - Teil unterschiedlich ist.

Rauskommen soll eine flexible Tabelle. Wo ich entweder sehen kann, wo der Mitarbeiter war, wo der Mitarbeiter am Monat x war. wann der Mitarbeiter beim Kunden A war und andersherum, wer beim Kunden A war, wer im Monat M beim Kunden A war, oder was im Monat 11 2021 gelaufen ist.
Der Tabellenaufbau:

Die Kunden und die Mitarbeiter sind via id verknüpft, das heißt ja, dass je nach Filter "from mitarbeiter" rein muss oder nicht. (oder "from kunden")
mfG

Content-Key: 2163545354

Url: https://administrator.de/contentid/2163545354

Ausgedruckt am: 30.06.2022 um 22:06 Uhr

Mitglied: em-pie
em-pie 14.03.2022 aktualisiert um 18:28:01 Uhr
Goto Top
Moin,

eigentlich brauchst du keine If-Bedingungen.

Du kannst das wie folgt machen - und dabei mit JOINs arbeiten, was IMHO sinniger ist


die drei Variable im Set übernimmst du dann aus deinen Auswahlfeldern, die du (vermutlich) per POST oder was auch immer übergibst

Gruß
em-pie
Mitglied: akretschmer
akretschmer 14.03.2022 um 19:38:30 Uhr
Goto Top
Mitglied: tsunami
tsunami 15.03.2022 um 08:25:14 Uhr
Goto Top
@em-pie
Genau, die 3 Selects kommen via post.
Die Variable Kunde ist also entweder 0 => Filter ignorieren
oder !=0 => Filter

Was bedeutet der Part:
Ist das exemplarisch für die Variable Kunde?
Mitglied: em-pie
Lösung em-pie 15.03.2022 aktualisiert um 08:40:30 Uhr
Goto Top
Zitat von @tsunami:

@em-pie
Genau, die 3 Selects kommen via post.
Die Variable Kunde ist also entweder 0 => Filter ignorieren
oder !=0 => Filter
Die Zeilen 1-4 deklarieren grundsätzlich erst einmal Variablen innerhalb des SQL-Statements
Die Zeilen 6-9 weisen den Variablen Werte zu. Hier kannst du eine via POST erhaltenen Variablen einfügen *


Was bedeutet der Part:
Ist das exemplarisch für die Variable Kunde?
Nein. Du hast doch in deinem Ausgangspost selbst mitgeteilt, dass Mitarbeiter der der Ausfuehrer ist.
Also ist der Mitarbeiter dein eigenes Personal

Ich habe die Variablen alle mit @post begonnen, um optisch darauf hinzuweisen, dass die Inhalte aus einem POST-Statement stammen. Ich hätte auch die Variablen @pusemuckel, @rumpelstielzchen und @gandalf nennen können, wäre dann aber weniger eindeutig gewesen.

Versuche bitte zu verstehen, was oben passiert. Es erfüllt eigentlich genau deine Anforderung. Deine Filterung findet ja erst in den Zeilen 28 - 31 statt. Wobei nicht gegen 0 geprüft wird, sondern NULL (das eine ist die Zahl 0 das andere ist nichts). Wenn Kunde bzw. Mitarbeiter den Wert 0 inne haben, werden diese auf NULL gesetzt (siehe Zeile 6 - 9).
Also ist der Kunde = Variable oder die Variable ist leer (und somit werden alle Kunden gelistet)


(*) Hierzu noch eine Anmerkung
Prüfe bitte noch, ob die Inhalte valide sind. Der nächst beste pöhse Pursche fängt sonst mit SQL-Injections an!

Edit: Typo
Mitglied: tsunami
tsunami 16.03.2022 um 16:51:18 Uhr
Goto Top
@em-pie
Irgndwie hakt es noch:
Zu einen irritiert mich das "@"

Das macht dasselbe, ich ich mit if(isset(...) gemacht habe? Gegen das sql-Injection nehme ich möglichst das sprintf mit dem mysqli_real_escape_string)


So scheint es zu funktionieren. den Part mit Nullif habe ich getauscht. Was mich fuchst, ist der from part. taetigkeiten brauche ich in jedem Fall, mitarbeiter nur, wenn ich den entsprechenden Filter gesetzt habe. Das scheint ja das inner join zu machen... Ich würde es gerne verstehen.
Vielen Dank erstmal.
Mitglied: em-pie
Lösung em-pie 17.03.2022 aktualisiert um 10:51:23 Uhr
Goto Top
Moin,

Ein Tipp: Formatiere deine SQL-Queries (und auch andere Quellcodes) ordentlich. das vereinfacht das Lesen ungemein.

Zu deinem Problem.
Mein Code oben ist ausschließlich SQL-Syntax. PHP streut da noch nicht ein.
Im SQL-Statement kann man mit Variablen arbeiten, erkennbar an einem @. Beginnt die Variable mit einem @@, so hadelt es sich um Systemvariablen.

In deinem Fall müssest du das, um das in PHP einzubinden, wie folgt aufbauen:

Die PHP-Variable $strSqlQry ist dann deine, mit der du das Statement "abfeuern" kannst.

Edit: Typo
Mitglied: tsunami
tsunami 17.03.2022 um 10:39:34 Uhr
Goto Top
Vielen Dank! Tiuts!