Проблемы с PDO в ООП, что делать?
Потому что это бессмысленный "ООП". PDO - это уже класс, и добавлять к нему бессмысленный Database нет ни малейшей причины. Тем более зачем-то называя переменную mysqli, делая код не только бессмысмленным, но и запутанным.
Свой класс надо писать, когда он что-то добавляет к существующему.
Решение: class Database {
  private $mysqli;

  public function __construct(){
    $dsn = "mysql:host=localhost;dbname=banan165_database";
    $this->mysqli = new PDO($dsn, "root", "");
  }
  public function query($sql){
   return $this->mysqli->query($sql);
  }
}

$db = new Database();
$db->query("INSERT INTO categories(name) VALUES('PDO')");
Но если правильно - так не делается.