Signatur
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
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);
?>
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);
?>
// 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.