Zend_Db_Statement.xml 14 KB

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