Beschreibung
Zweck
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:
db1: INSERT INTO tbl_name (col1, col2) VALUES (expr1, expr2)
db2: INSERT INTO tbl_name SET col1=expr1, col2=expr2 |
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=?';
?>
|
Prepare
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:
|
? - (empfohlen) steht für einen skalaren Wert wie Zahlen
oder Zeichenketten. Der Wert wird automatisch mit Escape-Zeichen versehen und
korrekt mit Anführungsstrichen versehen, abhängig von dem Anforderungen
des benutzen DBMS.
|
|
! - steht für einen skalaren Wert. Dieser
Wert wird übernommen „wie er ist“.
|
|
& - erfordert den Namen und Pfad einer
existierenden Datei. Der Inhalt der Datei wird in die Abfrage eingefügt.
Damit können z.B. Binärdaten wie in einer Grafikdatei eingefügt werden.
|
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' |
Execute
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.
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.
| Warnung |
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.
|
ExecuteMultiple
PEAR::DB kann mehrere Abfrage auf einmal ausführen. Bislang müssten
Sie die Methode manuell mehrmals aufzurufen, wie hier:
Beispiel 39-3. Ü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:
Beispiel 39-4.
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:
ein neues DB_result-Objekt für Abfragen, die eine Ergebnismenge liefern, wie
SELECT
DB_OK für Abfragen, die Datensätze manipulieren, wie
INSERT
oder ein DB_Error-Objekt bei einem Fehler