Good question. Although the connection code itself is good, some improvements can be made.

A separate config file
---

When your code goes live, most likely database credentials will be different from those at home. Therefore, having them hardcoded in the script will make it extremely inconvenient. Instead, create a separate file for your configuration as follows:

- add the `config.php` line in `.gitignore` (in case you are not using git yet, you definitely should)
- create a file called `config.sample.php` with all variables set to empty values like this:

        return [
            'db' => [
                'host' => '127.0.0.1',
                'username' => '',
                'password' => '',
                'dbname' => '',
                'port' => 3306,
                'charset' => 'utf8mb4',
            ],
            'base_url' => 'http://example.com/',
        ];

- **add** it to the version control
- then in your application bootstrap file have a code like this:

        <?php
        if (!file_exists('config.php'))
        {
            throw new \Exception('Create config.php based on config.sample.php');
        }
        $config = require 'config.php';

        define('BASE_URL', $config['base_url']);

        $options = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $dbconf = $config['db'];
        $dsn = "mysql:host=$dbconf[host];dbname=$dbconf[dbname];charset=$dbconf[charset]";
        try {
                $pdo = new PDO($dsn, $username, $password, $options);
        } catch (PDOException $e) {
            throw new PDOException($e->getMessage(), (int)$e->getCode());
        }
        unset($dbconf, $config['db']);

- then, as suggested, create `config.php` on the every server that your application runs, each with its own set of values.