PEAR-Handbuch | ||
---|---|---|
Zurück | Nach vorne |
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 |
$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 |
SELECT surname, name, age FROM person WHERE name = ? AND age < ? |
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' |
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.
Beispiel 34-1. Skalare Werte an execute() übergeben
|
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.
Beispiel 34-2. Übergabe eines Arrays an execute()
|
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. |
PEAR::DB kann mehrere Abfrage auf einmal ausführen. Bislang müssten Sie die Methode manuell mehrmals aufzurufen, wie hier:
Beispiel 34-3. Übergabe per Array an execute()
|
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') |
Beispiel 34-4. executeMultiple() anstatt von execute()
|
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:
Zurück | Zum Anfang | Nach vorne |
Einführung - Ergebnismengen | Nach oben | Einführung - autoPrepare & autoExecute |