Zend_Db_Statement.xml 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24312 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.statement">
  5. <title>Zend_Db_Statement</title>
  6. <para>
  7. Oprócz metod <methodname>fetchAll()</methodname> oraz <methodname>insert()</methodname>
  8. opisanych w <link linkend="zend.db.adapter">Zend_Db_Adapter</link>, możliwe jest
  9. bezpośrednie użycie obiektu polecenia <classname>Zend_Db_Statement</classname>
  10. w celu uzyskania większej ilości opcji tworzenia zapytań oraz zwracania ich rezultatów.
  11. Rozdział ten opisuje
  12. sposoby uzyskiwania dostępu do obiektu <classname>Zend_Db_Statement</classname> oraz
  13. użycia jego metod.
  14. </para>
  15. <para>
  16. Klasa <classname>Zend_Db_Statement</classname> jest oparta na PDOStatement z rozszerzenia
  17. <ulink url="http://www.php.net/pdo">PHP Data Objects</ulink>.
  18. </para>
  19. <sect2 id="zend.db.statement.creating">
  20. <title>Utworzenie obiektu polecenia</title>
  21. <para>
  22. W typowej sytuacji obiekt <classname>Zend_Db_Statement</classname> zwracany jest
  23. przez metodę <methodname>query()</methodname> klasy adaptera bazy danych.
  24. Jest to standardowy sposób przygotowywania poleceń <acronym>SQL</acronym>.
  25. Pierwszy argument to samo zapytanie <acronym>SQL</acronym>.
  26. Drugi, opcjonalny, argument stanowi tablicę wartości
  27. służących do podstawienia jako parametry wiązane (bind parameters) w zapytaniu.
  28. </para>
  29. <example id="zend.db.statement.creating.example1">
  30. <title>Tworzenie zapytania SQL za pomocą metody query()</title>
  31. <programlisting language="php"><![CDATA[
  32. $stmt = $db->query(
  33. 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?',
  34. array('goofy', 'FIXED')
  35. );
  36. ]]></programlisting>
  37. </example>
  38. <para>
  39. Taki obiekt <classname>Zend_Db_Statement</classname> odpowiada poleceniu
  40. <acronym>SQL</acronym>, które zostało przygotowane i wykonane z określonymi
  41. parametrami wiązanymi.
  42. Jeśli polecenie jest zapytaniem <acronym>SELECT</acronym> lub innym rodzajem instrukcji
  43. zwracającej zbiór danych to w tym momencie jest ono gotowe do pobrania rezultatu
  44. zapytania.
  45. </para>
  46. <para>
  47. Mniej rozpowszechnionym sposobem użycia <classname>Zend_Db_Statement</classname>
  48. jest wykorzystanie jego konstruktora do utworzenia obiektu zapytania.
  49. Nie istnieje uniwersalna metoda fabryki tworząca taki obiekt więc niezbędne jest
  50. skorzystanie z konkretnej klasy zależnej od adaptera bazy danych.
  51. Obiekt adaptera stanowi pierwszy argument konstruktora natomiast łańcuch zawierający
  52. polecenie <acronym>SQL</acronym> jest drugim argumentem.
  53. Tak utworzona instrukcja jest preparowana ale nie wykonana.
  54. </para>
  55. <example id="zend.db.statement.creating.example2">
  56. <title>Użycie konstruktora polecenia SQL</title>
  57. <programlisting language="php"><![CDATA[
  58. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  59. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  60. ]]></programlisting>
  61. </example>
  62. </sect2>
  63. <sect2 id="zend.db.statement.executing">
  64. <title>Wykonanie polecenia</title>
  65. <para>
  66. Jeśli obiekt <classname>Zend_Db_Statement</classname> został utworzony przy pomocy
  67. jego konstruktora to niezbędne jest wykonanie (jedno- bądź wielokrotne) polecenia
  68. w nim zawartego. Służy temu metoda <methodname>execute()</methodname>.
  69. Jej argument stanowi tablica wartości przeznaczonych jako parametry wiązane
  70. do etykiet zastępczych umieszczonych w zapytaniu.
  71. </para>
  72. <para>
  73. Przy użyciu <emphasis>parametrów pozycyjnych</emphasis> lub znaków zapytania
  74. ('<emphasis>?</emphasis>') jako etykiet zastępczych, wartości parametrów wiązanych
  75. powinny zostać przekazane w zwykłej tablicy.
  76. </para>
  77. <example id="zend.db.statement.executing.example1">
  78. <title>Wykonanie polecenia z parametrami pozycyjnymi</title>
  79. <programlisting language="php"><![CDATA[
  80. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  81. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  82. $stmt->execute(array('goofy', 'FIXED'));
  83. ]]></programlisting>
  84. </example>
  85. <para>
  86. Przy użyciu <emphasis>parametrów nazywanych</emphasis> lub takich, które są
  87. określone za pomocą identyfikatora poprzedzonego dwukropkiem ('<emphasis>:</emphasis>'),
  88. wartości parametrów wiązanych powinny zostać przekazane w tablicy asocjacyjnej.
  89. Klucze tablicy powinny odpowiadać nazwom parametrów.
  90. </para>
  91. <example id="zend.db.statement.executing.example2">
  92. <title>Wykonanie polecenia z parametrami nazywanymi</title>
  93. <programlisting language="php"><![CDATA[
  94. $sql = 'SELECT * FROM bugs WHERE ' .
  95. 'reported_by = :reporter AND bug_status = :status';
  96. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  97. $stmt->execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));
  98. ]]></programlisting>
  99. </example>
  100. <para>
  101. Polecenia oparte na rozszerzeniu <acronym>PDO</acronym> wspierają zarówno pozycyjne
  102. jak i nazywane parametry. Nie można jednak używać ich równocześnie w jednym
  103. zapytaniu <acronym>SQL</acronym>.
  104. Część klas <classname>Zend_Db_Statement</classname> pozostałych rozszerzeń baz danych
  105. może oferować wsparcie jedynie dla jednego bądź drugiego typu parametrów wiązanych.
  106. </para>
  107. </sect2>
  108. <sect2 id="zend.db.statement.fetching">
  109. <title>Pobieranie rezultatów zapytania SELECT</title>
  110. <para>
  111. Aby pobrać wiersze rezultatu zapytania <acronym>SQL</acronym>, które zwraca dane
  112. można użyć odpowiednich metod obiektu <classname>Zend_Db_Statement</classname>.
  113. Zapytania <acronym>SELECT</acronym>, <acronym>SHOW</acronym>,
  114. <acronym>DESCRIBE</acronym> oraz <acronym>EXPLAIN</acronym> to przykłady
  115. poleceń zwracających dane.
  116. <acronym>INSERT</acronym>, <acronym>UPDATE</acronym> oraz <acronym>DELETE</acronym>
  117. są przykładami poleceń, które nie zwracają żadnych danych. Wywołać je można
  118. za pomocą <classname>Zend_Db_Statement</classname> ale w tym przypadku
  119. nie jest możliwe użycie metod
  120. pobierających wiersze rezultatu zapytania <acronym>SQL</acronym>.
  121. </para>
  122. <sect3 id="zend.db.statement.fetching.fetch">
  123. <title>Pobranie pojedynczego wiersza ze zbioru wynikowego</title>
  124. <para>
  125. Aby pobrać jeden wiersz ze zbioru wynikowego należy użyć metody
  126. <methodname>fetch()</methodname>. Wszystkie trzy jej argumenty są opcjonalne:
  127. </para>
  128. <itemizedlist>
  129. <listitem>
  130. <para>
  131. <emphasis>Styl pobierania</emphasis> jest pierwszym argumentem.
  132. Kontroluje format zwracanego wiersza.
  133. W <link linkend="zend.db.adapter.select.fetch-mode">tym rozdziale</link>
  134. znajduje się opis możliwych wartości i odpowiadających im formatów.
  135. </para>
  136. </listitem>
  137. <listitem>
  138. <para>
  139. <emphasis>Położenie kursora</emphasis> jest drugim argumentem.
  140. Domyślną wartością jest <constant>Zend_Db::FETCH_ORI_NEXT</constant>,
  141. co oznacza, że każde odwołanie do metody <methodname>fetch()</methodname>
  142. zwróci kolejny wiersz z wynikowego zbioru, w kolejności, w jakiej zostały
  143. uporządkowane przez <acronym>RDBMS</acronym>.
  144. </para>
  145. </listitem>
  146. <listitem>
  147. <para>
  148. <emphasis>Numer wiersza</emphasis> jest trzecim argumentem.
  149. Jeśli położenie kursora określone zostało jako
  150. <constant>Zend_Db::FETCH_ORI_ABS</constant> to jest to absolutny
  151. numer porządkowy wiersza, który zostanie zwrócony.
  152. Jeśli położenie kursora określone zostało jako
  153. <constant>Zend_Db::FETCH_ORI_REL</constant> to numer zwranacego wiersza
  154. określany jest w relacji do położenia kursora bezpośrednio przed
  155. wywołaniem metody <methodname>fetch()</methodname>.
  156. </para>
  157. </listitem>
  158. </itemizedlist>
  159. <para>
  160. Metoda <methodname>fetch()</methodname> zwraca <constant>FALSE</constant>
  161. jeśli wszystkie wiersze zbioru wynikowego zostały zwrócone.
  162. </para>
  163. <example id="zend.db.statement.fetching.fetch.example">
  164. <title>Użycie fetch() w pętli</title>
  165. <programlisting language="php"><![CDATA[
  166. $stmt = $db->query('SELECT * FROM bugs');
  167. while ($row = $stmt->fetch()) {
  168. echo $row['bug_description'];
  169. }
  170. ]]></programlisting>
  171. </example>
  172. <para>
  173. Zobacz również <ulink
  174. url="http://www.php.net/PDOStatement-fetch">PDOStatement::fetch()</ulink>.
  175. </para>
  176. </sect3>
  177. <sect3 id="zend.db.statement.fetching.fetchall">
  178. <title>Zwrócenie całego zbioru wynikowego</title>
  179. <para>
  180. Metoda <methodname>fetchAll()</methodname> służy zwróceniu wszystkich wierszy
  181. zbioru wynikowego w jednym kroku. Jest to jednoznaczne z wywołaniem
  182. metody <methodname>fetch()</methodname> w pętli i zwróceniem wierszy w tablicy.
  183. Metoda <methodname>fetchAll()</methodname> przyjmuje dwa argumenty. Pierwszy to,
  184. opisany wyżej, tryb pobierania danych. Drugi wskazuje numer zwracanej kolumny
  185. w sytuacji, gdy trybem pobierania danych jest
  186. <constant>Zend_Db::FETCH_COLUMN</constant>.
  187. </para>
  188. <example id="zend.db.statement.fetching.fetchall.example">
  189. <title>Użycie fetchAll()</title>
  190. <programlisting language="php"><![CDATA[
  191. $stmt = $db->query('SELECT * FROM bugs');
  192. $rows = $stmt->fetchAll();
  193. echo $rows[0]['bug_description'];
  194. ]]></programlisting>
  195. </example>
  196. <para>
  197. Zobacz również <ulink
  198. url="http://www.php.net/PDOStatement-fetchAll">PDOStatement::fetchAll()</ulink>.
  199. </para>
  200. </sect3>
  201. <sect3 id="zend.db.statement.fetching.fetch-mode">
  202. <title>Zmiana trybu pobierania danych</title>
  203. <para>
  204. Domyślnie obiekt <classname>Zend_Db_Statement</classname> zwraca wiersze
  205. zbioru wynikowego w postaci zagnieżdżonych tablic asocjacyjnych mapujących nazwy
  206. kolumn do odpowiadających im wartości. Zmiana formatu w którym
  207. <classname>Zend_Db_Statement</classname> zwraca dane jest możliwa w podobny sposób
  208. jak w przypadku klasy adaptera.
  209. Za pomocą metody <methodname>setFetchMode()</methodname> można określić tryb
  210. pobierania danych. Możliwe wartości zawarte są w stałych klasy
  211. <classname>Zend_Db</classname>: <constant>FETCH_ASSOC</constant>,
  212. <constant>FETCH_NUM</constant>, <constant>FETCH_BOTH</constant>,
  213. <constant>FETCH_COLUMN</constant> oraz <constant>FETCH_OBJ</constant>.
  214. W <link linkend="zend.db.adapter.select.fetch-mode">tym rozdziale</link>
  215. znajdują się szczegółowe informacje dotyczące poszczególnych trybów.
  216. Kolejne wywołania metod <methodname>fetch()</methodname>
  217. czy <methodname>fetchAll()</methodname> używają ustawionego wcześniej trybu.
  218. </para>
  219. <example id="zend.db.statement.fetching.fetch-mode.example">
  220. <title>Ustawianie trybu pobierania danych</title>
  221. <programlisting language="php"><![CDATA[
  222. $stmt = $db->query('SELECT * FROM bugs');
  223. $stmt->setFetchMode(Zend_Db::FETCH_NUM);
  224. $rows = $stmt->fetchAll();
  225. echo $rows[0][0];
  226. ]]></programlisting>
  227. </example>
  228. <para>
  229. Zobacz również <ulink
  230. url="http://www.php.net/PDOStatement-setFetchMode">PDOStatement::setFetchMode()</ulink>.
  231. </para>
  232. </sect3>
  233. <sect3 id="zend.db.statement.fetching.fetchcolumn">
  234. <title>Pobranie pojedynczej kolumny ze zbioru wynikowego</title>
  235. <para>
  236. Aby pobrać pojedynczą kolumnę kolejnego wiersza zbioru wynikowego
  237. należy użyć metody <methodname>fetchColumn()</methodname>.
  238. Jej opcjonalny argument to numer żądanej kolumny (domyślnie "0"). Na wyjściu
  239. metoda zwraca wartość skalarną lub <constant>FALSE</constant> w przypadku gdy
  240. wszystkie wiersze zostały już zwrócone.
  241. </para>
  242. <para>
  243. Należy zaznaczyć, iż metoda ta działa inaczej niż
  244. <methodname>fetchCol()</methodname> klasy adaptera bazy danych.
  245. Metoda <methodname>fetchColumn()</methodname> zwraca pojedynczą wartość z jednego
  246. wiersza, <methodname>fetchCol()</methodname> adaptera zwraca tablicę wartości
  247. branych z pierwszej kolumny wszystkich wierszy bieżącego zbioru wynikowego.
  248. </para>
  249. <example id="zend.db.statement.fetching.fetchcolumn.example">
  250. <title>Użycie fetchColumn()</title>
  251. <programlisting language="php"><![CDATA[
  252. $stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
  253. $bug_status = $stmt->fetchColumn(2);
  254. ]]></programlisting>
  255. </example>
  256. <para>
  257. Zobacz również <ulink
  258. url="http://www.php.net/PDOStatement-fetchColumn">PDOStatement::fetchColumn()</ulink>.
  259. </para>
  260. </sect3>
  261. <sect3 id="zend.db.statement.fetching.fetchobject">
  262. <title>Pobranie wiersza jako obiektu</title>
  263. <para>
  264. Aby pobrać wiersz zbioru wynikowego w postaci obiektu należy użyć metody
  265. <methodname>fetchObject()</methodname>. Przyjmuje ona dwa opcjonalne argumenty.
  266. Pierwszy to łańcuch znaków zawierający nazwę klasy, której obiekt ma być zwrócony,
  267. domyślnie jest to 'stdClass'. Drugi argument to tablica wartości, które zostaną
  268. przekazane do konstruktora tworzonej klasy.
  269. </para>
  270. <example id="zend.db.statement.fetching.fetchobject.example">
  271. <title>Użycie fetchObject()</title>
  272. <programlisting language="php"><![CDATA[
  273. $stmt = $db->query('SELECT bug_id, bug_description, bug_status FROM bugs');
  274. $obj = $stmt->fetchObject();
  275. echo $obj->bug_description;
  276. ]]></programlisting>
  277. </example>
  278. <para>
  279. Zobacz również <ulink
  280. url="http://www.php.net/PDOStatement-fetchObject">PDOStatement::fetchObject()</ulink>.
  281. </para>
  282. </sect3>
  283. </sect2>
  284. <!--
  285. @todo: binding parameters is not working yet.
  286. <sect2 id="zend.db.statement.binding-param">
  287. <title>Binding PHP Variables to Parameters</title>
  288. <para>
  289. </para>
  290. <example id="zend.db.statement.binding-param.example">
  291. <title>Binding parameters from PHP variables</title>
  292. <programlisting language="php"><![CDATA[
  293. ]]></programlisting>
  294. </example>
  295. <para>
  296. See also <ulink
  297. url="http://www.php.net/PDOStatement-bindParam">PDOStatement::bindParam()</ulink>.
  298. </para>
  299. </sect2>
  300. -->
  301. <!--
  302. @todo: binding columns is not working yet.
  303. <sect2 id="zend.db.statement.binding-column">
  304. <title>Binding PHP Variables to Query Results</title>
  305. <para>
  306. </para>
  307. <example id="zend.db.statement.binding-column.example">
  308. <title>Binding results to PHP variables</title>
  309. <programlisting language="php"><![CDATA[
  310. ]]></programlisting>
  311. </example>
  312. <para>
  313. See also <ulink
  314. url="http://www.php.net/PDOStatement-bindColumn">PDOStatement::bindColumn()</ulink>.
  315. </para>
  316. </sect2>
  317. -->
  318. </sect1>