dedlfix: Suchfunktion MySql DB PHP

Beitrag lesen

Tach!

if(isset($_GET['term'])){
      $term = trim($_GET['term']);
      $term = ltrim($term, "\0x20"); 

Oh, \0x20 sollte es sein, da die ID bei im System mit 0 auf 5-stellig aufgefüllt wird und ich mit der Angabe 0 irgendwie nicht das Ergebnis bekam.

\0x20 ist \0x20, und ist nach wie vor keine 0 und keine syntaktisch korrekte Escape-Sequence. Wenn bei dir eine 0 direkt angegeben nicht funktioniert, dann hast du irgendein anderes Problem. "\x30" und "0" jedenfalls muss dasselbe Ergebnis bringen.

Außerdem kann man da SQL-Injection betreiben, weil du die Eingabewerte unmaskiert ins Statement bringst.

Die Eingabewerte werden doch in der foreach maskiert.

Nein, da werden sie nur quotiert (in Anführungszeichen gesetzt) und mit den für das LIKE notwendigen Jokerzeichen ergänzt. Eine Entschärfung von in der Eingabe enthaltenen Anführungszeichen findet nicht statt. Das wäre das Maskieren, das Verstecken der Anführungszeichen vor dem Parser, damit dieser da kein String-Ende erkennt.

Vorher prüße ich die einegehenden Werte auch noch mit verschiedenen Regex auf Injection, habe dieses hier nur rausgelassen um den thread nicht aufzublähen.

Das ist nicht notwendig. Eigene Prüfroutinen brauchst und solltest du nur für fachliche Anforderungen vornehmen. Für eine syntaktisch korrekte Aufbereitung (inklusive Injection-Verhinderung) gibt es eine entsprechende MySQL-Funktion: mysqli::real_escape_string().

Mir geht es halt darum das nur nicht diese 3 Felder durchsucht werden können, sondern insgesamt 7, und dann kommt da ja mit der Verschachtelung eine riesige Abfrage raus. Ich weiß halt nicht in welcher reihenfolge es eingegeben wird, ob der nutzer nun nach Oliver Hermann hintertupfingen sucht oder nach Hermann oliver hintertupfingen.

Erstmal solltest du eine funktionierende Lösung notieren, die deine gewünschte Aufgabe in die entsprechende SQL-Syntax umsetzt und nicht in eine nicht funktionierende Phantasie-Syntax. Und dann ist es doch im Prinzip egal, wie lang das Statement wird. Du schreibst das für ein Feld richtig und den Rest macht eine Schleife.

Gibt es da denn nicht eine elegantere Lösung?

Die können wir dann suchen, wenn du eine funktionierende hast. Es gibt da zwei Möglichkeiten. Die eine ist, die Suchbegriffe auf jedes Feld einzeln anzuwenden, die andere ist, ein großes Feld zu erstellen und darin zu suchen. Keine gescheite Lösung wäre allerdings, im SQL-Statement die Felder zu einem großen String zu konkatenieren, und die Suche darauf zu fahren, weil dann immer mit Full Table Scann gesucht werden muss, ohne eine Index zu haben.

Eine Full-Text-Suche geht auch, aber dann bist du meines Wissens daraufhin eingeschränkt, entweder keine Jokerzeichen oder nur den * am Wortende zur Verfügung zu haben.

dedlfix.