What is the best practice for storing session values in a database in PHP?

When storing session values in a database in PHP, it is best practice to use a secure and efficient method to ensure data integrity and prevent security vulnerabilities. One common approach is to use a custom session handler to store session data in a database table, allowing for easy retrieval and manipulation of session values.

<?php
// Custom session handler to store session values in a database
function custom_session_open($save_path, $session_name) {
    // Database connection
    $db = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');
    return true;
}

function custom_session_close() {
    // Close database connection
    return true;
}

function custom_session_read($session_id) {
    // Retrieve session data from database
    $stmt = $db->prepare("SELECT data FROM sessions WHERE session_id = :session_id");
    $stmt->bindParam(':session_id', $session_id);
    $stmt->execute();
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    return $result['data'];
}

function custom_session_write($session_id, $session_data) {
    // Store session data in database
    $stmt = $db->prepare("REPLACE INTO sessions (session_id, data) VALUES (:session_id, :session_data)");
    $stmt->bindParam(':session_id', $session_id);
    $stmt->bindParam(':session_data', $session_data);
    $stmt->execute();
    return true;
}

function custom_session_destroy($session_id) {
    // Remove session data from database
    $stmt = $db->prepare("DELETE FROM sessions WHERE session_id = :session_id");
    $stmt->bindParam(':session_id', $session_id);
    $stmt->execute();
    return true;
}

function custom_session_gc($max_lifetime) {
    // Clean up old session data from database
    $stmt = $db->prepare("DELETE FROM sessions WHERE last_accessed < :max_lifetime");
    $stmt->bindParam(':max_lifetime', time() - $max_lifetime);
    $stmt->execute();
    return true;
}

// Set custom session handlers
session_set_save_handler('custom_session_open', 'custom_session_close', 'custom_session_read', 'custom_session_write', 'custom_session_destroy', 'custom_session_gc');

// Start the session
session_start();
?>