Prepared Statement LIKE Problem

Fox90

Grünschnabel
Hi Leute,
ich hab ein Problem mit einem Prepared Statement, welches einfach nicht ordentlich funktionieren will:

PHP:
public function searchUser($what, $keyword) {
  
        $sql = "SELECT
                    id,
                    title,
                    firstname,
                    lastname,
                    email
                FROM users
                WHERE ? LIKE CONCAT('%', ?, '%')";
              
        $result = null;
      
        if($stmt = $this->db->prepare($sql)) {
            $stmt->bind_param('ss', $what, $keyword);
            $stmt->execute();
            $stmt->bind_result(
                $userID,
                $title,
                $firstname,
                $lastname,
                $email
            );  
          
            while($stmt->fetch()) {
                $result[] = array(
                    'user_id' => $userID,
                    'title' => $title,
                    'firstname' => $firstname,
                    'lastname' => $lastname,
                    'email' => $email
                );
            }
            $stmt->close();
          
            return $result;          
        }
        return false;  
    }

Hab auch schon gegoogelt und gesucht, was falsch sein könnte, aber ich komm einfach nicht drauf, wenn ich statt dem Prepared Statement ein Query einsetze, erhalte ich hingegen keinen Fehler und erhalte die Suchergebnisse:

PHP:
  public function searchUser($what, $keyword) {
  
        $what = mysqli_real_escape_string($this->db, $what);
        $keyword = mysqli_real_escape_string($this->db, $keyword);
      
        $sql = "SELECT
                    id,
                    title,
                    firstname,
                    lastname,
                    email
                FROM users
                WHERE ".$what."
                LIKE '%".$keyword."%'";
      
        $data = null;
      
        if($result = $this->db->query($sql)) {
            while($row = $result->fetch_assoc()) {
                $data[] = array(
                    'user_id' => $row['id'],
                    'title' => $row['title'],
                    'firstname' => $row['firstname'],
                    'lastname' => $row['lastname'],
                    'email' => $row['email']
                );
            }          
            return $data;
        }
        return false;
    }

Ich hoffe jemand kann mich aufklären. Vielen Dank im voraus und schöne Pfingsten :).
 
Hallo,

du kannst beim bind_param auch das Keyword bereits mit % angeben und somit das CONCAT weglassen. Was IMHO aber nicht funktioniert, ist das binden von Tabellennamen. Da kommst du um eine String-Concatenation nicht herum Erfahrungsgemäß sollte das funktionieren:

PHP:
  $keyword = '%test%';

  $sql = "SELECT
                   id,
                   title,
                   firstname,
                   lastname,
                   email
               FROM users
               WHERE {$what} LIKE ?";

  if($stmt = $this->db->prepare($sql)) {
    $stmt->bind_param('s', $keyword);

Ansonsten wäre noch die Frage, was im else-Falle dieser Prüfung bei $this->db->error bzw. errno drin steht.
 
Ah ok danke, da lag also der Fehler, na dann hoffe ich mal das dass Binden von Tabellennamen irgendwann noch nachgerüstet wird :). Vielen Dank! :)
 
Zurück