Sobes.tech
Junior

Wat zijn prepared queries?

sobes.tech AI

Antwoord van AI

Dit is een manier om de veiligheid en prestaties te verhogen bij het werken met databases, waarbij de SQL-query sjabloon apart wordt verzonden naar de database server, los van de gegevens zelf.

Voordelen:

  • Bescherming tegen SQL-injecties: De gegevens worden door de database server behandeld als literals, niet als onderdeel van de SQL-code.
  • Prestaties: De database server cachet het uitvoeringsplan van de query, wat tijd bespaart bij herhaald uitvoeren van dezelfde query met verschillende parameters.
  • Gemak: Ze maken het structureren van code mogelijk en vergemakkelijken debugging.

Stappen voor het uitvoeren van een voorbereide query:

  1. Voorbereiding (Prepare): Het query sjabloon wordt naar de database server gestuurd voor analyse, syntaxiscontrole en het opstellen van het uitvoeringsplan. Het sjabloon gebruikt placeholders om de plaatsen aan te geven waar data wordt ingevuld.
  2. Binding (Bind): De variabelenwaarden worden gekoppeld aan de placeholders. De server interpreteert ze niet als SQL-code.
  3. Uitvoering (Execute): De query wordt uitgevoerd met de gekoppelde waarden.

Voorbeeld van het gebruik van een voorbereide query in PHP met PDO:

// Verbinding maken met de database (voorbeeld)
$dsn = 'mysql:host=localhost;dbname=mijnDatabase';
$user = 'mijngebruiker';
$password = 'mijnwachtwoord';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Verbindingsfout: ' . $e->getMessage());
}

// Voorbereiden van de query met placeholders
$stmt = $pdo->prepare("SELECT naam, email FROM gebruikers WHERE id = :id");

// Koppelen van de waarde aan de placeholder
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);

// Uitvoeren van de query
$stmt->execute();

// Resultaten ophalen
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Gebruikersnaam: " . htmlspecialchars($user['naam']) . "<br>";
    echo "Gebruiker email: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Gebruiker met ID " . htmlspecialchars($userId) . " niet gevonden.";
}

In dit voorbeeld is :id een benoemde placeholder. Positieve placeholders (?) kunnen ook worden gebruikt.

// Voorbereiden van de query met positionele placeholder
$stmt = $pdo->prepare("SELECT naam, email FROM gebruikers WHERE id = ?");

// Uitvoeren van de query met een array van waarden
$userId = 2;
$stmt->execute([$userId]);

// Resultaten ophalen
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Gebruikersnaam: " . htmlspecialchars($user['naam']) . "<br>";
    echo "Gebruiker email: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Gebruiker met ID " . htmlspecialchars($userId) . " niet gevonden.";
}
?>