What are the differences between using bind_param and direct concatenation for dynamic values in SQL queries in PHP?

Using bind_param in SQL queries in PHP is a safer and more secure way to handle dynamic values compared to direct concatenation. Bind_param helps prevent SQL injection attacks by separating the SQL query structure from the actual data values being inserted. This method also improves performance as the database can prepare the query once and execute it multiple times with different parameter values. Example PHP code snippet using bind_param:

// Establish a database connection
$mysqli = new mysqli("localhost", "username", "password", "database");

// Prepare a SQL statement with a parameter placeholder
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");

// Bind a variable to the parameter placeholder
$username = "john_doe";
$stmt->bind_param("s", $username);

// Execute the statement
$stmt->execute();

// Fetch the results
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Process the results
}

// Close the statement and connection
$stmt->close();
$mysqli->close();