How can the provided MySQLi class be improved to enhance performance and security in PHP applications?

The provided MySQLi class can be improved by implementing prepared statements to prevent SQL injection attacks and enhance performance by reusing query execution plans. Prepared statements separate SQL logic from user input, making it safer to execute queries. To implement this improvement, you can modify the class to use prepared statements instead of directly embedding user input in SQL queries.

class ImprovedMySQLi extends mysqli {
    public function query($sql, $params = []) {
        $stmt = $this->prepare($sql);
        
        if ($stmt === false) {
            throw new Exception($this->error);
        }
        
        if (!empty($params)) {
            $types = str_repeat('s', count($params));
            $stmt->bind_param($types, ...$params);
        }
        
        $stmt->execute();
        
        $result = $stmt->get_result();
        
        if ($result === false) {
            throw new Exception($stmt->error);
        }
        
        return $result->fetch_all(MYSQLI_ASSOC);
    }
}