Zend_Db_Statement.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 14978 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.statement">
  5. <title>Zend_Db_Statement</title>
  6. <para>
  7. Zusätzlich zu den herkömmlichen Methoden wie <code>fetchAll()</code> und <code>insert()</code>,
  8. beschrieben in <xref linkend="zend.db.adapter" />, kann auch ein Statement-Objekt verwendet werden,
  9. um zusätzliche Möglichkeiten beim Ausführen von Abfragen und holen von Ergebnissätzen zu erhalten.
  10. Dieser Abschnitt beschreibt wie eine Instanz eines Statement-Objekts erzeugt wird, und wie dessen
  11. Methoden verwendet werden.
  12. </para>
  13. <para>
  14. <classname>Zend_Db_Statement</classname> basiert auf dem PDOStatement Objekt aus der <ulink url="http://www.php.net/pdo">PHP Data Objects</ulink>
  15. Erweiterung.
  16. </para>
  17. <sect2 id="zend.db.statement.creating">
  18. <title>Erzeugung von Statement Objekten</title>
  19. <para>
  20. Normalerweise wird ein Statement Objekt von der <code>query()</code> Methode der Datenbank
  21. Adapterklasse zurück gegeben. Diese Methode ist der grundsätzliche Weg um ein beliebiges SQL Statement
  22. vor zu bereiten. Das erste Argument ist ein String, der das SQL Statement enthält. Das optionale zweite
  23. Argument ist ein Array von Werten, verknüpft mit Parameterplatzhaltern im SQL String.
  24. </para>
  25. <example id="zend.db.statement.creating.example1">
  26. <title>Erzeugung eines SQL Statement Objekts mit query()</title>
  27. <programlisting role="php"><![CDATA[
  28. $stmt = $db->query(
  29. 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
  30. array('goofy', 'FIXED')
  31. );
  32. ]]>
  33. </programlisting>
  34. </example>
  35. <para>
  36. Das Statement Objekt entspricht einem SQL Statement welches vorbereitet und einmalig mit angegebenen
  37. verknüpften Werten ausgeführt wurde. War das Statement eine SELECT Abfrage, oder irgendein Statement
  38. welches ein Ergebnissatz zurück gibt, so ist es nun bereit um Ergebnisse zu holen.
  39. </para>
  40. <para>
  41. Ein Statement kann ebenfalls mit dem Konstruktor erzeugt werden, auch wenn dies eine weniger typische
  42. Nutzung ist. Es existiert jedoch keine factory Methode um das Objekt zu erzeugen, weßhalb die
  43. entsprechende Statementklasse geladen, und ihr Konstruktor aufgerufen werden muss. Als erstes Argument
  44. muss das Adapterobjekt übergeben werden und als zweites Argument ein String welcher das SQL Statement
  45. enthält. Das Statement ist dadurch vorbereitet, jedoch nicht Ausgeführt.
  46. </para>
  47. <example id="zend.db.statement.creating.example2">
  48. <title>Nutzung des SQL Statement Konstruktors</title>
  49. <programlisting role="php"><![CDATA[
  50. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  51. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  52. ]]>
  53. </programlisting>
  54. </example>
  55. </sect2>
  56. <sect2 id="zend.db.statement.executing">
  57. <title>Ausführen eines Statements</title>
  58. <para>
  59. Ein Statement Objekt muss ausgeführt werden wenn es über den Konstruktor erzeugt wurde, oder kann, wenn
  60. es mehrere Male hintereinander ausgeführt werden soll. Dazu wird die <code>execute()</code> Methode des
  61. Statement Objekts verwendet. Das einzige Argument ist ein Array von Werten, welche mit
  62. Parameterplatzhaltern im Statement verknüpft werden.
  63. </para>
  64. <para>
  65. Wenn <emphasis>positionierte Parameter</emphasis>, oder solche, die mit dem Fragezeichen (<code>?</code>)
  66. verwendet werden, muss ein einfaches Array übergeben werden.
  67. </para>
  68. <example id="zend.db.statement.executing.example1">
  69. <title>Ausführen eines Statements mit positionierten Parametern</title>
  70. <programlisting role="php"><![CDATA[
  71. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  72. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  73. $stmt->execute(array('goofy', 'FIXED'));
  74. ]]>
  75. </programlisting>
  76. </example>
  77. <para>
  78. Wenn <emphasis>benannte Parameter</emphasis>, oder solche die mit einem String und voranstehenden
  79. Doppelpunkt (<code>:</code>) bezeichnet werden, verwendet werden, muss ein assoziatives Array übergeben
  80. werden. Die Schlüssel dieses Arrays müssen den Parameternamen entsprechen.
  81. </para>
  82. <example id="zend.db.statement.executing.example2">
  83. <title>Ausführen eines Statements mit benannten Parametern</title>
  84. <programlisting role="php"><![CDATA[
  85. $sql = 'SELECT * FROM bugs WHERE ' .
  86. 'reported_by = :reporter AND bug_status = :status';
  87. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  88. $stmt->execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));
  89. ]]>
  90. </programlisting>
  91. </example>
  92. <para>
  93. PDO Statements unterstützen sowohl postionierte als auch benannte Parameter, jedoch nicht beide Typen
  94. in einem einzelnen SQL Statement. Einige der <classname>Zend_Db_Statement</classname> Klassen für nicht-PDO Erweiterungen
  95. könnten nur einen Typ von Parametern unterstützen.
  96. </para>
  97. </sect2>
  98. <sect2 id="zend.db.statement.fetching">
  99. <title>Holen von Ergebnissen eines <code>SELECT</code> Statements</title>
  100. <para>
  101. Es können Methoden des Statement Objekts aufgefufen werden um Ergebnissätze zu erzeugen. SELECT, SHOW,
  102. DESCRIBE und EXPLAIN sind Beispiele von von Statements die Ergebnissätze erzeugen. INSERT, UPDATE und
  103. DELETE sind Beispiele von Statements die keine Ergebnissätze erzeugen. Letztere Statements können zwar
  104. mit <classname>Zend_Db_Statement</classname> ausgeführt werden, aber Methoden die Zeilen oder Ergebnisse liefern können bei
  105. diesen nicht verwendet werden.
  106. </para>
  107. <sect3 id="zend.db.statement.fetching.fetch">
  108. <title>Holen einer einzelnen Zeile eines Ergebnissatzes</title>
  109. <para>
  110. Um eine einzelne Zeile eines Ergebnissatzes aubzurufen kann die <code>fetch()</code> Methode des
  111. Statement Objekts verwendet werden. Alle drei Argumente dieser Methode sind optional:
  112. </para>
  113. <itemizedlist>
  114. <listitem>
  115. <para>
  116. <emphasis role="strong">Fetch Style</emphasis> ist das erste Argument. Es steuert die
  117. Struktur in welcher die Zeile zurück gegeben wird. Unter <xref linkend="zend.db.adapter.select.fetch-mode" />
  118. befindet sich eine Beschreibung der gültigen Werte und der entsprechenden Datenformaten.
  119. </para>
  120. </listitem>
  121. <listitem>
  122. <para>
  123. <emphasis role="strong">Cursor Ausrichtung</emphasis> ist das zweite Argument. Standard ist
  124. Zend_Db::FETCH_ORI_NEXT, was einfach bedeutet das für jeden Aufruf von <code>fetch()</code>
  125. die nächste Zeile des Ergebnissatzes, in der Riehenfolge des RDBMS, zurück gegeben wird.
  126. </para>
  127. </listitem>
  128. <listitem>
  129. <para>
  130. <emphasis role="strong">Offset</emphasis> ist das dritte Argument.
  131. Wenn die Cursor Ausrichtung Zend_Db::FETCH_ORI_ABS ist, dann ist die Offset-Nummer die
  132. ordinale Nummer der Zeile die zurück gegeben wird.
  133. Wenn die Cursor Ausrichtung Zend_Db::FETCH_ORI_REL, dann ist die Offset-Nummer relativ zu
  134. der Cursorposition bevor <code>fetch()</code> aufgerufen wurde.
  135. </para>
  136. </listitem>
  137. </itemizedlist>
  138. <para>
  139. <code>fetch()</code> gibt <code>false</code> zurück wenn alle Zeilen des Ergbnissatzes geholt wurden.
  140. </para>
  141. <example id="zend.db.statement.fetching.fetch.example">
  142. <title>Nutzung fetch() in einer Schleife</title>
  143. <programlisting role="php"><![CDATA[
  144. $stmt = $db->query('SELECT * FROM bugs');
  145. while ($row = $stmt->fetch()) {
  146. echo $row['bug_description'];
  147. }
  148. ]]>
  149. </programlisting>
  150. </example>
  151. <para>
  152. Weitere Informationen unter <ulink url="http://www.php.net/PDOStatement-fetch">PDOStatement::fetch()</ulink>.
  153. </para>
  154. </sect3>
  155. <sect3 id="zend.db.statement.fetching.fetchall">
  156. <title>Holen eines gesamten Ergebnissatzes</title>
  157. <para>
  158. Um alle Zeilen eines Ergebnissatzes in einem Schritt abzurufen wird die <code>fetchAll()</code> Methode
  159. verwendet. Dies ist gleichbedeutend mit dem Aufruf der <code>fetch()</code> Methode in einer Schleife
  160. und dem Speichern der Rückgabewerte in einem Array.
  161. Die <code>fetchAll()</code> Methode akzeptiert zwei Argumente. Das Erste ist der Fetch Style, wie oben
  162. beschrieben, und das Zweite gibt die Nummer der zurück zu gebenden Spalte an, wenn der Fetch Style
  163. Zend_Db::FETCH_COLUMN ist.
  164. </para>
  165. <example id="zend.db.statement.fetching.fetchall.example">
  166. <title>Nutzung von fetchAll()</title>
  167. <programlisting role="php"><![CDATA[
  168. $stmt = $db->query('SELECT * FROM bugs');
  169. $rows = $stmt->fetchAll();
  170. echo $rows[0]['bug_description'];
  171. ]]>
  172. </programlisting>
  173. </example>
  174. <para>
  175. Weitere Informationen unter <ulink url="http://www.php.net/PDOStatement-fetchAll">PDOStatement::fetchAll()</ulink>.
  176. </para>
  177. </sect3>
  178. <sect3 id="zend.db.statement.fetching.fetch-mode">
  179. <title>Ändern des Fetch Modus</title>
  180. <para>
  181. Standardmäßig gibt das Statement Objekt Zeilen des Ergebnissatzes als assoziatives Array, mapping
  182. column names to column values, zurück. Ein anderes Format für die Datenrückgabe der Statementklasse
  183. kann genau wie bei der Adapterklasse angegeben werden. Die <code>setFetchMode()</code> Methode des
  184. Statement Objekts wird verwendet um den Fetch-Modus anzugeben. Dazu werden die Zend_Db Klassen
  185. Konstanten FETCH_ASSOC, FETCH_NUM, FETCH_BOTH, FETCH_COLUMN und FETCH_OBJ verwendet.
  186. Weiter Informationenüber diese Modi gibt es unter <xref linkend="zend.db.adapter.select.fetch-mode" />.
  187. Nachfolgende Aufrufe der Statement Methoden <code>fetch()</code> und <code>fetchAll()</code> benutzen
  188. den neu gesetzten Fetch-Modus.
  189. </para>
  190. <example id="zend.db.statement.fetching.fetch-mode.example">
  191. <title>Ändern des Fetch-Modus</title>
  192. <programlisting role="php"><![CDATA[
  193. $stmt = $db->query('SELECT * FROM bugs');
  194. $stmt->setFetchMode(Zend_Db::FETCH_NUM);
  195. $rows = $stmt->fetchAll();
  196. echo $rows[0][0];
  197. ]]>
  198. </programlisting>
  199. </example>
  200. <para>
  201. Weitere Informationen unter <ulink url="http://www.php.net/PDOStatement-setFetchMode">PDOStatement::setFetchMode()</ulink>.
  202. </para>
  203. </sect3>
  204. <sect3 id="zend.db.statement.fetching.fetchcolumn">
  205. <title>Holen einer einzelnen Spalte eines Ergebnissatzes</title>
  206. <para>
  207. <code>fetchColumn()</code> wird verwendet mm eine einzelne Spalte eines Ergebnissatzes zurück zu
  208. geben. Das optionale Argument ist der Integer Index der Spalte die zurück gegeben werden soll. Der
  209. Standardwert ist 0. Diese Methode gibt einen scalaren Wert zurück, oder <code>false</code> wenn alle
  210. Zeilen des Ergebnissatzes bereits geholt wurden.
  211. </para>
  212. <para>
  213. Zu beachten ist, dass diese Methode anders als die <code>fetchCol()</code> Methode der Adapterklasse
  214. arbeitet. Die <code>fetchColumn()</code> Methode der Statementklasse gibt einen einzelnen Wert einer
  215. Zeile zurück.
  216. Die <code>fetchCol()</code> Methode der Adapterklasse hingegen gibt ein Array von Werten der ersten Spalte
  217. aller Zeilen eines Ergebnissatzes zurück.
  218. </para>
  219. <example id="zend.db.statement.fetching.fetchcolumn.example">
  220. <title>Nutzung von fetchColumn()</title>
  221. <programlisting role="php"><![CDATA[
  222. $stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
  223. $bug_status = $stmt->fetchColumn(2);
  224. ]]>
  225. </programlisting>
  226. </example>
  227. <para>
  228. Weitere Informationen unter <ulink url="http://www.php.net/PDOStatement-fetchColumn">PDOStatement::fetchColumn()</ulink>.
  229. </para>
  230. </sect3>
  231. <sect3 id="zend.db.statement.fetching.fetchobject">
  232. <title>Holen einer Zeile als Objekt</title>
  233. <para>
  234. Um eine Zeile eines Ergebnissatzes zu holen, die wie ein Objekt strukturiert ist, wird die <code>fetchObject()</code>
  235. Methode verwendet.
  236. Diese Methode nimmt zwei optionale Argumente entgegen. Das erste Argument ist ein String der den
  237. Klassenname des zurück zu gebenden Objekts enthält, standard ist 'stdClass'. Das zweite Argument
  238. ist ein Array von Werten, die an den Konstruktor des Objekts übergeben werden.
  239. </para>
  240. <example id="zend.db.statement.fetching.fetchobject.example">
  241. <title>Nutzung von fetchObject()</title>
  242. <programlisting role="php"><![CDATA[
  243. $stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
  244. $obj = $stmt->fetchObject();
  245. echo $obj->bug_description;
  246. ]]>
  247. </programlisting>
  248. </example>
  249. <para>
  250. Weitere Informationen unter <ulink url="http://www.php.net/PDOStatement-fetchObject">PDOStatement::fetchObject()</ulink>.
  251. </para>
  252. </sect3>
  253. </sect2>
  254. <!--
  255. @todo: binding parameters is not working yet.
  256. <sect2 id="zend.db.statement.binding-param">
  257. <title>Binding PHP Variables to Parameters</title>
  258. <para>
  259. </para>
  260. <example id="zend.db.statement.binding-param.example">
  261. <title>Binding parameters from PHP variables</title>
  262. <programlisting role="php"><![CDATA[
  263. ]]>
  264. </programlisting>
  265. </example>
  266. <para>
  267. See also <ulink url="http://www.php.net/PDOStatement-bindParam">PDOStatement::bindParam()</ulink>.
  268. </para>
  269. </sect2>
  270. -->
  271. <!--
  272. @todo: binding columns is not working yet.
  273. <sect2 id="zend.db.statement.binding-column">
  274. <title>Binding PHP Variables to Query Results</title>
  275. <para>
  276. </para>
  277. <example id="zend.db.statement.binding-column.example">
  278. <title>Binding results to PHP variables</title>
  279. <programlisting role="php"><![CDATA[
  280. ]]>
  281. </programlisting>
  282. </example>
  283. <para>
  284. See also <ulink url="http://www.php.net/PDOStatement-bindColumn">PDOStatement::bindColumn()</ulink>.
  285. </para>
  286. </sect2>
  287. -->
  288. </sect1>