Zend_Db_Statement.xml 13 KB

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