Start · Sprachen · PHP · Referenz · ibase_prepare

ibase_prepare

Funktion

Bereitet eine SQL-Abfrage für eine Firebird/InterBase-Datenbankverbindung vor, um Parameter-Platzhalter später zu binden und die Abfrage effizient auszuführen.

seit PHP 5.0.0 Kategorie: db

Signatur

ibase_prepare(resource $link_identifier = null, string $query): resource|false

Beschreibung

ibase_prepare() kompiliert eine SQL-Abfrage auf dem Datenbankserver und gibt ein sogenanntes Prepared-Statement-Handle (eine Ressource) zurück. Dieses Handle kann anschließend mit ibase_execute() mehrfach ausgeführt werden, ohne dass die Abfrage jedes Mal neu geparst werden muss – was insbesondere bei wiederholten Abfragen mit unterschiedlichen Parametern die Performance erheblich steigert.

Platzhalter für Parameter werden als Fragezeichen (?) in der SQL-Anweisung angegeben. Die tatsächlichen Werte werden erst beim Aufruf von ibase_execute() übergeben. Diese Trennung von SQL-Struktur und Daten ist ein wichtiger Sicherheitsmechanismus gegen SQL-Injection-Angriffe.

Die Funktion kann wahlweise mit oder ohne explizite Datenbankverbindung aufgerufen werden. Wird kein $link_identifier übergeben, verwendet PHP die zuletzt geöffnete Verbindung. Nach der Verwendung sollte die Ressource mit ibase_free_query() freigegeben werden, um Serverressourcen zu schonen.

Hinweis: Die ibase_*-Funktionsfamilie ist seit PHP 7.4 aus dem PHP-Core in die PECL-Erweiterung ibase ausgelagert worden und wird ab PHP 8.0 nicht mehr nativ mitgeliefert. Für neue Projekte sollte die Firebird/InterBase PDO-Erweiterung bevorzugt werden.

Parameter

Name Typ Default Beschreibung
$link_identifier resource null Eine Datenbankverbindungsressource, die mit ibase_connect() oder ibase_pconnect() erzeugt wurde. Wird der Parameter weggelassen, wird die zuletzt geöffnete Verbindung verwendet.
$query Pflicht string Die SQL-Anweisung, die vorbereitet werden soll. Platzhalter für Parameter werden als ? angegeben, z. B. SELECT * FROM users WHERE id = ?.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt im Erfolgsfall eine Ressource zurück, die das vorbereitete Statement repräsentiert und an ibase_execute() übergeben werden kann. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfaches Prepared Statement mit Parameter

<?php
$dbh = ibase_connect('localhost:employee.fdb', 'sysdba', 'masterkey');

// SQL-Abfrage mit Platzhalter vorbereiten
$stmt = ibase_prepare($dbh, 'SELECT first_name, last_name FROM employee WHERE emp_no = ?');

if ($stmt === false) {
    die('Fehler beim Vorbereiten der Abfrage: ' . ibase_errmsg());
}

// Statement mit einem konkreten Parameter ausführen
$result = ibase_execute($stmt, 42);

while ($row = ibase_fetch_object($result)) {
    echo $row->FIRST_NAME . ' ' . $row->LAST_NAME . PHP_EOL;
}

// Ressourcen freigeben
ibase_free_result($result);
ibase_free_query($stmt);
ibase_close($dbh);
?>
John Doe

Mehrfache Ausführung mit verschiedenen Parametern

<?php
$dbh = ibase_connect('localhost:mydb.fdb', 'sysdba', 'masterkey');

// INSERT-Statement einmalig vorbereiten
$stmt = ibase_prepare($dbh, 'INSERT INTO products (name, price) VALUES (?, ?)');

if ($stmt === false) {
    die('Vorbereitung fehlgeschlagen: ' . ibase_errmsg());
}

$products = [
    ['Apfel',  0.89],
    ['Banane', 0.49],
    ['Kirsche', 1.29],
];

// Dasselbe Statement mehrfach mit unterschiedlichen Werten ausführen
foreach ($products as [$name, $price]) {
    if (ibase_execute($stmt, $name, $price) === false) {
        echo 'Fehler beim Einfügen von ' . htmlspecialchars($name) . ': ' . ibase_errmsg() . PHP_EOL;
    } else {
        echo 'Eingefügt: ' . htmlspecialchars($name) . PHP_EOL;
    }
}

ibase_free_query($stmt);
ibase_close($dbh);
?>
Eingefügt: Apfel Eingefügt: Banane Eingefügt: Kirsche

// Wichtig · Fallstricke

Sicherheit: Durch die Verwendung von Prepared Statements mit Platzhaltern (?) werden Benutzereingaben niemals direkt in die SQL-Anweisung eingebettet, was SQL-Injection-Angriffe zuverlässig verhindert. Niemals Benutzerdaten per String-Konkatenation in SQL-Abfragen einfügen.

Deprecation / Verfügbarkeit: Die gesamte ibase_*-Erweiterung wurde in PHP 7.4 als deprecated markiert und ab PHP 8.0 aus dem offiziellen PHP-Core entfernt. Sie steht nur noch als PECL-Paket ibase zur Verfügung. Für neue Projekte wird die Verwendung von PDO mit dem Firebird-Treiber (PDO_Firebird) dringend empfohlen.

Ressourcen-Management: Nicht freigegebene Prepared Statements belegen Ressourcen auf dem Datenbankserver. Nach Abschluss der Nutzung immer ibase_free_query() aufrufen.