What are the best practices for rewriting a PHP class to utilize mysqli or PDO for improved functionality and security?

When rewriting a PHP class to utilize mysqli or PDO for improved functionality and security, it is important to use prepared statements to prevent SQL injection attacks and to properly handle errors. Additionally, using parameterized queries can help improve performance by reducing the need for repetitive query parsing.

// Using mysqli for improved functionality and security
class Database {
    private $conn;

    public function __construct($host, $username, $password, $database) {
        $this->conn = new mysqli($host, $username, $password, $database);
        if ($this->conn->connect_error) {
            die("Connection failed: " . $this->conn->connect_error);
        }
    }

    public function getUsers() {
        $stmt = $this->conn->prepare("SELECT * FROM users");
        $stmt->execute();
        $result = $stmt->get_result();
        $users = $result->fetch_all(MYSQLI_ASSOC);
        $stmt->close();
        return $users;
    }
}
```

```php
// Using PDO for improved functionality and security
class Database {
    private $conn;

    public function __construct($host, $username, $password, $database) {
        $dsn = "mysql:host=$host;dbname=$database";
        $this->conn = new PDO($dsn, $username, $password);
        $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public function getUsers() {
        $stmt = $this->conn->prepare("SELECT * FROM users");
        $stmt->execute();
        $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return $users;
    }
}