Zend_Db_Adapter.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <sect1 id="zend.db.adapter">
  2. <title>Zend_Db_Adapter</title>
  3. <sect2 id="zend.db.adapter.introduction">
  4. <title>Inleiding</title>
  5. <para>
  6. <code>Zend_Db_Adapter</code> is de database API abstractielaag voor het Zend
  7. Framework, gebaseerd op PDO. Je kan <code>Zend_Db_Adapter</code> gebruiken om
  8. je te verbinden en te werken met alle ondersteunde SQL database systemen die
  9. dezelfde API gebruiken. Deze houden onder andere in: Microsoft SQL Server,
  10. MySQL, PostgreSQL, SQLite, en anderen.
  11. </para>
  12. <para>Om een instantie van <code>Zend_Db_Adapter</code> voor jouw specifieke database
  13. op te roepen, moet je <code>Zend_Db::factory()</code> oproepen met de naam van de
  14. van toepassing zijnde adapter en een array van parameters die de verbinding beschrijven. Bijvoorbeeld,
  15. om een verbinding tot stand te brengen op een MySQL database die "camelot" heet op localhost
  16. met een user genaamd "arthur":</para>
  17. <programlisting role="php"><![CDATA[<?php
  18. require_once 'Zend/Db.php';
  19. $params = array ('host' => '127.0.0.1',
  20. 'username' => 'arthur',
  21. 'password' => '******',
  22. 'dbname' => 'camelot');
  23. $db = Zend_Db::factory('PDO_MYSQL', $params);
  24. ?>]]></programlisting>
  25. <para>
  26. Om een verbinding te maken met een SQLite database genaamd "camelot":
  27. </para>
  28. <programlisting role="php"><![CDATA[<?php
  29. require_once 'Zend/Db.php';
  30. $params = array ('dbname' => 'camelot');
  31. $db = Zend_Db::factory('PDO_SQLITE', $params);
  32. ?>]]></programlisting>
  33. <para>
  34. In elk geval zal je exact dezelfde API kunnen gebruiken om de database te ondervragen.
  35. </para>
  36. </sect2>
  37. <sect2 id="zend.db.adapter.quoting">
  38. <title>Quoting tegen SQL Injectie</title>
  39. <para>
  40. Je moet altijd waarden quoten die gebruikt moeten worden in een
  41. SQL verklaring; dit om SQL injectie aanvallen te helpen voorkomen.
  42. <code>Zend_Db_Adapter</code> verstrekt twee methodes (via het onderliggende
  43. PDO object) om je te helpen handmatig waarden te quoten.
  44. </para>
  45. <para>
  46. De eerste van deze methodes is de <code>quote()</code> methode. Het zal
  47. een scalaire waarde correct quoten voor jouw database adapter; als je een
  48. array probeert te quoten zal het een komma-gescheiden string van arraywaarden
  49. terugsturen, elk van deze waarden met correcte quotes (dit is handig voor
  50. functies die een lijstparameter verwachten).
  51. </para>
  52. <programlisting role="php"><![CDATA[<?php
  53. // maak een $db object, we nemen aan dat de adapter Mysql is.
  54. // quote een scalaire waarde
  55. $value = $db->quote('St John"s Wort');
  56. // $value is nu '"St John\"s Wort"' (merk de omringende quotes op)
  57. // quote een array
  58. $value = $db->quote(array('a', 'b', 'c');
  59. // $value is nu '"a", "b", "c"' (een komma-gescheiden string)
  60. ?>]]></programlisting>
  61. <para>
  62. De tweede methode is de <code>quoteInto()</code> methode. Je geeft een
  63. basis string op met een vraagteken plaatshouder, en één scalaire waarde
  64. of een array om erin te quoten. Dit is handig om queries en clausules
  65. te maken "as-you-go". Scalaire waarden en arrays werken hetzelfde als in
  66. de <code>quote()</code> methode.
  67. </para>
  68. <programlisting role="php"><![CDATA[<?php
  69. // maak een $db object, we nemen aan dat de adapter Mysql is.
  70. // quote een scalaire waarde in de WHERE clausule
  71. $where = $db->quoteInto('id = ?', 1);
  72. // $where is nu 'id = "1"' (merk de omringende quotes op)
  73. // quote een array into een WHERE clausule
  74. $where = $db->quoteInto('id IN(?)', array(1, 2, 3));
  75. // $where is nu 'id IN("1", "2", "3")' (een komma-gescheiden string)
  76. ?>]]></programlisting>
  77. </sect2>
  78. <sect2 id="zend.db.adapter.queries">
  79. <title>Directe Queries</title>
  80. <para>
  81. Eenmaal je een <code>Zend_Db_Adapter</code> instantie hebt, kan je queries
  82. direct in SQL uitvoeren. <code>Zend_Db_Adapter</code> geeft die queries door
  83. aan het onderliggende PDO object, die de query klaarmaakt en uitvoert en dan een
  84. PDOStatement object teruggeeft met de resultaten (als die er zijn) voor jou om
  85. te behandelen.
  86. </para>
  87. <programlisting role="php"><![CDATA[<?php
  88. // maak een $db object, en ondervraag de database
  89. // met een SQL verklaring met correcte quotes.
  90. $sql = $db->quoteInto(
  91. 'SELECT * FROM example WHERE date > ?',
  92. '2006-01-01'
  93. );
  94. $result = $db->query($sql);
  95. // gebruik het PDOStatement $result om alle regels als een array te halen
  96. $rows = $result->fetchAll();
  97. ?>]]></programlisting>
  98. <para>
  99. Je mag data automatisch in je query binden. Dat betekent dat
  100. je meerdere benoemde plaatshouders in de query kan zetten, en
  101. dan een array kan doorgeven die de data bevat om de plaatshouders
  102. te vervullen. De vervulde waarden zullen automatisch de juiste
  103. quotes krijgen, en zodanig een grotere veiligheid verstrekken
  104. tegen SQL injectie aanvallen.
  105. </para>
  106. <programlisting role="php"><![CDATA[<?php
  107. // maak een $db object, en ondervraag de database
  108. // gebruik deze keer benoemde plaatshouders bindingen.
  109. $result = $db->query(
  110. 'SELECT * FROM example WHERE date > :placeholder',
  111. array('placeholder' => '2006-01-01')
  112. );
  113. // gebruik het PDOStatement $result om alle regels als een array te halen
  114. $rows = $result->fetchAll();
  115. ?>]]></programlisting>
  116. <para>
  117. Naar keuze zou je handmatig data willen voorbereiden en binden aan SQL verklaringen.
  118. Om dit te doen kan je de <code>prepare()</code> methode gebruiken om een
  119. voorbereid <code>PDOStatement</code> te verkrijgen dat je kan aanpassen.
  120. </para>
  121. <programlisting role="php"><![CDATA[<?php
  122. // maak een $db object, en ondervraag de database
  123. // bereid deze keer een PDOStatement voor dat aangepast kan worden
  124. $stmt = $db->prepare('SELECT * FROM example WHERE date > :placeholder');
  125. $stmt->bindValue('placeholder', '2006-01-01');
  126. $stmt->execute();
  127. // gebruik het PDOStatement $result om alle regels als een array te halen
  128. $rows = $stmt->fetchAll();
  129. ?>]]></programlisting>
  130. </sect2>
  131. <sect2 id="zend.db.adapter.transactions">
  132. <title>Transacties</title>
  133. <para>
  134. Standaard is PDO (en dus ook <code>Zend_Db_Adapter</code>) in "auto-commit" mode.
  135. Dit betekent dat alle queries worden gecommit wanneer ze worden uitgevoerd.
  136. Indien je wenst dat ze in een transactie worden uitgevoerd kan je eenvoudigweg
  137. de <code>beginTransaction()</code> methode oproepen en, naargelang, je veranderingen
  138. <code>commit()</code> of <code>rollBack()</code>. <code>Zend_Db_Adapter</code> keert
  139. terug naar "auto-commit" mode tot je opnieuw de <code>beginTransaction</code> methode
  140. aanroept.
  141. </para>
  142. <programlisting role="php"><![CDATA[<?php
  143. // maak $db object, en begin een transactie
  144. $db->beginTransaction();
  145. // probeer een query.
  146. // indien ze succesvol is, commit de veranderingen
  147. // indien ze faalt, roll back.
  148. try {
  149. $db->query(...);
  150. $db->commit();
  151. } catch (Exception $e) {
  152. $db->rollBack();
  153. echo $e->getMessage();
  154. }
  155. ?>]]></programlisting>
  156. </sect2>
  157. <sect2 id="zend.db.adapter.insert">
  158. <title>Rijen Invoegen</title>
  159. <para>
  160. Voor jouw gemak kan je de <code>insert()</code> methode gebruiken om
  161. een INSERT verklaring voor je te bouwen en er data aan te binden die moet
  162. ingevoegd worden. De aldus gebonden data heeft automatisch correcte quotes
  163. om te helpen SQL injectie aanvallen te voorkomen.
  164. </para>
  165. <para>
  166. De terugkeerwaarde is <emphasis>niet</emphasis> de laatst ingevoegde ID omdat het
  167. kan zijn dat de tabel geen auto-increment kolom heeft; in de plaats daarvan is
  168. de terugkeerwaarde het aantal rijen dat werd beïnvloedt (gewoonlijk 1). Als je
  169. de ID van de laatst ingevoegde rij wil, kan je de <code>lastInsertId()</code> methode
  170. oproepen na de invoeging.
  171. </para>
  172. <programlisting role="php"><![CDATA[<?php
  173. //
  174. // INSERT INTO round_table
  175. // (noble_title, first_name, favorite_color)
  176. // VALUES ("King", "Arthur", "blue");
  177. //
  178. // maak een $db object, en dan...
  179. // de rijdata die moet worden ingevoegd in kolom => waarde formaat
  180. $row = array (
  181. 'noble_title' => 'King',
  182. 'first_name' => 'Arthur',
  183. 'favorite_color' => 'blue',
  184. );
  185. // de tabel waarin de rij zou moeten worden ingevoegd
  186. $table = 'round_table';
  187. // voeg de rij in en verkrijg de rij ID
  188. $rows_affected = $db->insert($table, $data);
  189. $last_insert_id = $db->lastInsertId();
  190. ?>]]></programlisting>
  191. </sect2>
  192. <sect2 id="zend.db.adapter.update">
  193. <title>Rijen updaten</title>
  194. <para>
  195. Voor jouw gemak kan je de <code>update()</code> methode gebruiken om een
  196. UPDATE verklaring voor je te maken waaraan je dan de data die moet
  197. worden geupdate kan binden. De aldus gebonden data heeft automatisch correcte quotes
  198. om te helpen SQL injectie aanvallen te voorkomen.
  199. </para>
  200. <para>
  201. Je kan een optionele WHERE clausule verstrekken om te determineren
  202. welke rijen moeten worden geupdate. (Merk op dat de WHERE clausule
  203. geen gebonden parameter is, de waarden ervan moet je dus zelf correct quoten.)
  204. </para>
  205. <programlisting role="php"><![CDATA[<?php
  206. //
  207. // UPDATE round_table
  208. // SET favorite_color = "yellow"
  209. // WHERE first_name = "Robin";
  210. //
  211. // maak a $db object, en dan...
  212. // de nieuwe waarden om te zetten in de update, in kolom => waarde formaat.
  213. $set = array (
  214. 'favorite_color' => 'yellow',
  215. );
  216. // de tabel die moet worden geupdate
  217. $table = 'round_table';
  218. // de WHERE clausule
  219. $where = $db->quoteInto('first_name = ?', 'Robin');
  220. // update de tabel en verkrijg het aantal beïnvloede rijen
  221. $rows_affected = $db->update($table, $set, $where);
  222. ?>]]></programlisting>
  223. </sect2>
  224. <sect2 id="zend.db.adapter.delete">
  225. <title>Rijen Verwijderen</title>
  226. <para>
  227. Voor jouw gemak kan je de <code>delete()</code> methode gebruiken om
  228. een DELETE verklaring voor je te maken; je kan een optionele WHERE
  229. clausule verstrekken om te definiëren welke rijen je wil verwijderen.
  230. (Merk op dat de WHERE clausule geen gebonden parameter is, de waarden
  231. ervan moet je dus zelf correct quoten.)
  232. </para>
  233. <programlisting role="php"><![CDATA[<?php
  234. //
  235. // DELETE FROM round_table
  236. // WHERE first_name = "Patsy";
  237. //
  238. // maak een $db object, en dan...
  239. // de tabel waarvan rijen moeten worden verwijderd
  240. $table = 'round_table';
  241. // de WHERE clausule
  242. $where = $db->quoteInto('first_name = ?', 'Patsy');
  243. // update de tabel en verkrijg het aantal beïnvloede rijen
  244. $rows_affected = $db->delete($table, $where);
  245. ?>]]></programlisting>
  246. </sect2>
  247. <sect2 id="zend.db.adapter.fetch">
  248. <title>Rijen Halen</title>
  249. <para>
  250. Alhoewel je de database direct kan ondervragen met de <code>query</code>
  251. methode is het meestal zo dat het enige wat je nodig hebt is enkele rijen
  252. te selecteren en de resultaten terug te krijgen. De <code>fetch*()</code>
  253. methodeserie doet dat voor jou. Voor elk van de <code>fetch*()</code> methodes
  254. geef je een SQL SELECT verklaring op; indien je benoemde plaatshouders
  255. gebruikt in de verklaring moet je ook een array van bindwaarden doorgeven die
  256. dan met correcte quotes worden omringd en in de verklaring worden opgenomen.
  257. De <code>fetch*()</code> methodes zijn:
  258. </para>
  259. <itemizedlist>
  260. <listitem><para><code>fetchAll()</code></para></listitem>
  261. <listitem><para><code>fetchAssoc()</code></para></listitem>
  262. <listitem><para><code>fetchCol()</code></para></listitem>
  263. <listitem><para><code>fetchOne()</code></para></listitem>
  264. <listitem><para><code>fetchPairs()</code></para></listitem>
  265. <listitem><para><code>fetchRow()</code></para></listitem>
  266. </itemizedlist>
  267. <programlisting role="php"><![CDATA[<?php
  268. // maak een $db object, en dan...
  269. // verkrijg alle kolommen van alle rijen als een opeenvolgende array
  270. $result = $db->fetchAll(
  271. "SELECT * FROM round_table WHERE noble_title = :title",
  272. array('title' => 'Sir')
  273. );
  274. // verkrijg all kolommen van alle rijen als een associatieve array
  275. // de eerste kolom wordt gebruikt als array key.
  276. $result = $db->fetchAssoc(
  277. "SELECT * FROM round_table WHERE noble_title = :title",
  278. array('title' => 'Sir')
  279. );
  280. // verkrijg de eerste kolom van elke teruggestuurde rij
  281. $result = $db->fetchCol(
  282. "SELECT first_name FROM round_table WHERE noble_title = :title",
  283. array('title' => 'Sir')
  284. );
  285. // verkrijg alleen de eerste waarde
  286. $result = $db->fetchOne(
  287. "SELECT COUNT(*) FROM round_table WHERE noble_title = :title",
  288. array('title' => 'Sir')
  289. );
  290. // verkrijg een serie van key/waarde-paren; de eerste kolom is
  291. // de key van de array, de tweede kolom is de waarde van de array
  292. $result = $db->fetchPairs(
  293. "SELECT first_name, favorite_color FROM round_table WHERE noble_title = :title",
  294. array('title' => 'Sir')
  295. );
  296. // verkrijg enkel de eerste rij die werd teruggestuurd
  297. $result = $db->fetchRow(
  298. "SELECT * FROM round_table WHERE first_name = :name",
  299. array('name' => 'Lancelot')
  300. );
  301. ?>]]></programlisting>
  302. </sect2>
  303. </sect1>
  304. <!--
  305. vim:se ts=4 sw=4 et:
  306. -->