Hallo,
ich sehe zwei Möglichkeiten.
#1. Schleife
Man prepared das Statement so wie es ist, und zwar zu Beginn der Funktion. Den bind_param macht man an eine Temp-Variable (muss in mysqli so sein), und man bereitet ein leeres Array zum Sammeln der Ergebnisse vor.
Dann durchläuft man das $filter-Array, weist nacheinander jeden Wert darin dieser Temp-Variablen zu, führt das Statement aus und hängt die Ergebnisse an das Sammel-Array an.
Vorteil: Man hat nur ein Statement zu preparen, und die DB kann den Plan dafür gut cachen.
Nachteil: Man muss pro Checkbox einen DB-Roundtrip machen.
#2. Dynamisches SQL
Das ist sehr mühsam, wenn man prepare verwendet. Hier wäre wohl ein Einsatz ohne Prepare besser.
Man bestimmt die Länge des $filter-Array und produziert die WHERE-Bedingung dynamisch. Und zwar so, dass man die Array-Einträge SQL-gerecht transformiert (d.h. die Werte in Hochkomma setzen und passend escapen), und dann mit ", " als $glue (->Doku) implodiert. Das Ergebnis setzt man in die Klammern eines IN Ausdrucks, so dass da nachher z.B. WHERE kategorie IN ('1', '5')
steht.
Vorteil: Nur ein DB-Roundtrip
Nachteil: Man muss das SQL zurechtfummeln, wie in schlechten alten mysql-Zeiten.
--
Was in den mir bekannten SQL Servern NICHT funktioniert, ist ein prepared statement mit `WHERE kategorie in (?) und einem Array für den ? Parameter. Aber vielleicht ist MySQL hier mal wieder großzügiger...
Rolf
sumpsi - posui - clusi