Zend_Db_Statement.xml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  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. En plus des méthodes telles que <methodname>fetchAll()</methodname> et <methodname>insert()</methodname>
  8. documentée dans <xref linkend="zend.db.adapter" />, vous pouvez utiliser un objet statement
  9. pour l'analyser de manière plus complète et récupérer vos résultats. Cette section décrit la
  10. marche à suivre pour obtenir un statement et utiliser ses méthodes propres.
  11. </para>
  12. <para>
  13. Zend_Db_Statement est basé sur l'objet PDOStatement dans l'extension <acronym>PHP</acronym> <ulink
  14. url="http://www.php.net/pdo">PHP Data Objects (PDO)</ulink>.
  15. </para>
  16. <sect2 id="zend.db.statement.creating">
  17. <title>Créer un statement</title>
  18. <para>
  19. Cet objet est typiquement retourné par la méthode <methodname>query()</methodname> de votre
  20. objet adaptateur de base de données. Cette méthode prépare un statement <acronym>SQL</acronym> : le premier
  21. argument est une chaîne représentant la requête préparée, le second, un tableau de
  22. paramètres liés.
  23. </para>
  24. <example id="zend.db.statement.creating.example1">
  25. <title>Création d'un objet statement avec query()</title>
  26. <programlisting language="php"><![CDATA[
  27. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  28. $stmt = $db->query($sql, array('goofy', 'FIXED'));
  29. ]]></programlisting>
  30. </example>
  31. <para>
  32. L'objet statement représente un statement <acronym>SQL</acronym> qui a été préparé, et exécuté une
  33. fois avec les paramètres de liaison ("bind") spécifiés. S'il s'agissait d'une requête
  34. SELECT par exemple, alors les résultats sont prêts à être récupérés.
  35. </para>
  36. <para>
  37. Vous pouvez créer un statement avec son constructeur, mais c'est assez peu usuel.
  38. Passez alors l'objet adaptateur en premier argument, et la chaîne représentant la
  39. requête en second. Un fois construit, le statement est préparé automatiquement, mais pas
  40. exécuté.
  41. </para>
  42. <example id="zend.db.statement.creating.example2">
  43. <title>Utilisation du constructeur de statement</title>
  44. <programlisting language="php"><![CDATA[
  45. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  46. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  47. ]]></programlisting>
  48. </example>
  49. </sect2>
  50. <sect2 id="zend.db.statement.executing">
  51. <title>Exécuter un statement</title>
  52. <para>
  53. Vous aurez besoin d'exécuter un statement si vous l'avez crée explicitement avec
  54. son constructeur. Utilisez sa méthode <methodname>execute()</methodname> pour ceci. Le seul argument
  55. que cette méthode accepte est le tableau de "binds" (paramètres préparés).
  56. </para>
  57. <para>
  58. Si vous utilisez les <emphasis>paramètres positionnés</emphasis>, ceux utilisés
  59. avec le point d'interrogation (<code>?</code>), passez simplement les valeurs dans le
  60. tableau.
  61. </para>
  62. <example id="zend.db.statement.executing.example1">
  63. <title>Exécuter un statement avec des paramètres positionnés</title>
  64. <programlisting language="php"><![CDATA[
  65. $sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?';
  66. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  67. $stmt->execute(array('goofy', 'FIXED'));
  68. ]]></programlisting>
  69. </example>
  70. <para>
  71. Si vous utilisez les <emphasis>paramètres nommés</emphasis>, ceux définis avec un
  72. identifiant chaîne de caractère précédée d'un (<code>:</code>), passez les valeurs liées
  73. sous forme de tableau associatif.
  74. </para>
  75. <example id="zend.db.statement.executing.example2">
  76. <title>Exécution d'un statement avec paramètres nommés</title>
  77. <programlisting language="php"><![CDATA[
  78. $sql = 'SELECT * FROM bugs'
  79. . ' WHERE reported_by = :reporter'
  80. . ' AND bug_status = :status';
  81. $stmt = new Zend_Db_Statement_Mysqli($db, $sql);
  82. $stmt->execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));
  83. ]]></programlisting>
  84. </example>
  85. <para>
  86. Les statements <acronym>PDO</acronym> acceptent les paramètres positionnés, ou nommés, mais pas les
  87. deux types en même temps. Certaines classes Zend_Db_Statement pour les extensions non
  88. <acronym>PDO</acronym> peuvent ne supporter qu'un seul de ces types.
  89. </para>
  90. </sect2>
  91. <sect2 id="zend.db.statement.fetching">
  92. <title>Récupérer des résultats depuis un statement SELECT</title>
  93. <para>
  94. Vous disposez de méthodes sur l'objet statement lorsque celui-ci a été exécuté sur
  95. une requête <acronym>SQL</acronym> de type SELECT, SHOW, DESCRIBE ou EXPLAIN (qui produisent des
  96. résultats). Aussi, INSERT, UPDATE et DELETE sont des exemples de requêtes ne produisant
  97. pas de résultats. Vous pouvez donc les exécuter avec Zend_Db_Statement, mais vous ne
  98. pourrez pas appeler les méthodes de récupération de résultats.
  99. </para>
  100. <sect3 id="zend.db.statement.fetching.fetch">
  101. <title>Récupérer un enregistrement unique depuis un statement</title>
  102. <para>
  103. La méthode <methodname>fetch()</methodname> permet de ne récupérer qu'un seul résultat
  104. dans le statement précédemment exécuté. Trois paramètres sont disponibles pour cette
  105. méthode, tous optionnels&#160;:
  106. </para>
  107. <itemizedlist>
  108. <listitem>
  109. <para>
  110. <emphasis>Fetch style</emphasis> en premier, permet de spécifier le
  111. mode de capture du résultat. C'est la structure dans laquelle celui-ci vous
  112. sera retourné. Voyez <xref linkend="zend.db.adapter.select.fetch-mode" />
  113. pour une description des valeurs valides et de la forme des résultats alors
  114. renvoyés.
  115. </para>
  116. </listitem>
  117. <listitem>
  118. <para>
  119. <emphasis>Cursor orientation</emphasis> est le second paramètre. Par
  120. défaut il vaut <classname>Zend_Db::FETCH_ORI_NEXT</classname>, ce qui
  121. signifie que chaque appel futur à <methodname>fetch()</methodname> retourne
  122. l'enregistrement suivant.
  123. </para>
  124. </listitem>
  125. <listitem>
  126. <para>
  127. <emphasis>Offset</emphasis>, en troisième paramètre. Si le paramètre
  128. "cursor orientation" est réglé sur
  129. <classname>Zend_Db::FETCH_ORI_ABS</classname>, alors le numéro d'offset est
  130. le numéro du résultat à retourner, dans le statement. Si c'est
  131. <classname>Zend_Db::FETCH_ORI_REL</classname>, le numéro d'offset est
  132. relatif à la position du curseur avant l'appel à
  133. <methodname>fetch()</methodname>.
  134. </para>
  135. </listitem>
  136. </itemizedlist>
  137. <para>
  138. <methodname>fetch()</methodname> retourne <constant>FALSE</constant> si il n'y a plus de résultats
  139. restants dans le statement.
  140. </para>
  141. <example id="zend.db.statement.fetching.fetch.example">
  142. <title>Utiliser fetch() dans une boucle</title>
  143. <programlisting language="php"><![CDATA[
  144. $stmt = $db->query('SELECT * FROM bugs');
  145. while ($row = $stmt->fetch()) {
  146. echo $row['bug_description'];
  147. }
  148. ]]></programlisting>
  149. </example>
  150. <para>
  151. Voyez aussi <ulink
  152. url="http://www.php.net/PDOStatement-fetch">PDOStatement::fetch()</ulink>.
  153. </para>
  154. </sect3>
  155. <sect3 id="zend.db.statement.fetching.fetchall">
  156. <title>Récupérer un jeu de résultat complet</title>
  157. <para>
  158. Pour récupérer tous les résultats d'un statement, utilisez
  159. <methodname>fetchAll()</methodname>. Ceci est équivalent à appeler <methodname>fetch()</methodname> dans un
  160. boucle et retourner tous les résultats dans un tableau. La méthode
  161. <methodname>fetchAll()</methodname> accepte deux paramètres. Le premier est le mode de capture
  162. (fetch style), le deuxième est le numéro de la colonne à retourner, si
  163. Zend_Db::FETCH_COLUMN est utilisé.
  164. </para>
  165. <example id="zend.db.statement.fetching.fetchall.example">
  166. <title>Utilisation de fetchAll()</title>
  167. <programlisting language="php"><![CDATA[
  168. $stmt = $db->query('SELECT * FROM bugs');
  169. $rows = $stmt->fetchAll();
  170. echo $rows[0]['bug_description'];
  171. ]]></programlisting>
  172. </example>
  173. <para>
  174. Voyez aussi <ulink
  175. 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>Changer le mode de capture (Fetch Mode)</title>
  180. <para>
  181. Par défaut l'objet statement retourne les colonnes du jeu de résultat en tant
  182. que tableau associatif, en faisant correspondre les noms des colonne et leur valeur.
  183. Vous pouvez cependant spécifier un format différent, comme il est possible de faire
  184. avec la classe de l'adaptateur. La méthode <methodname>setFetchMode()</methodname> permet ceci.
  185. Indiquez un mode de capture en utilisant les constantes de la classe Zend_Db :
  186. FETCH_ASSOC, FETCH_NUM, FETCH_BOTH, FETCH_COLUMN, et FETCH_OBJ. Voyez <xref
  187. linkend="zend.db.adapter.select.fetch-mode" /> pour plus d'informations sur ces
  188. modes de capture. Les appels suivants à <methodname>fetch()</methodname> ou
  189. <methodname>fetchAll()</methodname> utiliseront le mode spécifié auparavant.
  190. </para>
  191. <example id="zend.db.statement.fetching.fetch-mode.example">
  192. <title>Paramétrer le mode de capture (fetch mode)</title>
  193. <programlisting language="php"><![CDATA[
  194. $stmt = $db->query('SELECT * FROM bugs');
  195. $stmt->setFetchMode(Zend_Db::FETCH_NUM);
  196. $rows = $stmt->fetchAll();
  197. echo $rows[0][0];
  198. ]]></programlisting>
  199. </example>
  200. <para>
  201. Voyez aussi <ulink
  202. url="http://www.php.net/PDOStatement-setFetchMode">PDOStatement::setFetchMode()</ulink>.
  203. </para>
  204. </sect3>
  205. <sect3 id="zend.db.statement.fetching.fetchcolumn">
  206. <title>Récupérer une colonne simple depuis un statement exécuté</title>
  207. <para>
  208. Pour retourner une colonne de résultat depuis un statement, utilisez la
  209. méthode <methodname>fetchColumn()</methodname>. Le paramètre optionnel est un entier
  210. représentant l'index de la colonne désirée, par défaut zéro. Cette méthode retourne
  211. un type scalaire, ou <constant>FALSE</constant> s'il n'y a plus de résultats dans le
  212. statement.
  213. </para>
  214. <para>
  215. Notez que cette méthode se comporte différemment de <methodname>fetchCol()</methodname> de
  216. l'adaptateur. La méthode <methodname>fetchColumn()</methodname> du statement retourne une seule
  217. valeur d'un seul résultat. <methodname>fetchCol()</methodname> de l'adaptateur retourne un
  218. tableau de valeurs issues de la première colonne du jeu résultat.
  219. </para>
  220. <example id="zend.db.statement.fetching.fetchcolumn.example">
  221. <title>Utiliser fetchColumn()</title>
  222. <programlisting language="php"><![CDATA[
  223. $sql = 'SELECT bug_id, bug_description, bug_status FROM bugs';
  224. $stmt = $db->query($sql);
  225. $bug_status = $stmt->fetchColumn(2);
  226. ]]></programlisting>
  227. </example>
  228. <para>
  229. Voyez aussi <ulink
  230. url="http://www.php.net/PDOStatement-fetchColumn">PDOStatement::fetchColumn()</ulink>.
  231. </para>
  232. </sect3>
  233. <sect3 id="zend.db.statement.fetching.fetchobject">
  234. <title>Récupérer un résultat (Row) sous forme d'objet</title>
  235. <para>
  236. Pour récupérer une ligne de résultat en tant qu'objet, depuis un statement
  237. exécuté, utilisez la méthode <methodname>fetchObject()</methodname>. Celle-ci prend deux
  238. paramètres optionnels. Le premier est une chaîne indiquant le nom de la classe que
  239. l'on souhaite se voir retourner, par défaut il s'agit de "<code>stdClass</code>". Le
  240. deuxième paramètre est un tableau de paramètres qui sera passé au constructeur de
  241. cette classe.
  242. </para>
  243. <example id="zend.db.statement.fetching.fetchobject.example">
  244. <title>Utiliser fetchObject()</title>
  245. <programlisting language="php"><![CDATA[
  246. $sql = 'SELECT bug_id, bug_description, bug_status FROM bugs';
  247. $stmt = $db->query($sql);
  248. $obj = $stmt->fetchObject();
  249. echo $obj->bug_description;
  250. ]]></programlisting>
  251. </example>
  252. <para>
  253. Voyez aussi <ulink
  254. url="http://www.php.net/PDOStatement-fetchObject">PDOStatement::fetchObject()</ulink>.
  255. </para>
  256. </sect3>
  257. </sect2>
  258. <!--
  259. @todo: binding parameters is not working yet.
  260. <sect2 id="zend.db.statement.binding-param">
  261. <title>Binding PHP Variables to Parameters</title>
  262. <para>
  263. </para>
  264. <example id="zend.db.statement.binding-param.example">
  265. <title>Binding parameters from PHP variables</title>
  266. <programlisting language="php"><![CDATA[
  267. ]]></programlisting>
  268. </example>
  269. <para>
  270. See also <ulink url="http://www.php.net/PDOStatement-bindParam">PDOStatement::bindParam()</ulink>.
  271. </para>
  272. </sect2>
  273. -->
  274. <!--
  275. @todo: binding columns is not working yet.
  276. <sect2 id="zend.db.statement.binding-column">
  277. <title>Binding PHP Variables to Query Results</title>
  278. <para>
  279. </para>
  280. <example id="zend.db.statement.binding-column.example">
  281. <title>Binding results to PHP variables</title>
  282. <programlisting language="php"><![CDATA[
  283. ]]></programlisting>
  284. </example>
  285. <para>
  286. See also <ulink url="http://www.php.net/PDOStatement-bindColumn">PDOStatement::bindColumn()</ulink>.
  287. </para>
  288. </sect2>
  289. -->
  290. </sect1>