Zend_Db_Statement.xml 16 KB

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