What are best practices for handling errors and exceptions when working with PHP and databases?

When working with PHP and databases, it is important to handle errors and exceptions properly to ensure the stability and security of your application. One best practice is to use try-catch blocks to catch any exceptions that may occur during database operations and handle them gracefully, such as logging the error message or displaying a user-friendly error message.

try {
    // Database connection code
    $pdo = new PDO("mysql:host=localhost;dbname=mydatabase", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Database query code
    $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
    $stmt->bindParam(':id', $userId);
    $stmt->execute();

    // Fetching data
    $user = $stmt->fetch();
    
    // Closing connection
    $pdo = null;
} catch (PDOException $e) {
    // Handle the exception
    echo "An error occurred: " . $e->getMessage();
}