Start · Sprachen · PHP · Referenz · fbird_prepare

fbird_prepare

Funktion

Bereitet eine SQL-Abfrage für die Ausführung gegen eine Firebird/InterBase-Datenbank vor und gibt ein Statement-Handle zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

fbird_prepare(resource $link_identifier, string $query): resource|false

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

Typ
resource|false
Beschreibung
Bei Erfolg ein Statement-Handle (Resource), das für spätere 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);
ID: 42, E-Mail: alice@example.com

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.';
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.