Zusätzlich zu den herkömmlichen Methoden wie fetchAll()
und
insert()
, beschrieben in Zend_Db_Adapter, kann auch ein Statement-Objekt
verwendet werden, um zusätzliche Möglichkeiten beim Ausführen von Abfragen und holen von
Ergebnissätzen zu erhalten. Dieser Abschnitt beschreibt wie eine Instanz eines
Statement-Objekts erzeugt wird, und wie dessen Methoden verwendet werden.
Zend_Db_Statement
basiert auf dem PDOStatement
Objekt aus der PHP Data Objects Erweiterung.
Normalerweise wird ein Statement Objekt von der query()
Methode der Datenbank Adapterklasse zurück gegeben. Diese Methode ist der
grundsätzliche Weg um ein beliebiges SQL Statement vor zu bereiten.
Das erste Argument ist ein String, der das SQL Statement enthält. Das
optionale zweite Argument ist ein Array von Werten, verknüpft mit Parameterplatzhaltern
im SQL String.
Beispiel 213. Erzeugung eines SQL Statement Objekts mit query()
$stmt = $db->query( 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?', array('goofy', 'FIXED') );
Das Statement Objekt entspricht einem SQL Statement welches vorbereitet und einmalig mit angegebenen verknüpften Werten ausgeführt wurde. War das Statement eine SELECT Abfrage, oder irgendein Statement welches ein Ergebnissatz zurück gibt, so ist es nun bereit um Ergebnisse zu holen.
Ein Statement kann ebenfalls mit dem Konstruktor erzeugt werden, auch wenn dies eine weniger typische Nutzung ist. Es existiert jedoch keine factory Methode um das Objekt zu erzeugen, weßhalb die entsprechende Statementklasse geladen, und ihr Konstruktor aufgerufen werden muss. Als erstes Argument muss das Adapterobjekt übergeben werden und als zweites Argument ein String welcher das SQL Statement enthält. Das Statement ist dadurch vorbereitet, jedoch nicht Ausgeführt.
Beispiel 214. Nutzung des SQL Statement Konstruktors
$sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?'; $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
Ein Statement Objekt muss ausgeführt werden wenn es über den Konstruktor erzeugt wurde,
oder kann, wenn es mehrere Male hintereinander ausgeführt werden soll. Dazu wird die
execute()
Methode des Statement Objekts verwendet. Das einzige
Argument ist ein Array von Werten, welche mit Parameterplatzhaltern im Statement
verknüpft werden.
Wenn positionierte Parameter, oder solche, die mit dem Fragezeichen ('?') verwendet werden, muss ein einfaches Array übergeben werden.
Beispiel 215. Ausführen eines Statements mit positionierten Parametern
$sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?'; $stmt = new Zend_Db_Statement_Mysqli($db, $sql); $stmt->execute(array('goofy', 'FIXED'));
Wenn benannte Parameter, oder solche die mit einem String und voranstehenden Doppelpunkt (':') bezeichnet werden, verwendet werden, muss ein assoziatives Array übergeben werden. Die Schlüssel dieses Arrays müssen den Parameternamen entsprechen.
Beispiel 216. Ausführen eines Statements mit benannten Parametern
$sql = 'SELECT * FROM bugs WHERE ' . 'reported_by = :reporter AND bug_status = :status'; $stmt = new Zend_Db_Statement_Mysqli($db, $sql); $stmt->execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));
PDO Statements unterstützen sowohl postionierte als auch benannte
Parameter, jedoch nicht beide Typen in einem einzelnen SQL Statement.
Einige der Zend_Db_Statement
Klassen für nicht-PDO Erweiterungen
könnten nur einen Typ von Parametern unterstützen.
Es können Methoden des Statement Objekts aufgefufen werden um Zeilen von
SQL Statements zu erhalten die Ergebnissätze erzeugen.
SELECT, SHOW, DESCRIBE und
EXPLAIN sind Beispiele von von Statements die Ergebnissätze erzeugen.
INSERT, UPDATE und DELETE sind
Beispiele von Statements die keine Ergebnissätze erzeugen. Letztere
SQL Statements können zwar mit
Zend_Db_Statement
ausgeführt werden, aber Methoden die Zeilen
oder Ergebnisse liefern können bei diesen nicht verwendet werden.
Um eine einzelne Zeile eines Ergebnissatzes aubzurufen kann die
fetch()
Methode des Statement Objekts verwendet werden.
Alle drei Argumente dieser Methode sind optional:
-
Fetch Style ist das erste Argument. Es steuert die Struktur in welcher die Zeile zurück gegeben wird. In diesem Kapitel befindet sich eine Beschreibung der gültigen Werte und der entsprechenden Datenformaten.
-
Cursor Ausrichtung ist das zweite Argument. Standard ist
Zend_Db::FETCH_ORI_NEXT
, was einfach bedeutet das für jeden Aufruf vonfetch()
die nächste Zeile des Ergebnissatzes, in der Reihenfolge des RDBMS, zurück gegeben wird. -
Offset ist das dritte Argument. Wenn die Cursor Ausrichtung
Zend_Db::FETCH_ORI_ABS
ist, dann ist die Offset-Nummer die ordinale Nummer der Zeile die zurück gegeben wird. Wenn die Cursor AusrichtungZend_Db::FETCH_ORI_REL
, dann ist die Offset-Nummer relativ zu der Cursorposition bevorfetch()
aufgerufen wurde.
fetch()
gibt FALSE
zurück wenn alle
Zeilen des Ergbnissatzes geholt wurden.
Beispiel 217. Nutzung fetch() in einer Schleife
$stmt = $db->query('SELECT * FROM bugs'); while ($row = $stmt->fetch()) { echo $row['bug_description']; }
Weitere Informationen unter PDOStatement::fetch().
Um alle Zeilen eines Ergebnissatzes in einem Schritt abzurufen wird die
fetchAll()
Methode verwendet. Dies ist gleichbedeutend mit
dem Aufruf der fetch()
Methode in einer Schleife und dem
Speichern der Rückgabewerte in einem Array. Die fetchAll()
Methode akzeptiert zwei Argumente. Das Erste ist der Fetch Style, wie oben
beschrieben, und das Zweite gibt die Nummer der zurück zu gebenden Spalte an, wenn
der Fetch Style Zend_Db::FETCH_COLUMN
ist.
Beispiel 218. Nutzung von fetchAll()
$stmt = $db->query('SELECT * FROM bugs'); $rows = $stmt->fetchAll(); echo $rows[0]['bug_description'];
Weitere Informationen unter PDOStatement::fetchAll().
Standardmäßig gibt das Statement Objekt Zeilen des Ergebnissatzes als assoziatives
Array, mapping column names to column values, zurück. Ein anderes Format für die
Datenrückgabe der Statementklasse kann genau wie bei der Adapterklasse angegeben
werden. Die setFetchMode()
Methode des Statement Objekts
wird verwendet um den Fetch-Modus anzugeben. Dazu werden die
Zend_Db
Klassen Konstanten FETCH_ASSOC
,
FETCH_NUM
, FETCH_BOTH
,
FETCH_COLUMN
und FETCH_OBJ
verwendet.
Weiter Informationen über diese Modi gibt es in diesem Kapitel. Nachfolgende
Aufrufe der Statement Methoden fetch()
und
fetchAll()
benutzen den neu gesetzten Fetch-Modus.
Beispiel 219. Ändern des Fetch-Modus
$stmt = $db->query('SELECT * FROM bugs'); $stmt->setFetchMode(Zend_Db::FETCH_NUM); $rows = $stmt->fetchAll(); echo $rows[0][0];
Weitere Informationen unter PDOStatement::setFetchMode().
fetchColumn()
wird verwendet mm eine einzelne Spalte eines
Ergebnissatzes zurück zu geben. Das optionale Argument ist der Integer Index der
Spalte die zurück gegeben werden soll. Der Standardwert ist 0. Diese Methode gibt
einen scalaren Wert zurück, oder FALSE
wenn alle Zeilen des
Ergebnissatzes bereits geholt wurden.
Zu beachten ist, dass diese Methode anders als die
fetchCol()
Methode der Adapterklasse arbeitet. Die
fetchColumn()
Methode der Statementklasse gibt einen
einzelnen Wert einer Zeile zurück. Die fetchCol()
Methode
der Adapterklasse hingegen gibt ein Array von Werten der ersten Spalte aller Zeilen
eines Ergebnissatzes zurück.
Beispiel 220. Nutzung von fetchColumn()
$stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs'); $bug_status = $stmt->fetchColumn(2);
Weitere Informationen unter PDOStatement::fetchColumn().
Um eine Zeile eines Ergebnissatzes zu holen, die wie ein Objekt strukturiert ist,
wird die fetchObject()
Methode verwendet. Diese Methode
nimmt zwei optionale Argumente entgegen. Das erste Argument ist ein String der den
Klassenname des zurück zu gebenden Objekts enthält, standard ist 'stdClass'. Das
zweite Argument ist ein Array von Werten, die an den Konstruktor des Objekts
übergeben werden.
Beispiel 221. Nutzung von fetchObject()
$stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs'); $obj = $stmt->fetchObject(); echo $obj->bug_description;
Weitere Informationen unter PDOStatement::fetchObject().