dedlfix: Suchfunktion MySql DB PHP

Beitrag lesen

Tach!

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

trim() trimmt auch die Leerzeichen weg. Aber das was du da im ltrim() geschrieben hast ist eine Kombination aus NUL-Byte einem x und den Ziffern 2 und 0. Ich glaube ja nicht, dass du diese 4 Zeichen am Anfang entfernen möchtest. \x20 wäre ein Leerzeichen. Aber das hättest du auch direkt als Leerzeichen schreiben können - was aber auch wenig sinnvoll ist, weil das ja bereits vom trim() eliminiert wurde.

      $searchTerms = explode(" ",$term);
      
      foreach($searchTerms as $searchTerm){
        $sql[] = '\'%'.$searchTerm.'%\'';
      }
      
       
      $query = $mysqli->query("SELECT id, vorname, nachname, ort FROM table WHERE vorname LIKE ".implode(" OR ", $sql)." OR nachname LIKE ".implode(" OR ", $sql)." OR ort LIKE ".implode(" OR ", $sql)." ORDER BY name ASC");`

Lass dir mal das fertige Statement ausgeben. Das ist zwar (oftmals) syntaktisch richtig, aber nicht das was du eigentlich haben möchtest. Das wird fast immer alle Ergebnisse finden, weil die einzelnen Werte die durch das implode() mit dem OR drin entstehen, die Bedingung meistens wahr werden lassen.

x LIKE a OR b evaluiert zu (x LIKE a) OR (b). Es gibt keine Kombination innerhalb eines LIKE. Zum Kombinieren musst du mehrere einzelne Bedingungen formulieren à la (x LIKE a) OR (x LIKE b). (Die Klammern können wegbleiben, die dienen nur zur Veranschaulichung der Teilausdrücke.)

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

dedlfix.