Einführung - Prepare & Execute

Einführung - Prepare & Execute – Vorbereitung und Ausführung von SQL-Anweisungen

Description

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.

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($sth1);
$db->execute($sth8);
?>

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.

ExecuteMultiple

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:

  • 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

Daten aus einer Abfrage verarbeiten (Previous) Automatische Vorbereitung und Ausführung von SQL-Anweisungen (Next)
Last updated: Sun, 19 Dec 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.