|
|
@@ -10,12 +10,14 @@
|
|
|
<title>Einführung</title>
|
|
|
|
|
|
<para>
|
|
|
- Wenn eine Datenbankabfrage über eine Tabellenklasse ausgeführt wird, genauer über deren Methoden
|
|
|
- <code>find()</code> und <code>fetchAll()</code>, wird das Ergebnis als Objekt vom Typ
|
|
|
- <classname>Zend_Db_Table_Rowset_Abstract</classname> zurückgegeben. Ein Zeilensatz enthält eine Sammlung von
|
|
|
- <classname>Zend_Db_Table_Row_Abstract</classname>-Objekten. Das Zeilensatz-Objekt implementiert das
|
|
|
- <code>Iterator</code>-Interface, sodass es auch einfach via <code>foreach</code> durchgegangen
|
|
|
- werden kann und Lese- und Schreibzugriff auf die einzelnen Zeilen möglich ist.
|
|
|
+ Wenn eine Datenbankabfrage über eine Tabellenklasse ausgeführt wird, genauer über deren
|
|
|
+ Methoden <code>find()</code> und <code>fetchAll()</code>, wird das Ergebnis als Objekt
|
|
|
+ vom Typ <classname>Zend_Db_Table_Rowset_Abstract</classname> zurückgegeben. Ein
|
|
|
+ Zeilensatz enthält eine Sammlung von
|
|
|
+ <classname>Zend_Db_Table_Row_Abstract</classname>-Objekten. Das Zeilensatz-Objekt
|
|
|
+ implementiert das <code>Iterator</code>-Interface, sodass es auch einfach via
|
|
|
+ <code>foreach</code> durchgegangen werden kann und Lese- und Schreibzugriff auf die
|
|
|
+ einzelnen Zeilen möglich ist.
|
|
|
</para>
|
|
|
|
|
|
</sect2>
|
|
|
@@ -25,8 +27,9 @@
|
|
|
<title>Einen Zeilensatz lesen</title>
|
|
|
|
|
|
<para>
|
|
|
- <classname>Zend_Db_Table_Abstract</classname> bietet die Methoden <code>find()</code> und <code>fetchAll()</code>,
|
|
|
- die beide ein Objekt vom Typ <classname>Zend_Db_Table_Rowset_Abstract</classname> zurückgeben.
|
|
|
+ <classname>Zend_Db_Table_Abstract</classname> bietet die Methoden <code>find()</code>
|
|
|
+ und <code>fetchAll()</code>, die beide ein Objekt vom Typ
|
|
|
+ <classname>Zend_Db_Table_Rowset_Abstract</classname> zurückgeben.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.fetch.example">
|
|
|
@@ -47,16 +50,17 @@ $rowset = $bugs->fetchAll("bug_status = 'NEW'");
|
|
|
<title>Zeilen aus einem Zeilensatz auslesen</title>
|
|
|
|
|
|
<para>
|
|
|
- Der Zeilensatz selber ist normalerweise weniger interessant als die Zeilen, die er enthält.
|
|
|
- Dieser Abschnitt zeigt, wie die Zeilen, die im Zeilensatz enthalten sind, auslesbar sind.
|
|
|
+ Der Zeilensatz selber ist normalerweise weniger interessant als die Zeilen, die er
|
|
|
+ enthält. Dieser Abschnitt zeigt, wie die Zeilen, die im Zeilensatz enthalten sind,
|
|
|
+ auslesbar sind.
|
|
|
</para>
|
|
|
|
|
|
<para>
|
|
|
- Eine normale Abfrage gibt null Zeilen zurück, wenn keine Zeilen in der Datenbank die Bedingungen der
|
|
|
- Abfrage erfüllt. Daher kann eine Zeilensatz-Objekt auch null Zeilenobjekte enthalten.
|
|
|
- Weil <classname>Zend_Db_Table_Rowset_Abstract</classname> auch das Interface <code>Countable</code>
|
|
|
- (dt.: Zählbar) implementiert, kann die Funktion count() genutzt werden, um die Anzahl der Zeilen im
|
|
|
- Zeilensatz zu erhalten.
|
|
|
+ Eine normale Abfrage gibt null Zeilen zurück, wenn keine Zeilen in der Datenbank die
|
|
|
+ Bedingungen der Abfrage erfüllt. Daher kann eine Zeilensatz-Objekt auch null
|
|
|
+ Zeilenobjekte enthalten. Weil <classname>Zend_Db_Table_Rowset_Abstract</classname> auch
|
|
|
+ das Interface <code>Countable</code> (dt.: Zählbar) implementiert, kann die Funktion
|
|
|
+ count() genutzt werden, um die Anzahl der Zeilen im Zeilensatz zu erhalten.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.rows.counting.example">
|
|
|
@@ -83,8 +87,8 @@ if ($rowCount > 0) {
|
|
|
|
|
|
<para>
|
|
|
Die einfachste Art, eine Zeile aus einem Zeilensatz auszulesen, ist die Methode
|
|
|
- <code>current()</code>. Diese ist vor allem dann nützlich, wenn der Zeilensatz genau eine Zeile
|
|
|
- enthält.
|
|
|
+ <code>current()</code>. Diese ist vor allem dann nützlich, wenn der Zeilensatz genau
|
|
|
+ eine Zeile enthält.
|
|
|
</para>
|
|
|
|
|
|
<programlisting role="php"><![CDATA[
|
|
|
@@ -96,7 +100,8 @@ $row = $rowset->current();
|
|
|
</example>
|
|
|
|
|
|
<para>
|
|
|
- Wenn der Zeilensatz keine Zeilen enthält, gibt <code>current()</code> den Wert <code>null</code> zurück.
|
|
|
+ Wenn der Zeilensatz keine Zeilen enthält, gibt <code>current()</code> den Wert
|
|
|
+ <code>null</code> zurück.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.rows.iterate.example">
|
|
|
@@ -107,8 +112,9 @@ $row = $rowset->current();
|
|
|
Objekte, die von <classname>Zend_Db_Table_Rowset_Abstract</classname> abstammen,
|
|
|
implementieren das <code>SeekableIterator</code> Interface, was bedeutet, dass es
|
|
|
mit <code>foreach</code> durchlaufen werden kann. Jeder Wert, der auf diesem Weg
|
|
|
- zurückgegeben wird, ist ein <classname>Zend_Db_Table_Row_Abstract</classname>-Objekt, das zu
|
|
|
- einem Eintrag in der Tabelle gehört.
|
|
|
+ zurückgegeben wird, ist ein
|
|
|
+ <classname>Zend_Db_Table_Row_Abstract</classname>-Objekt, das zu einem Eintrag in
|
|
|
+ der Tabelle gehört.
|
|
|
</para>
|
|
|
|
|
|
<programlisting role="php"><![CDATA[
|
|
|
@@ -176,8 +182,8 @@ $row9->save();
|
|
|
ist ein Integer für die gewünschte Position. Der zweite optionale Parameter ist ein
|
|
|
Boolean; Es teilt dem Rowset Iterator mit ob er zur gleichen Zeit diese Position
|
|
|
suchen muss, oder nicht (standard ist nicht). Diese Methode gibt standardmäßig ein
|
|
|
- <classname>Zend_Db_Table_Row</classname> Objekt zurück. Wenn die angefragte Position nicht existiert wird
|
|
|
- eine Ausnahme geworfen. Hier ist ein Beispiel:
|
|
|
+ <classname>Zend_Db_Table_Row</classname> Objekt zurück. Wenn die angefragte Position
|
|
|
+ nicht existiert wird eine Ausnahme geworfen. Hier ist ein Beispiel:
|
|
|
</para>
|
|
|
|
|
|
<programlisting role="php"><![CDATA[
|
|
|
@@ -195,8 +201,8 @@ $row9->save();
|
|
|
]]></programlisting>
|
|
|
|
|
|
<para>
|
|
|
- Sobald der Zugriff auf ein Zeilenobjekt besteht, kann dieses mit den Methoden manipuliert werden,
|
|
|
- die in <xref linkend="zend.db.table.row" /> beschrieben werden.
|
|
|
+ Sobald der Zugriff auf ein Zeilenobjekt besteht, kann dieses mit den Methoden
|
|
|
+ manipuliert werden, die in <xref linkend="zend.db.table.row" /> beschrieben werden.
|
|
|
</para>
|
|
|
|
|
|
</sect2>
|
|
|
@@ -206,10 +212,10 @@ $row9->save();
|
|
|
<title>Einen Zeilensatz als Array lesen</title>
|
|
|
|
|
|
<para>
|
|
|
- Auf die gesamten Daten in einem Zeilensatz kann mithilfe der Methode <code>toArray()</code> des
|
|
|
- Zeilensatz-Objekts auch als Array zugegriffen werden. Diese Methode gibt ein Array mit einem Eintrag
|
|
|
- je Zeile zurück. Jeder dieser Einträge ist ein assoziatives Array mit Spaltennamen als Schlüsseln und
|
|
|
- deren Daten als Werten.
|
|
|
+ Auf die gesamten Daten in einem Zeilensatz kann mithilfe der Methode
|
|
|
+ <code>toArray()</code> des Zeilensatz-Objekts auch als Array zugegriffen werden. Diese
|
|
|
+ Methode gibt ein Array mit einem Eintrag je Zeile zurück. Jeder dieser Einträge ist ein
|
|
|
+ assoziatives Array mit Spaltennamen als Schlüsseln und deren Daten als Werten.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.to-array.example">
|
|
|
@@ -236,8 +242,8 @@ foreach ($rowsetArray as $rowArray) {
|
|
|
|
|
|
<para>
|
|
|
Das Array, das von <code>toArray()</code>zurückgegeben wird, ist nicht update-fähig.
|
|
|
- Die Werte des Arrays können wie bei jedem Array modifiziert werden, aber Änderungen an diesem Array
|
|
|
- werden nicht direkt in der Datenbank gespeichert.
|
|
|
+ Die Werte des Arrays können wie bei jedem Array modifiziert werden, aber Änderungen an
|
|
|
+ diesem Array werden nicht direkt in der Datenbank gespeichert.
|
|
|
</para>
|
|
|
|
|
|
</sect2>
|
|
|
@@ -247,8 +253,9 @@ foreach ($rowsetArray as $rowArray) {
|
|
|
<title>Einen Zeilensatz serialisieren / deserialisieren</title>
|
|
|
|
|
|
<para>
|
|
|
- Objekte vom Typ <classname>Zend_Db_Table_Rowset_Abstract</classname> sind serialisierbar auf eine ähnliche
|
|
|
- Art, wie auch einzelne Zeilen-Objekte serialisierbar und deserialisierbar sind.
|
|
|
+ Objekte vom Typ <classname>Zend_Db_Table_Rowset_Abstract</classname> sind serialisierbar
|
|
|
+ auf eine ähnliche Art, wie auch einzelne Zeilen-Objekte serialisierbar und
|
|
|
+ deserialisierbar sind.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.serialize.example.serialize">
|
|
|
@@ -256,8 +263,8 @@ foreach ($rowsetArray as $rowArray) {
|
|
|
<title>Einen Zeilensatz serialisieren</title>
|
|
|
|
|
|
<para>
|
|
|
- PHPs <code>serialize()</code>-Funktion wird genutzt, um einen Byte-Stream zu erzeugen.
|
|
|
- Dieser repräsentiert das Zeilensatz-Objekt.
|
|
|
+ PHPs <code>serialize()</code>-Funktion wird genutzt, um einen Byte-Stream zu
|
|
|
+ erzeugen. Dieser repräsentiert das Zeilensatz-Objekt.
|
|
|
</para>
|
|
|
|
|
|
<programlisting role="php"><![CDATA[
|
|
|
@@ -278,16 +285,16 @@ $serializedRowset = serialize($rowset);
|
|
|
<title>Einen Zeilensatz deserialisieren</title>
|
|
|
|
|
|
<para>
|
|
|
- PHPs <code>unserialize()</code> stellt aus einer Zeichenkette mit einem Byte-Stream ein Objekt wieder
|
|
|
- her. Die Funktion gibt das originale Objekt zurück.
|
|
|
+ PHPs <code>unserialize()</code> stellt aus einer Zeichenkette mit einem Byte-Stream
|
|
|
+ ein Objekt wieder her. Die Funktion gibt das originale Objekt zurück.
|
|
|
</para>
|
|
|
|
|
|
<para>
|
|
|
Bitte beachten: Das zurückgegebene Zeilensatz-Objekt ist
|
|
|
- <emphasis>nicht mit der Datenbank verbunden</emphasis>.
|
|
|
- Das Zeilensatz-Objekt kann durchlaufen werden und die Zeilenobjekte können gelesen werden,
|
|
|
- aber es können keine Zeilenwerte verändert oder andere Operationen ausgeführt werden,
|
|
|
- die eine Datenbankverbindung benötigen (beispielsweise Abfragen auf verwandte Tabellen).
|
|
|
+ <emphasis>nicht mit der Datenbank verbunden</emphasis>. Das Zeilensatz-Objekt kann
|
|
|
+ durchlaufen werden und die Zeilenobjekte können gelesen werden, aber es können keine
|
|
|
+ Zeilenwerte verändert oder andere Operationen ausgeführt werden, die eine
|
|
|
+ Datenbankverbindung benötigen (beispielsweise Abfragen auf verwandte Tabellen).
|
|
|
</para>
|
|
|
|
|
|
<programlisting role="php"><![CDATA[
|
|
|
@@ -304,25 +311,26 @@ echo $row->bug_description;
|
|
|
<note>
|
|
|
<title>Warum werden Zeilensatz-Objekte unverbunden deserialisiert?</title>
|
|
|
<para>
|
|
|
- Ein serialisiertes Objekt ist eine Zeichenkette, die lesbar für jeden ist, dem sie vorliegt.
|
|
|
- Es könnte ein Sicherheitsrisiko sein, Parameter wie Datenbank-Loginname und -Passwort
|
|
|
- in simplem, unverschlüsseltem Text abzulegen.
|
|
|
- Es ist nicht wünschenswert, solche Daten in einer Textdatei abzulegen, die nicht geschützt ist,
|
|
|
- oder sie in einer E-Mail oder einem anderen Medium zu versenden, das leicht von potentiellen
|
|
|
- Angreifern lesbar ist.
|
|
|
- Der Leser des serialisierten Objekts sollte es nicht benutzen können, um Zugriff zur Datenbank
|
|
|
- zu erhalten, ohne richtige Logindaten zu kennen.
|
|
|
+ Ein serialisiertes Objekt ist eine Zeichenkette, die lesbar für jeden ist, dem sie
|
|
|
+ vorliegt. Es könnte ein Sicherheitsrisiko sein, Parameter wie Datenbank-Loginname
|
|
|
+ und -Passwort in simplem, unverschlüsseltem Text abzulegen. Es ist nicht
|
|
|
+ wünschenswert, solche Daten in einer Textdatei abzulegen, die nicht geschützt ist,
|
|
|
+ oder sie in einer E-Mail oder einem anderen Medium zu versenden, das leicht von
|
|
|
+ potentiellen Angreifern lesbar ist. Der Leser des serialisierten Objekts sollte es
|
|
|
+ nicht benutzen können, um Zugriff zur Datenbank zu erhalten, ohne richtige
|
|
|
+ Logindaten zu kennen.
|
|
|
</para>
|
|
|
</note>
|
|
|
|
|
|
<para>
|
|
|
- Ein nicht verbundenes Zeilensatz-Objekt kann mithilfe der Methode <code>setTable()</code>
|
|
|
- reaktiviert werden. Das Argument dieser Methode ist ein valides
|
|
|
+ Ein nicht verbundenes Zeilensatz-Objekt kann mithilfe der Methode
|
|
|
+ <code>setTable()</code> reaktiviert werden. Das Argument dieser Methode ist ein valides
|
|
|
<classname>Zend_Db_Table_Abstract</classname>-Objekt,
|
|
|
das vom Benutzer erstellt wird. Für das Erstellen eines Tabellenobjekts wird eine aktive
|
|
|
- Datenbankverbindung benötigt, also wird, indem die Tabelle wieder mit dem Zeilenobjekt verknüpft
|
|
|
- wird, auch der Datenbankzugriff wiederhergestellt. Ab diesem Zeitpunkt können Werte in den enthaltenen
|
|
|
- Zeilenobjekten wieder verändert und in der Datenbank gespeichert werden.
|
|
|
+ Datenbankverbindung benötigt, also wird, indem die Tabelle wieder mit dem Zeilenobjekt
|
|
|
+ verknüpft wird, auch der Datenbankzugriff wiederhergestellt. Ab diesem Zeitpunkt können
|
|
|
+ Werte in den enthaltenen Zeilenobjekten wieder verändert und in der Datenbank
|
|
|
+ gespeichert werden.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.serialize.example.set-table">
|
|
|
@@ -360,9 +368,10 @@ $row->save();
|
|
|
|
|
|
<para>
|
|
|
Es können auch alternative Klassen für Zeilensätze benutzt werden, wenn diese
|
|
|
- <classname>Zend_Db_Table_Rowset_Abstract</classname> erweitern. Der Name der eigenen Zeilensatz-Klasse wird entweder
|
|
|
- in der geschützten Tabellenklassen-Eigenschaft <code>$_rowsetClass</code> oder als Teil des
|
|
|
- Array-Arguments des Konstruktors eines Tabellenobjekts übergeben.
|
|
|
+ <classname>Zend_Db_Table_Rowset_Abstract</classname> erweitern. Der Name der eigenen
|
|
|
+ Zeilensatz-Klasse wird entweder in der geschützten Tabellenklassen-Eigenschaft
|
|
|
+ <code>$_rowsetClass</code> oder als Teil des Array-Arguments des Konstruktors eines
|
|
|
+ Tabellenobjekts übergeben.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.extending.example">
|
|
|
@@ -388,10 +397,10 @@ $bugs = new Bugs(array('rowsetClass' => 'MyRowset'));
|
|
|
</example>
|
|
|
|
|
|
<para>
|
|
|
- Typischerweise reicht die Standardklasse <classname>Zend_Db_Rowset</classname> für die meisten Benutzungsfälle aus.
|
|
|
- Trotzdem könnte es nützlich sein, neue Logik in einen Zeilensatz einzubauen, die für eine
|
|
|
- bestimmte Tabelle nötig ist. Beispielsweise könnte eine neue Methode einen Durchschnitt aller
|
|
|
- Zeilen im Zeilensatz errechnen.
|
|
|
+ Typischerweise reicht die Standardklasse <classname>Zend_Db_Rowset</classname> für die
|
|
|
+ meisten Benutzungsfälle aus. Trotzdem könnte es nützlich sein, neue Logik in einen
|
|
|
+ Zeilensatz einzubauen, die für eine bestimmte Tabelle nötig ist. Beispielsweise könnte
|
|
|
+ eine neue Methode einen Durchschnitt aller Zeilen im Zeilensatz errechnen.
|
|
|
</para>
|
|
|
|
|
|
<example id="zend.db.table.rowset.extending.example-aggregate">
|