What are the potential pitfalls of creating a separate database class for querying and inserting data?

Potential pitfalls of creating a separate database class for querying and inserting data include increased complexity and maintenance overhead, as well as potential performance issues due to the added abstraction layer. To address these concerns, it is important to carefully design the database class to ensure efficient data access and minimize code duplication.

class Database {
    private $connection;

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

    public function query($sql) {
        return $this->connection->query($sql);
    }

    public function insert($table, $data) {
        $columns = implode(', ', array_keys($data));
        $values = "'" . implode("', '", array_values($data)) . "'";
        $sql = "INSERT INTO $table ($columns) VALUES ($values)";
        return $this->connection->query($sql);
    }
}

// Example usage
$db = new Database('localhost', 'username', 'password', 'database');
$result = $db->query('SELECT * FROM users');
$row = $result->fetch_assoc();

$data = array('name' => 'John Doe', 'email' => 'john.doe@example.com');
$db->insert('users', $data);