Die prepare()- und execute*()-Methoden verbessern die Flexibilität von Anweisungen. Der prepare/execute-Mechanismus ist hilfreich, wenn eine Abfrage mehrmals mit jeweils verschiedenen Werten ausgeführt werden muss, wie z.B. eine Liste von Adressen Datenbank einzufügen.
Eine andere sinnvolle Nutzung ist die Möglichkeit mehrere Datenbanken mit abweichenden SQL-Syntaxen besser zu handhaben. Wir nehmen an, dass zwei Datenbanken einen unterschiedlichen INSERT-Syntax aufweisen:
Genauso wie bei mehrsprachigen Anwendungen, können wir einen Array schreiben, dass die verschiedenen Formen aufnimmt:
<?php
$statement['db1']['INSERT_PERSON'] = 'INSERT INTO person
(surname, name, age) VALUES (?, ?, ?)';
$statement['db2']['INSERT_PERSON'] = 'INSERT INTO person
SET surname=?, name=?, age=?';
?>
Um diese Funktion nutzen können, müssen Sie zwei Schritte tun. Der erste Schritt ist die Abfrage zu präparieren (prepare), der zweite Schritt sie auszuführen (execute).
Sie beginnen damit eine generische Abfrage zu formulieren. Um eine generische Abfrage zu erhalten, schreiben Sie ihre Abfrage wie üblich:
SELECT surname, name, age FROM person WHERE name = 'name_to_find' AND age < age_limit
Als nächstes setzten Sie "Platzhalter" für die Werte, die erst zur Laufzeit gesetzt werden:
SELECT surname, name, age FROM person WHERE name = ? AND age < ?
Diese generische Abfrage übergeben Sie der prepare()-Methode. Diese liefert ein Handle auf die präparierte Abfrage zurück. Dieses Handle übergeben Sie dann der execute()-Methode.
prepare() kann mit verschiedenen Platzhaltern umgehen:
Sollen die Platzhalterzeichen als normale Zeichen verwendet werden, danm müssen Sie einen rückwärtigen Schrägsstrich vor das Zeichen setzen.
UPDATE foo SET col=? WHERE col='over \& under'
Nach der Vorbereitung der Abfrage können Sie diese ausführen. Das bedeutet, die präparierte Abfrage mit Daten zu füllen. Deshalb erwartet die execute()-Methode zwei Argumente: Das Handle auf die präparierte Abfrage von prepare() und einen Skalar oder Array mit den zuzuweisenden Werten.
Skalare Werte an execute() übergeben
<?php
// Once you have a valid DB object named $db...
$sth = $db->prepare('INSERT INTO numbers (number) VALUES (?)');
$db->execute($sth, 1);
$db->execute($sth, 8);
?>
Wenn eine präparierte Abfrage mehrere Platzhalter enthält, müssen Sie ein Array an execute() übergeben. Der erste Eintrag im Array steht für den ersten Platzhalter, der zweite Eintrag für den zweiten Platzhalter usw. Die Ordnung wird durch die Art der Platzhalter nicht beeinflußt.
Übergabe eines Arrays an execute()
<?php
// Once you have a valid DB object named $db...
$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');
$data = array(1, 'one', 'en');
$db->execute($sth, $data);
?>
Die übergebene Werte müssen Literale sein. Übergebene Sie keine SQL-Funktionen, wie z.B. CURDATE(). SQL-Funktionen, die zur Laufzeit aufgerufen werden sollen, müssen sich in der zu präparierenden Anfrage befinden.
PEAR::DB kann mehrere Abfrage auf einmal ausführen. Bislang müssten Sie die Methode manuell mehrmals aufzurufen, wie hier:
Übergabe per Array an execute()
<?php
// Once you have a valid DB object named $db...
$alldata = array(array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');
foreach ($alldata as $row) {
$db->execute($sth, $row);
}
?>
Das führt zu vier Abfragen:
INSERT INTO numbers VALUES ('1', 'one', 'en') INSERT INTO numbers VALUES ('2', 'two', 'to') INSERT INTO numbers VALUES ('3', 'three', 'tre') INSERT INTO numbers VALUES ('4', 'four', 'fire')
Mit executeMultiple() benötigen wir keine foreach-Schleife wir im obigen Beispiel:
executeMultiple() anstatt von execute()
<?php
// Once you have a valid DB object named $db...
$alldata = array(array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');
$db->executeMultiple($sth, $alldata);
?>
Das Ergebnis ist das selbe. Wenn eine Abfrage fehlschlägt, werden die übriggebliebenen Abfragen nicht ausgeführt.
Die execute*()-Methoden liefern drei mögliche Werte zurück: