Zend_Db_Statement.xml 17 KB

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