Hallo Michael,
so, Highlighting funktioniert, so dass Du siehst, was dein Versuch mit einer Variablen anrichtet.
Wenn Du SQL Syntaxteile dynamisch einsteuern willst - und der LIKE Operator ist SQL Syntax - dann musst Du mit SQL Injektion arbeiten. Sprich: Du musst das SQL komplett von Hand aufbauen und dabei auch auf korrekten Kontextwechsel achten. Jeder Parameterstring, den Du in SQL einbaust, muss mit $db->quote behandelt werden.
In deinem Fall ist das aber nicht unbedingt nötig. Du hast MariaDB und das kennt außer LIKE auch die Mustersuche mit REGEXP. Wenn dein Suchstring so aussieht:
"101 019, 103 245, 120 001, 481 100";
dann kannst Du ihn in dies hier transformieren:
"101 019|103 245|120 001|481 100";
Und dann mit dem REGEXP Operator an Stelle von LIKE arbeiten:
$sql = <<<END
SELECT ...
FROM ...
WHERE fahrzeugnummer REGEXP :s_fahrzeugnummer
UNION
...
END;
Damit wird es funktionieren. Der senkrechte Strich ist der "ODER"-Operator in einer Rexexp, wenn Du mehrere Suchmuster getrennt durch senkrechte Striche zusammenfügst, trifft die Regexp zu, wenn eins der Suchmuster zutrifft. MariaDB verwendet ähnlich wie PHP die PCRE-Suchmuster.
Ein schöner Spielplatz für PCRE-RegExp ist regex101.com. Eine Einführung die Syntax von MariaDB-Regexp findest Du hier, leider nicht auf deutsch. Wichtig für REGEXP in MariaDB ist, dass der aus Perl oder JavaScript bekannte REGEXP-Delimiter wegfällt. regex101 zeigt Dir vor und hinter der Regexp ein / an, das wäre dieser Delimiter, den gibt's in MariaDB nicht.
Die Prozentzeichen um die Nummern brauchst Du bei REGEXP nicht, der macht standardmäßig eine "ist irgendwo im String enthalten" Suche. Bei REGEXP musst Du extra angeben, falls Du möchtest, dass dein Muster am Anfang oder Ende steht. Aber das ist bei Dir ja nicht so.
Voraussetzungen
- Du schmeißt die Spaces hinter den Kommas weg. In deiner phpMyAdmin-Query hast Du das getan, dein gezeigter PHP Code tut es nicht.
- Du bist sicher, dass im Suchstring keine Regex-Steuerzeichen stehen. Davon gibt es eine ganze Menge. Wenn dein Suchstring mehr enthält als Buchstaben, Ziffern und einen Bindestrich, dann behandle jede einzelne Fahrzeugnummer im PHP mit preg_quote (2. Parameter weglassen)
Eine Funktion, die deinen Suchstring umbaut, könnte so aussehen:
function suchstringAlsRegExp($such) {
$teile = explode(",", $such);
$teile = array_map(fn($teil) => preg_quote(trim($teil)), $teile);
return implode('|', $teile);
}
oder, für Fans einzeiliger Logik beliebiger Komplexität, so:
function suchstringAlsRegExp2($such) {
return implode('|', array_map(fn($teil) => preg_quote(trim($teil)), explode(",", $such)));
}
array_map
ist ganz praktisch, um jedes einzelne Element eines Arrays mit einer Funktion zu behandeln. Das ist hier eine Pfeilfunktion:
fn($teil) => preg_quote(trim($teil))
die dem Suchstring-Teil die Leerzeichen vorn und hinten wegtrimmt und ihn dann mit preg_quote gegen RegExp_Steuerzeichen absichert.
Ich hoffe, ich überfordere damit deine PHP Erkenntnisfähigkeiten nicht 😉
Rolf
sumpsi - posui - obstruxi