Ich würde die Filter-Logik von PHP komplett nach MySQL verfrachten.
Du kannst in der WHERE-Klausel ausdrücken, dass du nur nach einem Namen filtern willst, wenn auch wirklich ein Name angebgen wurde. Das sähe dann so aus WHERE (? IS NULL OR name = ?)
. Bei bind_param
müsstest du dann beide ?
durch $name
ersetzen lassen. Wenn $name === null
ist, dann wird die Klausel zu WHERE (NULL IS NULL OR name = NULL)
, das heißt die Bedingung ist immer wahr und es wird kein Datensatz gefiltert. Wenn $name === 'Biff'
ist, dann wird die Klausel zu WHERE ('Biff' IS NULL OR name = 'Biff')
und der Filter ist aktiv. Der Filter lässt sich dann auch einfach kombinieren:
function zeiterfassung($mysqli, $name = null, $projektnummer = null, $datum_von = null, $datum_bis = null) {
$select = "
SELECT id, code, projektnummer, name, datum, betreff, anzStunden, jahr, monat, tag
FROM zeiterfassung
WHERE (? IS NULL OR name = ?)
AND (? IS NULL OR projektnummer = ?)
AND (? IS NULL OR datum_von >= ?)
AND (? IS NULL OR datum_bis <= ?)";
$query = $mysqli->prepare($select);
$query->bind_param(
'ssssiiii',
$name, $name,
$projektnummer, $projektnummer,
$datum_von, $datum_von,
$datum_bis, $datum_bis
);
// …
}