Signatur
Beschreibung
fbird_prepare() kompiliert eine SQL-Abfrage auf dem Firebird/InterBase-Datenbankserver, ohne sie sofort auszuführen. Das Ergebnis ist ein Statement-Handle (Resource), das anschließend mit fbird_execute() beliebig oft ausgeführt werden kann.
Der große Vorteil dieser Technik liegt in der Performance: Soll dieselbe Abfrage mit unterschiedlichen Parametern wiederholt ausgeführt werden, muss der Server die Abfrage nur einmal parsen und optimieren. Außerdem erleichtert Prepared Statements die sichere Übergabe von Parametern, da Werte als Platzhalter (?) übergeben und beim Ausführen gebunden werden, was SQL-Injection verhindert.
Die Funktion gehört zur Firebird/InterBase-Erweiterung und ist ein Alias bzw. Äquivalent zu ibase_prepare(). Mit PHP 8.0 wurde die ibase-Erweiterung aus dem PHP-Core entfernt und wird seither als eigenständige PECL-Erweiterung (ibase oder firebird) gepflegt.
- Platzhalter in der Abfrage werden durch
?dargestellt. - Das zurückgegebene Handle wird direkt an
fbird_execute()übergeben. - Nicht mehr benötigte Statements sollten mit
fbird_free_query()freigegeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $link_identifier Pflicht | resource | Eine aktive Firebird/InterBase-Datenbankverbindung, die z. B. mit fbird_connect() oder fbird_pconnect() geöffnet wurde. |
|
| $query Pflicht | string | Die SQL-Abfrage, die vorbereitet werden soll. Parameter-Platzhalter werden als ? angegeben. |
Rückgabewert
fbird_execute()-Aufrufe verwendet wird. Im Fehlerfall wird false zurückgegeben.Beispiele
Einfaches Prepared Statement mit Parametern
<?php
$dbh = fbird_connect('localhost:mydb', 'sysdba', 'masterkey');
// Abfrage vorbereiten – ? ist der Platzhalter für den Benutzernamen
$stmt = fbird_prepare($dbh, 'SELECT id, email FROM users WHERE username = ?');
if ($stmt === false) {
die('Fehler beim Vorbereiten der Abfrage: ' . fbird_errmsg());
}
// Abfrage mit konkretem Wert ausführen
$result = fbird_execute($stmt, 'alice');
while ($row = fbird_fetch_assoc($result)) {
echo 'ID: ' . $row['ID'] . ', E-Mail: ' . $row['EMAIL'] . PHP_EOL;
}
// Statement freigeben
fbird_free_query($stmt);
fbird_close($dbh);
Wiederholte Ausführung desselben Statements (INSERT-Schleife)
<?php
$dbh = fbird_connect('localhost:mydb', 'sysdba', 'masterkey');
$stmt = fbird_prepare($dbh, 'INSERT INTO log (user_id, action, logged_at) VALUES (?, ?, CURRENT_TIMESTAMP)');
if ($stmt === false) {
die('Vorbereitung fehlgeschlagen: ' . fbird_errmsg());
}
$entries = [
[1, 'login'],
[2, 'view_report'],
[1, 'logout'],
];
foreach ($entries as [$userId, $action]) {
// Dasselbe Statement mehrfach mit unterschiedlichen Werten ausführen
if (fbird_execute($stmt, $userId, $action) === false) {
echo 'Fehler: ' . fbird_errmsg() . PHP_EOL;
}
}
fbird_commit($dbh);
fbird_free_query($stmt);
fbird_close($dbh);
echo 'Alle Log-Einträge gespeichert.';
// Wichtig · Fallstricke
Sicherheit: Durch die Verwendung von ?-Platzhaltern und fbird_execute() werden Parameterwerte sauber vom SQL-Befehl getrennt. Das schützt zuverlässig vor SQL-Injection – Werte dürfen niemals direkt per String-Konkatenation in die Abfrage eingebaut werden.
PHP 8.0+: Die ibase/fbird-Erweiterung ist seit PHP 8.0 nicht mehr im offiziellen PHP-Core enthalten und muss als PECL-Erweiterung installiert werden. Prüfen Sie mit extension_loaded('interbase') oder extension_loaded('ibase') die Verfügbarkeit.
Ressourcen freigeben: Statement-Handles belegen serverseitige Ressourcen. Verwenden Sie nach Gebrauch stets fbird_free_query(), insbesondere in Schleifen oder lang laufenden Skripten.