PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; try { // Create a new database and user if they don't exist. // This is for demonstration purposes to make setup easier. // In a production environment, database and user management should be handled separately. $rootPdo = new PDO('mysql:host=' . DB_HOST, 'root', ''); $rootPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $rootPdo->exec('CREATE DATABASE IF NOT EXISTS ' . DB_NAME); $rootPdo->exec("CREATE USER IF NOT EXISTS '" . DB_USER . "'@'localhost' IDENTIFIED BY '" . DB_PASS . "'"); $rootPdo->exec('GRANT ALL PRIVILEGES ON ' . DB_NAME . '.* TO '' . DB_USER . ''@'localhost''); $rootPdo = null; $pdo = new PDO($dsn, DB_USER, DB_PASS, $options); return $pdo; } catch (PDOException $e) { // In a real app, you would log this error and show a generic error page. // For development, it's useful to see the error. error_log('Database Connection Error: ' . $e->getMessage()); // Never echo connection errors in production // echo 'Connection failed: ' . $e->getMessage(); return null; } }