Zend_Db_Adapter.xml 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908
  1. <sect1 id="zend.db.adapter">
  2. <title>Zend_Db_Adapter</title>
  3. <para>
  4. Zend_Db ve alakalı sınıflar Zend Framework için basit SQL veri tabanı arayüzü
  5. sağlamaktadır. Zend_Db_Adapter PHP uygulamalarınızı ilişkisel veri tabanı yönetim
  6. sistemlerine(RDBMS) bağlamak için kullanılan temel sınıftır. Farklı RDBMS'ler için
  7. farklı bağdaştırıcı sınıfları mevcuttur.
  8. </para>
  9. <para>
  10. Zend_Db sağlayıcıya özel PHP eklentileri ile genel arayüz arasında
  11. köprü oluşturarak , az bir emek ile PHP uygulamalarınızı bir kere yazıp
  12. farklı RDBMS'ler ile yerleştirilmesine yardım eder.
  13. </para>
  14. <para>
  15. Bağdaştırıcı sınıfının arayüzü <ulink url="http://www.php.net/pdo">PHP Data Objects (PDO)</ulink>
  16. eklentisinin arayüzüne benzer. Zend_Db takip eden RDPMS markaları için PDO sürücüsü bağdaştırıcı
  17. sınıfları sağlamaktadır:
  18. </para>
  19. <itemizedlist>
  20. <listitem>
  21. <para>
  22. MySQL, <ulink url="http://www.php.net/pdo-mysql">pdo_mysql</ulink> PHP eklentisini kullanarak
  23. </para>
  24. </listitem>
  25. <listitem>
  26. <para>
  27. Microsoft SQL Server, <ulink url="http://www.php.net/pdo-mssql">pdo_mssql</ulink> PHP eklentisini kullanarak
  28. </para>
  29. </listitem>
  30. <listitem>
  31. <para>
  32. Oracle, <ulink url="http://www.php.net/pdo-oci">pdo_oci</ulink> PHP eklentisini kullanarak
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. PostgreSQL, <ulink url="http://www.php.net/pdo-pgsql">pdo_pgsql</ulink> PHP eklentisini kullanarak
  38. </para>
  39. </listitem>
  40. <listitem>
  41. <para>
  42. SQLite, <ulink url="http://www.php.net/pdo-sqlite">pdo_sqlite</ulink> PHP eklentisini kullanarak
  43. </para>
  44. </listitem>
  45. </itemizedlist>
  46. <para>
  47. Ek olarak , Zend_Db takip eden RDBMS markaları için PHP veri tabanı eklentilerini
  48. kullanan bağdaştırıcı sınıfları sağlamaktadır:
  49. </para>
  50. <itemizedlist>
  51. <listitem>
  52. <para>
  53. MySQL, <ulink url="http://www.php.net/mysqli">mysqli</ulink> PHP eklentisini kullanarak
  54. </para>
  55. </listitem>
  56. <listitem>
  57. <para>
  58. Oracle, <ulink url="http://www.php.net/oci8">oci8</ulink> PHP eklentisini kullanarak
  59. </para>
  60. </listitem>
  61. <listitem>
  62. <para>
  63. IBM DB2, <ulink url="http://www.php.net/ibm_db2">ibm_db2</ulink> PHP eklentisini kullanarak
  64. </para>
  65. </listitem>
  66. </itemizedlist>
  67. <note>
  68. <para>
  69. Her Zend_Db bağdaştırıcısı PHP eklentisi kullanmaktadır.
  70. Zend_Db bağdaştırıcısını kullanabilmek için karşılık gelen PHP
  71. eklentisi PHP ortamınızda aktif durumda olmalıdır.
  72. Örneğin , PDO Zend_Db bağdaştırıcılarından herhangi birini
  73. kullandığınızda , PDO eklentisini ve kullandığınız marka
  74. RDBMS'in PDO sürücüsünü aktif hale getirmelisiniz.
  75. </para>
  76. </note>
  77. <sect2 id="zend.db.adapter.connecting">
  78. <title>Bağdaştırıcı ile veri tabanına Bağlanmak</title>
  79. <para>
  80. Bu kısım veri tabanı bağdaştırıcısı instance'ı oluşturulmasını açıklar.
  81. Bu PHP uygulamanızdan RDBMS sunucunuza bağlantı yapmaya benzer.
  82. </para>
  83. <sect3 id="zend.db.adapter.connecting.constructor">
  84. <title>Zend_Db Bağdaştırıcısı yapıcısı(Constructor'ı) kullanmak</title>
  85. <para>
  86. Bir bağdaştırıcının yapıcısını kullanarak bir bağdaştırıcının
  87. instance'ını oluşturabilirsiniz. Bağdaştırıcı yapıcısı bağlantıyı
  88. tanımlamak için parametreler dizisi olan bir argüman almaktadır.
  89. </para>
  90. <example id="zend.db.adapter.connecting.constructor.example">
  91. <title>Bağdaştırıcı yapıcısı kullanmak</title>
  92. <programlisting role="php"><![CDATA[<?php
  93. require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
  94. $db = new Zend_Db_Adapter_Pdo_Mysql(array(
  95. 'host' => '127.0.0.1',
  96. 'username' => 'webuser',
  97. 'password' => 'xxxxxxxx',
  98. 'dbname' => 'test'
  99. ));]]>
  100. </programlisting>
  101. </example>
  102. </sect3>
  103. <sect3 id="zend.db.adapter.connecting.factory">
  104. <title>Zend_Db Factory kullanmak</title>
  105. <para>
  106. Direk olarak Bağdaştırıcı yapıcısı(constructor) kullanmaya alternatif olarak
  107. bağdaştırıcının statik metodunu <code>Zend_Db::factory()</code> kullanarak
  108. bağdaştırıcı instance'ı olşturulabilir.Bu metod istem sırasında Bağdaştırıcı
  109. sınıf dosyasını <link linkend="zend.loader.load.class">Zend_Loader::loadClass()</link>
  110. kullanarak dinamik olarak yükler.
  111. </para>
  112. <para>
  113. İlk argüman Bağdaştırıcı sınıfının esas adını adlandıran string argümandır.
  114. Örneğin 'Pdo_Mysql' string'i Zend_Db_Adapter_Pdo_Mysql sınıfını karşılamaktadır.
  115. İkinci argüman aynı Bağdaştırıcı yapıcısına verilen parametreler dizisi
  116. gibidir.
  117. </para>
  118. <example id="zend.db.adapter.connecting.factory.example">
  119. <title>Bağdaştırıcı factory metodunu kullanmak</title>
  120. <programlisting role="php"><![CDATA[<?php
  121. require_once 'Zend/Db.php';
  122. // Zend_Db_Adapter_Pdo_Mysql sınıfını otomatik yükle ve instance'ını oluştur.
  123. $db = Zend_Db::factory('Pdo_Mysql', array(
  124. 'host' => '127.0.0.1',
  125. 'username' => 'webuser',
  126. 'password' => 'xxxxxxxx',
  127. 'dbname' => 'test'
  128. ));]]>
  129. </programlisting>
  130. </example>
  131. <para>
  132. Zend_Db_Adapter_Abstract sınıfını genişleten bir sınıf oluşturup ,
  133. sınıf adını "Zend_Db_Adapter" paket öneki ile isimlendirmediyseniz
  134. bağdaştırınızı yüklemek için bağdaştırıcı sınıfının kılavuzluk eden
  135. kısmını parametre dizisindeki 'adapterNamespace' anahtarı ile
  136. belirtirseniz <code>factory()</code> metodunu kullanabilirsiniz.
  137. </para>
  138. <example id="zend.db.adapter.connecting.factory.example2">
  139. <title>Bağdaştırıcı factory metodunun özel bağdaştırıcı sınıfı için kullanılması</title>
  140. <programlisting role="php"><![CDATA[<?php
  141. require_once 'Zend/Db.php';
  142. // Otomatik olarak MyProject_Db_Adapter_Pdo_Mysql sınıfını yükle ve instance'ını oluştur.
  143. $db = Zend_Db::factory('Pdo_Mysql', array(
  144. 'host' => '127.0.0.1',
  145. 'username' => 'webuser',
  146. 'password' => 'xxxxxxxx',
  147. 'dbname' => 'test',
  148. 'adapterNamespace' => 'MyProject_Db_Adapter'
  149. ));]]>
  150. </programlisting>
  151. </example>
  152. </sect3>
  153. <sect3 id="zend.db.adapter.connecting.factory-config">
  154. <title>Zend_Config'in Zend_Db Factory ile Kullanımı</title>
  155. <para>
  156. İsterseniz <code>factory()</code> metodunun her iki
  157. argümanını <link linkend="zend.config">Zend_Config</link> tipinde
  158. nesne olarak belirtebilirsiniz.
  159. </para>
  160. <para>
  161. Eğer ilk argüman yapılandırma nesnesi ise kullanılacak sınıfı
  162. adlandıran <code>adapter</code> özelliği içermesi beklenir.
  163. İsteğe bağlı olarak nesne bağdaştırıcı parametre adlarına karşı
  164. gelen alt özellikleri barındıran <code>params</code> adlı
  165. özelliği içerebilir. Bu sadece <code>factory()</code> metodunun
  166. ikinci argümanı olmadığında kullanılır.
  167. </para>
  168. <example id="zend.db.adapter.connecting.factory.example1">
  169. <title>Bağdaştırıcı factory metodunun Zend_Config nesnesiyle kullanımı</title>
  170. <para>
  171. Aşağıdaki örnekte Zend_Config nesnesi diziden oluşturuldu.
  172. Ayrıca veriyi harici bir dosyadan da yükleyebilirsiniz ,
  173. örneğin <link linkend="zend.config.adapters.ini">Zend_Config_Ini</link> veya
  174. <link linkend="zend.config.adapters.xml">Zend_Config_Xml</link> ile.
  175. </para>
  176. <programlisting role="php"><![CDATA[<?php
  177. require_once 'Zend/Config.php';
  178. require_once 'Zend/Db.php';
  179. $config = new Zend_Config(
  180. array(
  181. 'database' => array(
  182. 'adapter' => 'Mysqli',
  183. 'params' => array(
  184. 'dbname' => 'test',
  185. 'username' => 'webuser',
  186. 'password' => 'secret',
  187. )
  188. )
  189. )
  190. );
  191. $db = Zend_Db::factory($config->database);
  192. ));]]>
  193. </programlisting>
  194. </example>
  195. <para>
  196. <code>factory()</code> metodunun ikinci argümanı bağdaştırıcı
  197. parametrelerine karşı gelen kayıtları içeren birleşmeli dizi olabilir.
  198. Bu argüman isteğe bağlı. Eğer ilk argüman Zend_Config tiplerindeyse
  199. tüm parametreleri içerdiği varsayılır ve ikinci argüman gözardı edilir.
  200. </para>
  201. </sect3>
  202. <sect3 id="zend.db.adapter.connecting.parameters">
  203. <title>Bağdaştırıcı Parametreleri</title>
  204. <para>
  205. Aşağıdaki liste Zend_Db Bağdaştırıcı sınıfı tarafından tanımlanan genel parametreleri açıklamaktadır.
  206. </para>
  207. <itemizedlist>
  208. <listitem>
  209. <para>
  210. <emphasis role="strong">host</emphasis>:
  211. veri tabanı sunucusunun hostname'ini veya IP adresini barındıran
  212. string.Eğer veri tabanı , PHP uygulaması ile aynı host'da çalışıyorsa
  213. 'localhost' veya '12.0.0.1' kullanabilirsiniz.
  214. </para>
  215. </listitem>
  216. <listitem>
  217. <para>
  218. <emphasis role="strong">username</emphasis>:
  219. RDBMS sunucusuna oturum açmayı sağlayan hesap tanımlayıcısı.
  220. </para>
  221. </listitem>
  222. <listitem>
  223. <para>
  224. <emphasis role="strong">password</emphasis>:
  225. RDBMS sunucuna oturum açmak için zorunlu olan hesap şifresi.
  226. </para>
  227. </listitem>
  228. <listitem>
  229. <para>
  230. <emphasis role="strong">dbname</emphasis>:
  231. RDBMS sunucusundaki veri tabanı instance adı.
  232. </para>
  233. </listitem>
  234. <listitem>
  235. <para>
  236. <emphasis role="strong">port</emphasis>:
  237. Bazı RDBMS sunucuları yönetici tarafından belirlenen port
  238. numarasından ağ trafiği kabul edebilir.
  239. Port parametresi PHP uygulamanızın RDBMS sunucusunda tanımlı olan
  240. port numarası ile eşleşmesi için port numarasını belirlemeye yarar.
  241. </para>
  242. </listitem>
  243. <listitem>
  244. <para>
  245. <emphasis role="strong">options</emphasis>:
  246. Bu parametre tüm Zend_Db_Adapter sınıflarına
  247. genel olan seçeneklerin birleşmeli dizisidir.
  248. </para>
  249. </listitem>
  250. <listitem>
  251. <para>
  252. <emphasis role="strong">driver_options</emphasis>:
  253. Bu parametre verilen veri tabanı eklentisine ilişkin
  254. ek seçenekler birleşmeli dizisidir.
  255. Bu parametrenin bir tipik kullanımı ise PDO sürücüsünün
  256. özniteliklerini(attribute) vermektir.
  257. </para>
  258. </listitem>
  259. </itemizedlist>
  260. <example id="zend.db.adapter.connecting.parameters.example1">
  261. <title>Factory'ye case-folding seçeneği vermek</title>
  262. <para>
  263. Bu seçeneği <code>Zend_Db::CASE_FOLDING</code>. sabiti ile
  264. belirtebilirsiniz.
  265. Bu , PDO ve IBM DB veri tabanı sürücülerindeki sorgu sonuç setlerindeki
  266. string anahtarlarının küçük , büyük harf durumunu ayarlamaya yarayan <code>ATTR_CASE</code>
  267. özniteliğine karşılık gelmektedir.
  268. Bu seçeneğin aldığı değerler
  269. <code>Zend_Db::CASE_NATURAL</code> (varsayılan),
  270. <code>Zend_Db::CASE_UPPER</code>, ve
  271. <code>Zend_Db::CASE_LOWER</code>.
  272. </para>
  273. <programlisting role="php"><![CDATA[<?php
  274. $options = array(
  275. Zend_Db::CASE_FOLDING => Zend_Db::CASE_UPPER
  276. );
  277. $params = array(
  278. 'host' => '127.0.0.1',
  279. 'username' => 'webuser',
  280. 'password' => 'xxxxxxxx',
  281. 'dbname' => 'test',
  282. 'options' => $options
  283. );
  284. $db = Zend_Db::factory('Db2', $params);]]>
  285. </programlisting>
  286. </example>
  287. <example id="zend.db.adapter.connecting.parameters.example2">
  288. <title>Otomatik tırnaklama seçeneğini factory'ye vermek</title>
  289. <para>
  290. Bu seçeneği <code>Zend_Db::AUTO_QUOTE_IDENTIFIERS</code>
  291. sabiti le belirtebilirsiniz.
  292. Eğer değer <code>true</code> ise , tablo isimleri , sütun isimleri
  293. , hatta alias'lar gibi tanımlayacılar Bağdaştırıcı nesnesi tarafından
  294. oluşturulan SQL sözdiziminde sınırlandırılır. Bu SQL kelimeleri veya özel
  295. karakter içeren tanımlayıcılar kullanmayı kolaylaştırır. Eğer değer
  296. <code>false</code> ise tanımlayıcılar otomatik olarak sınırlandırılmaz.
  297. Eğer tanımlayıcıları sınırlamanız gerekiyorsa <code>quoteIdentifier()</code>
  298. metodunu kullanarak kendiniz yapmalısınız.
  299. </para>
  300. <programlisting role="php"><![CDATA[<?php
  301. $options = array(
  302. Zend_Db::AUTO_QUOTE_IDENTIFIERS => false
  303. );
  304. $params = array(
  305. 'host' => '127.0.0.1',
  306. 'username' => 'webuser',
  307. 'password' => 'xxxxxxxx',
  308. 'dbname' => 'test',
  309. 'options' => $options
  310. );
  311. $db = Zend_Db::factory('Pdo_Mysql', $params);]]>
  312. </programlisting>
  313. </example>
  314. <example id="zend.db.adapter.connecting.parameters.example3">
  315. <title>PDO sürücü seçeneklerini factory'ye vermek</title>
  316. <programlisting role="php"><![CDATA[<?php
  317. $pdoParams = array(
  318. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
  319. );
  320. $params = array(
  321. 'host' => '127.0.0.1',
  322. 'username' => 'webuser',
  323. 'password' => 'xxxxxxxx',
  324. 'dbname' => 'test',
  325. 'driver_options' => $pdoParams
  326. );
  327. $db = Zend_Db::factory('Pdo_Mysql', $params);
  328. echo $db->getConnection()->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);]]>
  329. </programlisting>
  330. </example>
  331. </sect3>
  332. <sect3 id="zend.db.adapter.connecting.getconnection">
  333. <title>Tembel Bağlantıları Yönetmek</title>
  334. <para>
  335. Bağdaştırıcı sınıfının instance'ı oluşturulurken RDBMS sunucusuna
  336. bağlantı hemen sağlanmaz. Bağdaştırıcı bağlantı parametrelerini saklar ve
  337. ilk sorguyu çalıştırdığınız zaman fiili bağlantıyı gerçekleştirir.
  338. Bu Bağdaştırıcı nesnesi oluşturmanın hızlı ve ucuz olmasını sağlar.
  339. Eğer uygulamanız mevcut isteğe cevap verdiği zaman veri tabanı sorguları
  340. çalıştırmanız gerektiğinden emin değilseniz bile Bağdaştırıcı sınıfı
  341. instance'ı oluşturabilirsiniz.
  342. </para>
  343. <para>
  344. Eğer Bağdaştırıcıyı RDBMS'e bağlanmaya zorlamanız gerekiyorsa ,
  345. <code>getConnection()</code> metodunu kullanın. Bu metod
  346. kendi PHP veri tabanı eklentisinde daha önce gösterildiği gibi
  347. bağlantı için nesne döndürür. Örneğin PDO sürücüleri için herhangi
  348. bir Bağdaştırıcı sınıfını kullandığınızda , <code>getConnection()</code>
  349. metodu kendine özgü veri tabanına canlı bağlantı başlattıktan sonra
  350. PDO nesnesini döndürür.
  351. </para>
  352. <para>
  353. Geçersiz hesap bilgileri sunulması veya diğer RDBMS sunucusuna bağlantı
  354. problemleri sonucunda exception yakalamak için bağlanmaya zorlamak
  355. faydalı olabilir.
  356. veri tabanında ilk sorgu çalıştırıldığı zamandan ziyade
  357. bu exeption'lar bağlantı yapılana kadar ortaya çıkmaz,
  358. eğer exeptionları bir yerde idare ediyorsanız uygulama kodunuzu
  359. basitleştirmenize yardım edebilir.
  360. </para>
  361. <example id="zend.db.adapter.connecting.getconnection.example">
  362. <title>Bağlantı exeption'larının idare edilmesi</title>
  363. <programlisting role="php"><![CDATA[<?php
  364. try {
  365. $db = Zend_Db::factory('Pdo_Mysql', $parameters);
  366. $db->getConnection();
  367. } catch (Zend_Db_Adapter_Exception $e) {
  368. // muhtemelen geçersiz oturum bilgisi ,veya belki de RDBMS çalışmıyor
  369. } catch (Zend_Exception $e) {
  370. // muhtemelen factory() belirli Bağdaştırıcı sınıfını yükleyemedi
  371. }]]>
  372. </programlisting>
  373. </example>
  374. </sect3>
  375. </sect2>
  376. <sect2 id="zend.db.adapter.example-database">
  377. <title>Örnek veri tabanı</title>
  378. <para>
  379. Zend_Db sınıfları için belgelerde sınıfların ve metodların
  380. kullanımını tasvir etmek için birtakım basit tablolar kullanıyoruz.
  381. Bu örnek tablolar bir yazılım geliştirme projesinde hataların
  382. takibi için bilgi depolayabilir. veri tabanı dört tablodan oluşuyor:
  383. </para>
  384. <itemizedlist>
  385. <listitem>
  386. <para>
  387. <emphasis role="strong">accounts</emphasis>
  388. hata izleme veri tabanında her kullanıcının bilgisini tutuyor.
  389. </para>
  390. </listitem>
  391. <listitem>
  392. <para>
  393. <emphasis role="strong">products</emphasis>
  394. hata raporlanabilecek herbir ürün hakkında bilgi tutuyor.
  395. </para>
  396. </listitem>
  397. <listitem>
  398. <para>
  399. <emphasis role="strong">bugs</emphasis>
  400. Hatalar hakkında bilgi tutuyor , hatanın şuanki durumu ,
  401. hatayı raporlayan kişi , hatayı düzeltmek için atanmış kişi ,
  402. düzeltmeyi doğrulamak için atanmış kişi.
  403. </para>
  404. </listitem>
  405. <listitem>
  406. <para>
  407. <emphasis role="strong">bugs_products</emphasis>
  408. Hatalar ile ürünler arasındaki ilişkiyi tutuyor.
  409. Bu çoktan çoğa (many-to-many) ilişkiselliği sağlar ,
  410. çünkü verilen hata birden çok ürün ile ilgili olabilir ,
  411. ve tabiki verilen ürünün birden çok hatası olabilir.
  412. </para>
  413. </listitem>
  414. </itemizedlist>
  415. <para>
  416. Takip eden SQL veri tanımlama dili sözde kodu(pseudocode) örnek veri tabanındaki
  417. tabloları açıklamaktadır. Bu örnek tablolar Zend_Db için otomatikleştirilmiş
  418. birim testleri(unit test) tarafından yaygınca kullanılmıştır.
  419. </para>
  420. <programlisting role="sql"><![CDATA[
  421. CREATE TABLE accounts (
  422. account_name VARCHAR(100) NOT NULL PRIMARY KEY
  423. );
  424. CREATE TABLE products (
  425. product_id INTEGER NOT NULL PRIMARY KEY,
  426. product_name VARCHAR(100)
  427. );
  428. CREATE TABLE bugs (
  429. bug_id INTEGER NOT NULL PRIMARY KEY,
  430. bug_description VARCHAR(100),
  431. bug_status VARCHAR(20),
  432. reported_by VARCHAR(100) REFERENCES accounts(account_name),
  433. assigned_to VARCHAR(100) REFERENCES accounts(account_name),
  434. verified_by VARCHAR(100) REFERENCES accounts(account_name)
  435. );
  436. CREATE TABLE bugs_products (
  437. bug_id INTEGER NOT NULL REFERENCES bugs,
  438. product_id INTEGER NOT NULL REFERENCES products,
  439. PRIMARY KEY (bug_id, product_id)
  440. );]]>
  441. </programlisting>
  442. <para>
  443. Ayrıca dikkat ederseniz <code>bugs</code> tablosu <code>accounts</code> tablosunu
  444. kaynak gösteren birçok foreign key içeriyor. Bu foreign key'lerin herbiri verilen hata
  445. için <code>accounts</code> tablosundaki farklı bir satırı kaynak gösterebilir.
  446. </para>
  447. <para>
  448. Aşağıdaki şema örnek veri tabanının fiziksel veri modelini tasvir etmektedir.
  449. </para>
  450. <para>
  451. <inlinegraphic width="387" scale="100" align="center" valign="middle"
  452. fileref="../figures/zend.db.adapter.example-database.png" format="PNG" />
  453. </para>
  454. </sect2>
  455. <sect2 id="zend.db.adapter.select">
  456. <title>Sorgu Sonuçlarını Okumak</title>
  457. <para>
  458. Bu bölüm SELECT sorguları çalıştırabileceğiniz ve sorgu sonuçlarına
  459. erişebileceğiniz Bağdaştırıcı sınıfı metodlarını açıklamaktadır.
  460. </para>
  461. <sect3 id="zend.db.adapter.select.fetchall">
  462. <title>Tüm sonuç listesinin alınması</title>
  463. <para>
  464. SQL SELECT sorgusu çalıştırıp , sonuçlarını <code>fetchAll()</code>
  465. metodunu kullanarak tek bir adımda getirebilirsiniz.
  466. </para>
  467. <para>
  468. Bu metodun aldığı ilk argüman SELECT deyimini içeren bir string'dir.
  469. Alternatif olarak ilk argüman bir sınıfın nesnesi <link linkend="zend.db.select">Zend_Db_Select</link>
  470. olabilir. Bağdaştırıcı otomatik olarak bu nesneyi SELECT deyiminin string gösterimine
  471. dönüştürür.
  472. </para>
  473. <para>
  474. <code>fetchAll()</code>'ın ikinci argümanı SQL deyiminde sembol yerini
  475. alan değerler dizisidir.
  476. </para>
  477. <example id="zend.db.adapter.select.fetchall.example">
  478. <title>fetchAll() kullanmak</title>
  479. <programlisting role="php"><![CDATA[<?php
  480. $sql = 'SELECT * FROM bugs WHERE bug_id = ?';
  481. $result = $db->fetchAll($sql, 2);]]>
  482. </programlisting>
  483. </example>
  484. </sect3>
  485. <sect3 id="zend.db.adapter.select.fetch-mode">
  486. <title>Sonuç alma (Fetch) Modunun değiştirilmesi</title>
  487. <para>
  488. Varsayılan olarak <code>FetchAll()</code> herbiri ilişkili dizi olan
  489. satırlar dizisi geri döndürür. İlişkili dizinin anahtarları select sorgusunda
  490. isimlendirilen sütunlar veya sütun takma isimleridir (alias).
  491. </para>
  492. <para>
  493. <code>setFetchMode()</code> metodunu kullanarak sonuç alma modunu belirleyebilirsiniz.
  494. Desteklenen modlar sabitler tarafından tanımlanmaktadır:
  495. </para>
  496. <itemizedlist>
  497. <listitem>
  498. <para>
  499. <emphasis role="strong">Zend_Db::FETCH_ASSOC</emphasis>:
  500. Veriyi ilişkili diziler olarak döndürür.
  501. Dizi anahtarları string olarak sütun adlarıdır.
  502. Bu Zend_Db_Adapter sınıflarında varsayılan sonuç alma modudur.
  503. </para>
  504. <para>
  505. Eğer select listesi aynı isimli sütunlar içeriyorsa ,
  506. örneğin JOIN ile farklı tablolardan geliyorsa ilişkili
  507. dizide verilen isim için sadece bir girdi olabilir.
  508. Eğer FETCH_ASSOC modunu kullanırsanız , eşsiz dizi
  509. anahtarları sağlamak için SELECT sorgunuzda sütun
  510. takma isimlerini (alias) belirlemelisiniz.
  511. </para>
  512. <para>
  513. Bu stringler varsayılan olarak veri tabanı sürücüsünden
  514. döndüğü gibi döner.Bu tipik olarak RDBMS sunucusundaki
  515. sütun imlasıdır. Bu stringlerin küçük,büyük harf durumunu
  516. <code>Zend_Db::CASE_FOLDING</code> seçeneğini kullanarak
  517. belirleyebilirsiniz.Bunu bir örnekle desteklemek gerekirse ,
  518. bakınız <xref linkend="zend.db.adapter.connecting.parameters.example1" />.
  519. </para>
  520. </listitem>
  521. <listitem>
  522. <para>
  523. <emphasis role="strong">Zend_Db::FETCH_NUM</emphasis>:
  524. veriyi dizi içinde diziler olarak döndürür. Bu diziler
  525. sorgunun select listesi alanlarının pozizyonlarına karşı gelen
  526. tamsayılar tarafından indekslenir.
  527. </para>
  528. </listitem>
  529. <listitem>
  530. <para>
  531. <emphasis role="strong">Zend_Db::FETCH_BOTH</emphasis>:
  532. veriyi dizi içinde diziler olarak döndürür. Dizi anahtarları
  533. FETCH_ASSOC modunda kullanıldığı gibi hem stringler hemde FETCH_NUM
  534. modunda kullanıldığı gibi tamsayılardır.Dikkat edilirse
  535. dizideki öğe sayısı FETCH_ASSOC veya FETCH_NUM kullanımındakinin
  536. iki katıdır.
  537. </para>
  538. </listitem>
  539. <listitem>
  540. <para>
  541. <emphasis role="strong">Zend_Db::FETCH_COLUMN</emphasis>:
  542. veriyi değerler dizisi olarak döndürür. Her dizideki değer
  543. sonuç listesindeki bir sütundan dönen değerdir. Varsayılan olarak
  544. bu 0 ile indekslenmiş ilk sütundur.
  545. </para>
  546. </listitem>
  547. <listitem>
  548. <para>
  549. <emphasis role="strong">Zend_Db::FETCH_OBJ</emphasis>:
  550. veriyi nesneler dizisi olarak döndürür. Varsayılan
  551. sınıf PHP yerleşik stdClass sınıfıdır. Sonuç listesinin
  552. sütunları nesnenin genel (public) özellikleridir.
  553. </para>
  554. </listitem>
  555. </itemizedlist>
  556. <example id="zend.db.adapter.select.fetch-mode.example">
  557. <title>setFetchMode() Kullanımı</title>
  558. <programlisting role="php"><![CDATA[<?php
  559. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  560. $result = $db->fetchAll('SELECT * FROM bugs WHERE bug_id = ?', 2);
  561. // $result nesneler dizisi
  562. echo $result[0]->bug_description;]]>
  563. </programlisting>
  564. </example>
  565. </sect3>
  566. <sect3 id="zend.db.adapter.select.fetchassoc">
  567. <title>Sonuç listesinin Birleşmeli Dizi olarak Alınması</title>
  568. <para>
  569. <code>fetchAssoc()</code> metodu sonuç alma moduna bakmaksızın
  570. veriyi birleşmeli diziler olarak döndürür.
  571. </para>
  572. <example id="zend.db.adapter.select.fetchassoc.example">
  573. <title>fetchAssoc() Kullanımı</title>
  574. <programlisting role="php"><![CDATA[<?php
  575. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  576. $result = $db->fetchAssoc('SELECT * FROM bugs WHERE bug_id = ?', 2);
  577. // $result sonuç alma moduna rağmen birleşmeli diziler dizisi
  578. echo $result[0]['bug_description'];]]>
  579. </programlisting>
  580. </example>
  581. </sect3>
  582. <sect3 id="zend.db.adapter.select.fetchcol">
  583. <title>Sonuç Listesinden bir Sütunun Alınması</title>
  584. <para>
  585. <code>fetchCol()</code> metodu sonuç alma moduna bakmaksızın
  586. veriyi değerler dizisi olarak döndürür.
  587. Bu sorgu tarafından döndürülen ilk sütunu döndürür.
  588. Sorgu tarafından döndürülen diğer sütunlar döndürülmez.
  589. Eğer ilk sütundan başka sütunu döndürmeniz gerkiyorsa
  590. bakınız <xref linkend="zend.db.statement.fetching.fetchcolumn" />.
  591. </para>
  592. <example id="zend.db.adapter.select.fetchcol.example">
  593. <title>fetchCol() Kullanımı</title>
  594. <programlisting role="php"><![CDATA[<?php
  595. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  596. $result = $db->fetchCol('SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2);
  597. // bug_description'ı içeriyor;bug_id döndürülmedi
  598. echo $result[0];]]>
  599. </programlisting>
  600. </example>
  601. </sect3>
  602. <sect3 id="zend.db.adapter.select.fetchpairs">
  603. <title>Sonuç Listesinden Anahtar-Değer Çiftlerinin Alınması</title>
  604. <para>
  605. <code>fetchPairs()</code> metodu satır başına tek bir kayıt
  606. gelecek şekilde veriyi anahtar-değer çiftleri birleşmeli dizisi
  607. olarak döndürür.Bu birleşmeli dizinin anahtarı SELECT sorgusu
  608. tarafından döndürülen ilk sütundur. Değer ise SELECT sorgusu
  609. tarafından döndürülen ikinci sütundur. Sorgu tarafından döndürülen
  610. herhangi diğer sütunlar gözardı edilir.
  611. </para>
  612. <para>
  613. Döndürülen ilk sütun eşsiz değerler içerecek şekilde SELECT
  614. sorgunuzu tasarlamalısınız. Eğer ilk sütunda birbirinin kopyası
  615. değerler bulunuyorsa birleşmeli dizideki kayıtların üzerine
  616. yazılacaktır.
  617. </para>
  618. <example id="zend.db.adapter.select.fetchpairs.example">
  619. <title>fetchPairs() Kullanımı</title>
  620. <programlisting role="php"><![CDATA[<?php
  621. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  622. $result = $db->fetchPairs('SELECT bug_id, bug_status FROM bugs');
  623. echo $result[2];]]>
  624. </programlisting>
  625. </example>
  626. </sect3>
  627. <sect3 id="zend.db.adapter.select.fetchrow">
  628. <title>Sonuç listesinden Bir Satırın Alınması</title>
  629. <para>
  630. <code>fetchRow()</code> metodu mevcut sonuç alım modunu
  631. kullanarak veri döndürür ama sadece sonuç listesinin ilk satırını
  632. döndürür.
  633. </para>
  634. <example id="zend.db.adapter.select.fetchrow.example">
  635. <title>fetchRow() Kullanımı</title>
  636. <programlisting role="php"><![CDATA[<?php
  637. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  638. $result = $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2');
  639. // dikkat edilirse $result tek bir nesne , nesneler dizisi değil
  640. echo $result->bug_description;]]>
  641. </programlisting>
  642. </example>
  643. </sect3>
  644. <sect3 id="zend.db.adapter.select.fetchone">
  645. <title>Sonuç listesinden Bir Niceliğin Alınması</title>
  646. <para>
  647. <code>fetchOne()</code> metodu <code>fetchRow()</code> ile
  648. <code>fetchCol()</code> metodunun kombinasyonuna benzediğinden
  649. dolayı sadece sonuç listesinden alınan ilk satırı ve satırdaki
  650. ilk sütun değerini döndürür. Bundan dolayı tek bir nicelik
  651. döndürür , dizi veya nesne değil.
  652. </para>
  653. <example id="zend.db.adapter.select.fetchone.example">
  654. <title>fetchOne() Kullanımı</title>
  655. <programlisting role="php"><![CDATA[<?php
  656. $result = $db->fetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2');
  657. // bu yalnızca string değerdir
  658. echo $result;]]>
  659. </programlisting>
  660. </example>
  661. </sect3>
  662. </sect2>
  663. <sect2 id="zend.db.adapter.write">
  664. <title>Değişikliklerin veri tabanına Yazılması</title>
  665. <para>
  666. Bağdaştırıcı sınıfını yeni veri yazmak için veya varolan veriyi
  667. değiştirmek için kullanabilirsiniz. Bu bölüm bu işlemleri yapma
  668. metodlarını açıklıyor.
  669. </para>
  670. <sect3 id="zend.db.adapter.write.insert">
  671. <title>Veri Eklenmesi</title>
  672. <para>
  673. <code>insert()</code> metodunu kullarak veri tabanınızdaki
  674. tabloya yeni satırlar ekliyebilirsiniz. İlk argüman tablo adı,
  675. ve ikinci argüman ise sütun isimlerini veri değerlerine
  676. eşleyen birleşmeli dizi.
  677. </para>
  678. <example id="zend.db.adapter.write.insert.example">
  679. <title>Tabloya Veri Eklemek</title>
  680. <programlisting role="php"><![CDATA[<?php
  681. $data = array(
  682. 'created_on' => '2007-03-22',
  683. 'bug_description' => 'Something wrong',
  684. 'bug_status' => 'NEW'
  685. );
  686. $db->insert('bugs', $data);]]>
  687. </programlisting>
  688. </example>
  689. <para>
  690. Veri dizisine eklemediğiniz sütunlar veri tabanına belirtilmez.
  691. Bu sebepten SQL INSERT deyiminin uyduğu kurallara uyarlar:
  692. Eğer sütunun DEFAULT deyimi varsa sütun oluşturulan satırda
  693. varsayılan değeri alır , aksi halde sütun boş(NULL) durumda
  694. bırakılır.
  695. </para>
  696. <para>
  697. Varsayılan olarak veri dizinizdeki değerler parametreler kullanılarak
  698. eklenir. Bu bazı tip güvenlik sorunları riskini azaltır.
  699. Veri dizinizdeki değerlere kaçış (escaping) veya tırnaklama (quoting)
  700. uygulamanıza gerek yok.
  701. </para>
  702. <para>
  703. Veri dizisinde tırnak içinde tutulmaması gereken durumda
  704. SQL ifadesi sayılan değerlere ihtiyaç duyabilirsiniz.
  705. Varsayılan olarak string veri değerleri yalın string
  706. olarak sayılır. Değerin SQL ifadesi olduğunu , bundan
  707. dolayı tırnak içine alınmaması gerektiğini belirtmek için
  708. düz metin olarak vermek yerine veri dizisindeki değeri
  709. Zend_Db_Expre tipinde nesne olarak verin.
  710. </para>
  711. <example id="zend.db.adapter.write.insert.example2">
  712. <title>İfadelerin Tabloya Eklenmesi</title>
  713. <programlisting role="php"><![CDATA[<?php
  714. $data = array(
  715. 'created_on' => new Zend_Db_Expr('CURDATE()'),
  716. 'bug_description' => 'Something wrong',
  717. 'bug_status' => 'NEW'
  718. );
  719. $db->insert('bugs', $data);]]>
  720. </programlisting>
  721. </example>
  722. </sect3>
  723. <sect3 id="zend.db.adapter.write.lastinsertid">
  724. <title>Oluşturulmuş Değere Erişmek</title>
  725. <para>
  726. Bazı RDBMS markaları brincil anahtarların otomatik artışını (auto_increment)
  727. destekler. Bu şekilde tanımlanmış bir tablo , yeni satır eklenmesinde (INSERT) otomatik
  728. olarak birincil anahtar değeri oluşturur. <code>insert()</code> metodunun döndürdüğü
  729. değer son eklenen ID <emphasis>değildir</emphasis> , çünkü tablo otomatik artan sütuna
  730. sahip olmayabilir. Bunun yerine dönen değer etkilenen satır sayısıdır. ( genellikle 1)
  731. </para>
  732. <para>
  733. Eğer tablonuz otomatik artan birincil anahtar ile tanımlanmış ise ,
  734. ekleme ardından <code>lastInsertId()</code> metodunu çağırabilirsiniz.
  735. Bu metod mevcut veri tabanı bağlantısı kapsamında oluşturulan son değeri
  736. döndürür.
  737. </para>
  738. <example id="zend.db.adapter.write.lastinsertid.example-1">
  739. <title>Otomatik artış anahtarı için lastInsertId() kullanımı</title>
  740. <programlisting role="php"><![CDATA[<?php
  741. $db->insert('bugs', $data);
  742. // otomatik artışlı sütun tarafından oluşturulan son değeri döndür
  743. $id = $db->lastInsertId();]]>
  744. </programlisting>
  745. </example>
  746. <para>
  747. Bazı RDBMS markaları eşsiz değerler üreterek birincil anahtar
  748. vazifesi gören sequence nesnesi destekliyor. Sequence'i desteklemek
  749. için <code>lastInsertId()</code> metodu iki tane isteğe bağlı string
  750. argüman alıyor.
  751. Değerler üreten bir sequence için sequence'i tablo ve sütun isimleri
  752. kullanılarak adlandırma kuralına uyduğun varsayılarak bu argümanlar
  753. tablo ve sütunları isimlendirir ve "_seq" sonekini alır.
  754. Bu PostgreSQL tarafından kullanılan seri (SERIAL) sütunlar için sequenceları
  755. adlandırma kuralına dayanır. Örneğin "bug_id" birincil anahtar sütunlu
  756. "bugs" tablosu "bugs_bug_id_seq" olarak adlandırılmış sequence kullanır.
  757. </para>
  758. <example id="zend.db.adapter.write.lastinsertid.example-2">
  759. <title>lastInsertId()'nin sequence için kullanılması</title>
  760. <programlisting role="php"><![CDATA[<?php
  761. $db->insert('bugs', $data);
  762. // 'bugs_bug_id_seq' sequence'i tarafından üretilen son değeri döndür.
  763. $id = $db->lastInsertId('bugs', 'bug_id');
  764. // alternatif olarak 'bugs_seq' squence'i tarafından üretilen son değeri döndür.
  765. $id = $db->lastInsertId('bugs');]]>
  766. </programlisting>
  767. </example>
  768. <para>
  769. Eğer sequence nesnenizin adı bu adlandırma kuralına uymuyorsa
  770. , bunun yerine <code>lastSequenceId()</code> metodunu kullanın.
  771. Bu metod sequence'i harfi harfine adlandıran tek bir string
  772. argüman alıyor.
  773. </para>
  774. <example id="zend.db.adapter.write.lastinsertid.example-3">
  775. <title>lastSequenceId() Kullanımı</title>
  776. <programlisting role="php"><![CDATA[<?php
  777. $db->insert('bugs', $data);
  778. // 'bugs_id_gen' sequence'i tarafından üretilen son değeri döndür.
  779. $id = $db->lastSequenceId('bugs_id_gen');]]>
  780. </programlisting>
  781. </example>
  782. <para>
  783. Sequence'ları desteklemeyen RDBMS markaları için ,bunlara
  784. MySQL , Microsoft SQL Server ve SQLite'da dahil , lastInsertId()
  785. metoduna verilen argümanlar gözardı edilir ve döndürülen değer
  786. mevcut bağlantı sırasında INSERT işlemleri ile meydana gelen
  787. en son değer döndürülür. Bu RDBMS markaları için lastSequenceId()
  788. metodu herzaman için <code>null</code> döndürür.
  789. </para>
  790. <note>
  791. <title>Neden "SELECT MAX(id) FROM table" kullanılmamalı ?</title>
  792. <para>
  793. Bazen bu sorgu tabloya en son eklenen birincil anahtar değerini
  794. döndürür.Ancak bu tekniğin birden çok istemcinin veri tabanına
  795. kayıt eklediği ortamlarda kullanılması güvenli değildir. İstemci
  796. uygulamanız tarafından Max(id) sorgusu gerçekleştirildiği
  797. sırada başka bir istemcinin başka bir satır eklemesi mümküm ve işte
  798. bu yüzden bu eninde sonunda gerçekleşecektir. Böylece geri döndürülen
  799. değer sizin eklediğiniz satırı değil , diğer istemci tarafından eklenen
  800. satırı tanımlıyacak.
  801. Bunun ne zaman gerçekleştiğini bilmeninde bir yolu yok.
  802. </para>
  803. <para>
  804. "repeatable read" gibi güçlü hareket(transaction) yalıtım
  805. modu kullanılması riski azaltabilir ama , bazı RDBMS markaları
  806. bunun için gerekli hareket yalıtımını(isolation) desteklemez veya
  807. uygulamanız tasarımı gereği daha düşük seviye hareket yalıtımı kullanır.
  808. </para>
  809. <para>
  810. Üstelik yeni birincil anahtar değeri elde etmek için "MAX(id)+1"
  811. ifadesinin kullanılması da güvenli değildir çünkü iki istemci
  812. eş zamanlı olarak bu sorguyu gerçekleştirebilir ve sonra ikiside
  813. gelecek INSERT işlemleri için hesaplanan aynı değeri kullanır.
  814. </para>
  815. <para>
  816. Tüm RDBMS markalarının eşsiz değerler üretmek ve üretilen
  817. son değeri geri döndürmek için mekanizmaları vardır.
  818. Bu mekanizmalar ister istemez hareket yalıtımı kapsamı dışında
  819. çalışıyor bu yüzden iki istemcinin aynı değeri üretmesi ve başka
  820. bir istemci tarafından değer üretildiğinde istemcinizin bağlantısına
  821. bildirilme şansı yoktur.
  822. </para>
  823. </note>
  824. </sect3>
  825. <sect3 id="zend.db.adapter.write.update">
  826. <title>Verinin Güncellenmesi</title>
  827. <para>
  828. Bağdaştırıcının <code>update()</code> metodunu kullanarak
  829. veri tabanı tablosundaki satırları güncelleyebilirsiniz.
  830. Bu metod üç argüman alıyor: ilki tablonun adı ; ikincisi
  831. değiştirilecek sütunları alacakları yeni değerlere eşleyen
  832. birleşmeli dizi.
  833. </para>
  834. <para>
  835. Veri dizisindeki değerler düz string muamelesi görür.
  836. Veri dizisinde SQL ifadeleri kullanımı hakkında daha
  837. fazla bilgi için bakınız <xref linkend="zend.db.adapter.write.insert" />
  838. </para>
  839. <para>
  840. Üçüncü argüman değişecek satırlar için kriter olarak kullanılan
  841. SQL ifadesi içeren stringdir.Bu argümandaki değerler ve tanımlayıcılara
  842. tırnaklanma veya kaçış uygulanmaz. String'e dinamik içeriğin güvenle
  843. eklenmesinden siz sorumlusunuz. Buna yardımcı olacak metodlar için
  844. bakınız <xref linkend="zend.db.adapter.quoting" />.
  845. </para>
  846. <para>
  847. Geri döndürülen değer güncelleme işleminden etkilenen satır sayısıdır.
  848. </para>
  849. <example id="zend.db.adapter.write.update.example">
  850. <title>Satırların güncellenmesi</title>
  851. <programlisting role="php"><![CDATA[<?php
  852. $data = array(
  853. 'updated_on' => '2007-03-23',
  854. 'bug_status' => 'FIXED'
  855. );
  856. $n = $db->update('bugs', $data, 'bug_id = 2');]]>
  857. </programlisting>
  858. </example>
  859. <para>
  860. Eğer üçüncü argümanı koymazsanız veri tabanı tablosundaki tüm
  861. satırlar veri dizisinde belirtilen değerler ile güncellenir.
  862. </para>
  863. <para>
  864. Üçüncü argümana stringler dizisi verirseniz , bu stringler
  865. <code>AND</code> operatörü ile ayrıştırılmış ifadede terimler
  866. olarak birleştirilir.
  867. </para>
  868. <example id="zend.db.adapter.write.update.example-array">
  869. <title>Satırların ifadeler dizisi kullanılarak güncellenmesi</title>
  870. <programlisting role="php"><![CDATA[<?php
  871. $data = array(
  872. 'updated_on' => '2007-03-23',
  873. 'bug_status' => 'FIXED'
  874. );
  875. $where[] = "reported_by = 'goofy'";
  876. $where[] = "bug_status = 'OPEN'";
  877. $n = $db->update('bugs', $data, $where);
  878. // SQL'in son hali:
  879. // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
  880. // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')]]>
  881. </programlisting>
  882. </example>
  883. </sect3>
  884. <sect3 id="zend.db.adapter.write.delete">
  885. <title>Veri Silme</title>
  886. <para>
  887. <code>delete()</code> metodunu kullanarak veri tabanı tablosundan
  888. satırlar silebilirsiniz. Bu metod iki argüman alıyor:
  889. ilki tabloyu isimlendiren string.
  890. </para>
  891. <para>
  892. İkinci argüman silinecek satırlar için kriter olarak kullanılan
  893. SQL ifadesi içeren string.Bu argümandaki değerler ve tanımlayıcılara
  894. tırnaklanma veya kaçış uygulanmaz.String'e dinamik içeriğin güvenle
  895. eklenmesinden siz sorumlusunuz. Buna yardımcı olacak metodlar için
  896. bakınız <xref linkend="zend.db.adapter.quoting" />.
  897. </para>
  898. <para>
  899. Geri döndürülen değer silme işleminden etkilenen satır sayısıdır.
  900. </para>
  901. <example id="zend.db.adapter.write.delete.example">
  902. <title>Satırların silinmesi</title>
  903. <programlisting role="php"><![CDATA[<?php
  904. $n = $db->delete('bugs', 'bug_id = 3');]]>
  905. </programlisting>
  906. </example>
  907. <para>
  908. Eğer üçüncü argümanı koymazsanız bunun sonucunda veri tabanı
  909. tablosundaki tüm satırlar silinir.
  910. </para>
  911. <para>
  912. Üçüncü argümana stringler dizisi verirseniz , bu stringler
  913. <code>AND</code> operatörü ile ayrıştırılmış ifadede terimler
  914. olarak birleştirilir.
  915. </para>
  916. </sect3>
  917. </sect2>
  918. <sect2 id="zend.db.adapter.quoting">
  919. <title>Değerlerin ve Tanımlayıcıların Tırnaklanması</title>
  920. <para>
  921. SQL sorgularını biçimlendirdiğiniz zaman sık sık PHP değişkenlerinin
  922. değerlerini SQL ifadesine eklemeniz gerekir.Bu risklidir çünkü , eğer
  923. PHP string'i tırnak sembolü gibi belli sembolleri içerirse geçersiz SQL'e
  924. sebep olur. Örneğin takip eden sorgudaki tırnakların dengesizliğine
  925. dikkat edin:
  926. <programlisting role="php"><![CDATA[
  927. $name = "O'Reilly";
  928. $sql = "SELECT * FROM bugs WHERE reported_by = '$name'";
  929. echo $sql;
  930. // SELECT * FROM bugs WHERE reported_by = 'O'Reilly']]>
  931. </programlisting>
  932. </para>
  933. <para>
  934. En kötüsü ise böyle kod hatalarının web uygulamanızın işlevini
  935. değiştirmek isteyen biri tarafından tasarlanarak sömürülebilmesi(exploitlenmesi).
  936. Eğer PHP değişkeninizin değerini HTTP parametresi veya başka bir mekanizma ile
  937. belirtebiliyorlarsa , kişinin okumaya yetkisi olmayabilecek verinin geri döndürülmesi
  938. gibi SQL sorgunuzun yapmasını istemediğiniz şeyleri yapmasını sağlayabilirler.
  939. Bu "SQL Injection" olarak bilinen ciddi ve yaygın uygulama güvenliği ihlali tekniğidir
  940. (bakınız <ulink url="http://en.wikipedia.org/wiki/SQL_Injection">http://en.wikipedia.org/wiki/SQL_Injection</ulink>).
  941. </para>
  942. <para>
  943. Zend_Db Bağdaştırıcı sınıfı PHP kodunuzun SQL Injection saldırılarına
  944. karşı açıkları azaltmanıza yardımcı olan kullanışlı fonksiyonlar sağlamaktadır.
  945. Çözüm ise PHP değerlerindeki tırnaklar gibi özel karakterlere SQL stringlerinize
  946. katılmadan kaçış uygulamak(escaping).
  947. </para>
  948. <sect3 id="zend.db.adapter.quoting.quote">
  949. <title><code>quote()</code> Kullanımı</title>
  950. <para>
  951. <code>quote()</code> metodu boyutsuz(vektörel olmayan) bir argüman
  952. alıyor. Değeri kullandığınız RDBMS'e göre özel karakterlere kaçış
  953. uygulayarak ve string değer sınırlayıcıları ile çevreleyip döndürür.
  954. Standart SQL string değer sınırlayıcısı tek tırnaktır (<code>'</code>).
  955. </para>
  956. <example id="zend.db.adapter.quoting.quote.example">
  957. <title>quote() Kullanımı</title>
  958. <programlisting role="php"><![CDATA[<?php
  959. $name = $db->quote("O'Reilly");
  960. echo $name;
  961. // 'O\'Reilly'
  962. $sql = "SELECT * FROM bugs WHERE reported_by = $name";
  963. echo $sql;
  964. // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly']]>
  965. </programlisting>
  966. </example>
  967. <para>
  968. Dikkat , <code>quote()</code> 'un döndürdüğü değer string etrafındaki
  969. tırnak sınırlayıcılarınıda içeriyor. Bu özel karakterlere kaçış uygulayan
  970. bazı fonksiyonlardan farklı ama tırnak sınırlayıcılarını eklemiyor ,
  971. örneğin <ulink url="http://www.php.net/mysqli_real_escape_string">mysql_real_escape_string()</ulink>.
  972. </para>
  973. <para>
  974. Kullanıldıkları SQL veritipi bağlamında değerlerin tırnaklanması veya tırnaklanmaması
  975. gerekebilir. Örneğin bazı RDBMS markalarında tam sayı değerler eğer tamsayı tipinde bir
  976. sütunla veya ifadeyle karşılaştırılıyorsa string gibi tırnaklanmamalı. Diğer bir ifadeyle
  977. , <code>intColumn</code> 'un SQL veritipinin <code>INTEGER</code> olduğunu varsayarsak
  978. bazı SQL yürütmelerinde takip eden sorgu hata verecektir.
  979. <programlisting role="php"><![CDATA[
  980. SELECT * FROM atable WHERE intColumn = '123']]>
  981. </programlisting>
  982. </para>
  983. <para>
  984. Belirttiğiniz SQL veritipi için opsiyonel ikinci
  985. argümanı kullanabilirsiniz.
  986. </para>
  987. <example id="zend.db.adapter.quoting.quote.example-2">
  988. <title>quote()'un SQL tipi ile kullanımı</title>
  989. <programlisting role="php"><![CDATA[<?php
  990. $value = '1234';
  991. $sql = 'SELECT * FROM atable WHERE intColumn = '
  992. . $db->quoteType($value, 'INTEGER');
  993. ]]>
  994. </programlisting>
  995. </example>
  996. <para>
  997. Her Zend_Db_Adapter sınıfı sayısal SQL veritiplerini karşı gelen
  998. RDBMS markaları için kodlamıştır. Ayrıca sabitleri (<code>Zend_Db::INT_TYPE</code>,
  999. <code>Zend_Db::BIGINT_TYPE</code>, ve <code>Zend_Db::FLOAT_TYPE</code>) kullanarak
  1000. daha RDBMS bağımsız şekilde kod yazabilirsiniz.
  1001. </para>
  1002. <para>
  1003. Tabloların anahtar sütunlarına başvuran SQL sorguları üretirken
  1004. Zend_Db_Table SQL tiplerini <code>quote()</code>'a belirtir.
  1005. </para>
  1006. </sect3>
  1007. <sect3 id="zend.db.adapter.quoting.quote-into">
  1008. <title><code>quoteInto()</code> Kullanımı</title>
  1009. <para>
  1010. Tırnaklamanın en tipik kullanım şekli bir PHP değişkenini
  1011. SQL ifadesi veya deyimine katmaktır. <code>quoteInto()</code>
  1012. metodunu kullanarak bunu bir adımda yapabilirsiniz. Bu metod
  1013. iki argüman alıyor: ilk argüman yer tutucu sembolü (<code>?</code>)
  1014. içeren string , ve ikinci argüman ise yer tutucu yerine koyulacak
  1015. bir değer veya PHP değişkeni olmalı.
  1016. </para>
  1017. <para>
  1018. Yer tutucu sembolü birçok RDBMS markası tarafından kullanılan
  1019. konumsal parametreler için kullanan sembolle aynıdır , ama
  1020. <code>quoteInto()</code> metodu sadece sorgu parametrelerini
  1021. öykünür(emule eder). Metod basitce değeri stringe ekler ,
  1022. özel karakterlere kaçış uygular ve etrafını tırnaklar.
  1023. Doğru sorgu parametreleri SQL stringi ile parametrelerin
  1024. ayrılmasını , deyim RDBMS sunucusundaymış gibi ayıklanmasına sağlar.
  1025. </para>
  1026. <example id="zend.db.adapter.quoting.quote-into.example">
  1027. <title>quoteInto() Kullanımı</title>
  1028. <programlisting role="php"><![CDATA[<?php
  1029. $sql = $db->quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");
  1030. echo $sql;
  1031. // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly']]>
  1032. </programlisting>
  1033. </example>
  1034. <para>
  1035. <code>quoteInto()</code>'nun opsiyonel üçüncü parametresini
  1036. SQL veri tipi belirtmek için kullanabilirsiniz.Sayısal tipler
  1037. tırnaklanmaz ve diğer tipler tırnaklanır.
  1038. </para>
  1039. <example id="zend.db.adapter.quoting.quote-into.example-2">
  1040. <title>quoteInto()'nun SQL tipi ile kullanımı</title>
  1041. <programlisting role="php"><![CDATA[<?php
  1042. $sql = $db->quoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER');
  1043. echo $sql;
  1044. // SELECT * FROM bugs WHERE reported_by = 1234]]>
  1045. </programlisting>
  1046. </example>
  1047. </sect3>
  1048. <sect3 id="zend.db.adapter.quoting.quote-identifier">
  1049. <title><code>quoteIdentifier()</code> Kullanımı</title>
  1050. <para>
  1051. SQL sözdiziminde değişken olması gerekebilecek tek kısım değerler değil.
  1052. Eğer PHP değişkenlerini tabloları,sütunları veya diğer tanımlayıcıları
  1053. isimlendirmek için kullanıyorsanız bu stringleri de tırnaklamanız gerekebilir.
  1054. Varsayılan olarak SQL tanımlayıcıları PHP ve diğer programlama dilleri gibi
  1055. bir sözdizim kuralına sahip. Örneğin tanımlayıcılar boşluk,noktalama işareti,
  1056. özel karakter, veya uluslararası karekter içermemeli. Ayrıca bazı kelimeler
  1057. SQL sözdizimi için ayrılmıştır ve bunlar tanımlayıcı olarak kullanılmamalı.
  1058. </para>
  1059. <para>
  1060. Ancak bununla birlikte SQL'in <emphasis>sınırlandırılmış tanımlayıcılar (delimited identifiers)</emphasis>
  1061. olarak bilinen tanımlayıcıların belirtilmesine daha geniş seçeneklere izin veren bir özelliği var.
  1062. Eğer SQL tanımlayıcılarını düzgün tırnak tipleriyle kapsarsanız
  1063. tırnaksız yazımı hatalı olacak tanımlayıcıları kullanabilirsiniz.
  1064. Sınırlandırılmış tanımlayıcılar boşluk,noktalama,uluslararası karakter içerebilir.
  1065. Ayrıcı SQL ayrılmış kelimelerini tanımlayıcı sınırlandırıcıları ile kapsarsanız
  1066. kullanabilirsiniz.
  1067. </para>
  1068. <para>
  1069. <code>quoteIdentifier()</code> metodu <code>quote()</code> metodu
  1070. gibi çalışır ama tanımlayıcı sınırlandırıcı karakterlerini
  1071. kullandığınız bağdaştırıcıya uygun olarak stringe uygular.
  1072. Örneğin , standart SQL tanımlayıcı sınırlandırıcıları için
  1073. (<code>"</code>) çift tırnak kullanır. MySQL varsayılan olarak
  1074. ters tırnak (<code>`</code>) kullanır. Ayrıca <code>quoteIdentifier()</code>
  1075. metodu string argüman içerisindeki özel karakterlere kaçış uygular.
  1076. </para>
  1077. <example id="zend.db.adapter.quoting.quote-identifier.example">
  1078. <title>quoteIdentifier() Kullanımı</title>
  1079. <programlisting role="php"><![CDATA[<?php
  1080. // tablo adımız SQL ayrılmış kelimesi olabilir
  1081. $tableName = $db->quoteIdentifier("order");
  1082. $sql = "SELECT * FROM $tableName";
  1083. echo $sql
  1084. // SELECT * FROM "order"]]>
  1085. </programlisting>
  1086. </example>
  1087. <para>
  1088. SQL sınırlandırılmış tanımlayıcılar tırnaklanmamış tanımlayıcılardan
  1089. farklı olarak küçük-büyük harf duyarlıdır.
  1090. Bu nedenle sınırlandırılmış tanımlayıcılar kullanacaksanız
  1091. tanımlayıcıların yazımı tam olarak şemanızda olduğu gibi , harflerin
  1092. küçük-büyük harf durumuda dahil olmak üzere tıpa tıp aynı olmalı.
  1093. </para>
  1094. <para>
  1095. Çoğu durumda Zend_Db sınıfları tarafından üretilen SQL'de
  1096. varsayılan olarak tüm tanımlayıcılar otomatik olarak
  1097. sınırlandırılır. Bu davranışı <code>Zend_Db::AUTO_QUOTE_IDENTIFIERS</code>
  1098. seçeneği ile değiştirebilirsiniz.Bunu Bağdaştırcı instance'ı oluşturken
  1099. belirtin. Bakınız <xref linkend="zend.db.adapter.connecting.parameters.example2" />.
  1100. </para>
  1101. </sect3>
  1102. </sect2>
  1103. <sect2 id="zend.db.adapter.transactions">
  1104. <title>Veri tabanı Hareketlerinin(Transactionların) Kontrolü</title>
  1105. <para>
  1106. Veri tabanları hareketleri birden çok tabloda çalışsa dahi
  1107. tekbir değişiklikle teslim edilebilir(commit) veya geri alınabilir(roll back)
  1108. işin mantıksal birimleri olarak tanımlar.Veri tabanı sürücüsü sorguları
  1109. dolaylı olarak yönetiyor olsa da veri tabanındaki tüm sorgular hareket bağlamında
  1110. çalıştırılır. Çalıştırdığınız her deyim için hareket oluşturulur ve SQL deyiminiz
  1111. çalıştırıldıktan sonra teslim edilir işte buna <emphasis>auto-commit</emphasis>
  1112. denir. Varsayılan olarak tüm Zend_Db Bağdaştırıcı sınıfları auto-commit modunda işliyor.
  1113. </para>
  1114. <para>
  1115. Alternatif olarak hareketin başlangıcını ve çözünürlülüğünü belirtebilir
  1116. böylece bir işlemde ne kadar SQL sorgusunun bir gruba dahil oldup teslim edildiğini
  1117. (veya geri alındığını) kontrol edebilirsiniz. Bir hareketi başlatmak için <code>beginTransaction()</code>
  1118. metodunu kullanın. Siz açıkca ortadan kaldırana kadar ,sonraki SQL deyimleri aynı hareket bağlamında
  1119. çalıştırılır.
  1120. </para>
  1121. <para>
  1122. Hareketi ortadan kaldırmak için <code>commit()</code> veya <code>rollBack()</code> metodlarından birini kullanın.
  1123. <code>commit()</code> metodu vaat edildiği gibi hareket sırasında yapılan değişiklikleri işaretler ,
  1124. bunun anlamı diğer hareketlerde çalışan sorgulara bu değişikliklerin gözükeceğidir.
  1125. </para>
  1126. <para>
  1127. <code>rollBack()</code> metodu tersini yapar:hareket sırasında yaptığınız
  1128. değişiklikleri göz ardı eder. Değişiklikler etkin olarak yapılmamıştır
  1129. , dönen verinin durumu harekete başlamadan önceki gibidir.
  1130. Ancak hareketi geri almak aynı zamanda çalışan hareketler tarafından
  1131. yapılan değişiklikleri etiklemeyecektir.
  1132. </para>
  1133. <para>
  1134. Hareketi ortadan kaldırdıktan sonra <code>Zend_Db_Adapter</code>
  1135. siz tekrar <code>beginTransaction()</code> çağırana kadar auto-commit modunu
  1136. döndürür.
  1137. </para>
  1138. <example id="zend.db.adapter.transactions.example">
  1139. <title>Tutarlılığı sağlamak için Hareketin Yönetilmesi</title>
  1140. <programlisting role="php"><![CDATA[<?php
  1141. // Açıkca hareketi başlat.
  1142. $db->beginTransaction();
  1143. try {
  1144. // Birkaç sogu çalıştırmayı dene:
  1145. $db->query(...);
  1146. $db->query(...);
  1147. $db->query(...);
  1148. //Eğer hepsi başarılıysa hareketi teslim et ve tüm değişiklikler
  1149. // bir kerede teslim edilsin.
  1150. $db->commit();
  1151. } catch (Exception $e) {
  1152. // Eğer sorgulardan herhangi biri başarısız olur ve
  1153. // exeption fırlatırsa tüm hareketi geri almak ve
  1154. // başarılı olsa dahi hareketde yapılan değişikleri
  1155. // geri çevirmek istiyoruz.
  1156. // Böylece ya hep beraber teslim ediliyor
  1157. // yada hiçbiri teslim edilmiyor.
  1158. $db->rollBack();
  1159. echo $e->getMessage();
  1160. }]]>
  1161. </programlisting>
  1162. </example>
  1163. </sect2>
  1164. <sect2 id="zend.db.adapter.list-describe">
  1165. <title>Listeleme ve Açıklama Tabloları</title>
  1166. <para>
  1167. <code>listTables()</code> metodu mevcut veritabanındaki tabloları
  1168. isimlendiren string dizisi döndürür.
  1169. </para>
  1170. <para>
  1171. <code>describeTable()</code> metodu tablo hakkında birleşmeli
  1172. metadata dizisi geri döndürür. Bu metodun ilk argümanına tablo
  1173. adını string olarak belirtir. İkinci argüman isteğe bağlı
  1174. ve bulunduğu tabloda şemayı isimlendiriyor.
  1175. </para>
  1176. <para>
  1177. Dönen birleşmeli dizinin anahtarları tablonun sütun adlarıdır.
  1178. Her sütuna karşı gelen değer ayrıca takip eden anahtarları ve
  1179. değerleriyle birleşmeli dizidir:
  1180. </para>
  1181. <table frame="all" cellpadding="5" id="zend.db.adapter.list-describe.metadata">
  1182. <title>describeTable()'ın döndürdüğü Metadata alanları</title>
  1183. <tgroup cols="3" align="left" colsep="1" rowsep="1">
  1184. <thead>
  1185. <row>
  1186. <entry>Anahtar</entry>
  1187. <entry>Tip</entry>
  1188. <entry>Açıklama</entry>
  1189. </row>
  1190. </thead>
  1191. <tbody>
  1192. <row>
  1193. <entry>SCHEMA_NAME</entry>
  1194. <entry>(string)</entry>
  1195. <entry>Bu tablonun var oluduğu veri tabanı şemasının adı.</entry>
  1196. </row>
  1197. <row>
  1198. <entry>TABLE_NAME</entry>
  1199. <entry>(string)</entry>
  1200. <entry>Bu sütunun ait olduğu tablonun adı.</entry>
  1201. </row>
  1202. <row>
  1203. <entry>COLUMN_NAME</entry>
  1204. <entry>(string)</entry>
  1205. <entry>Sütunun adı.</entry>
  1206. </row>
  1207. <row>
  1208. <entry>COLUMN_POSITION</entry>
  1209. <entry>(integer)</entry>
  1210. <entry>Sütunun tablodaki sırası.</entry>
  1211. </row>
  1212. <row>
  1213. <entry>DATA_TYPE</entry>
  1214. <entry>(string)</entry>
  1215. <entry>Sütunun veritipinin RDBMS adı.</entry>
  1216. </row>
  1217. <row>
  1218. <entry>DEFAULT</entry>
  1219. <entry>(string)</entry>
  1220. <entry>Eğer varsa sütunun varsayılan değeri.</entry>
  1221. </row>
  1222. <row>
  1223. <entry>NULLABLE</entry>
  1224. <entry>(boolean)</entry>
  1225. <entry>Tablo SQL NULL'ları kabul ediyorsa True , tablonun NULL kısıtı yoksa false.</entry>
  1226. </row>
  1227. <row>
  1228. <entry>LENGTH</entry>
  1229. <entry>(integer)</entry>
  1230. <entry>Tablonun RDBMS tarafından raporlanan uzunluğu veya boyutu.</entry>
  1231. </row>
  1232. <row>
  1233. <entry>SCALE</entry>
  1234. <entry>(integer)</entry>
  1235. <entry>SQL NUMERIC 'in veya DECIMAL'ın derecesi.</entry>
  1236. </row>
  1237. <row>
  1238. <entry>PRECISION</entry>
  1239. <entry>(integer)</entry>
  1240. <entry>SQL NUMERIC'in veya DECIMAL'ın duyarlılığı.</entry>
  1241. </row>
  1242. <row>
  1243. <entry>UNSIGNED</entry>
  1244. <entry>(boolean)</entry>
  1245. <entry>Eğer tamsayı tabanlı tip işaretsiz olarak bildirilmişse True.</entry>
  1246. </row>
  1247. <row>
  1248. <entry>PRIMARY</entry>
  1249. <entry>(boolean)</entry>
  1250. <entry>Eğer sütun birincil anahtarın bir parçası ise True.</entry>
  1251. </row>
  1252. <row>
  1253. <entry>PRIMARY_POSITION</entry>
  1254. <entry>(integer)</entry>
  1255. <entry>Birincil anahtardaki sütunun sırasal(1'den başlayan) pozisyonu.</entry>
  1256. </row>
  1257. <row>
  1258. <entry>IDENTITY</entry>
  1259. <entry>(boolean)</entry>
  1260. <entry>Sütun otomatik oluşturulmuş değer kullanıyorsa True.</entry>
  1261. </row>
  1262. </tbody>
  1263. </tgroup>
  1264. </table>
  1265. <para>
  1266. Tablo adıyla ve isteğe bağlı şema adıyla eşleşen tablo yoksa
  1267. <code>describeTable()</code> boş dizi döndürür.
  1268. </para>
  1269. </sect2>
  1270. <sect2 id="zend.db.adapter.closing">
  1271. <title>Bağlantının Kapatılması</title>
  1272. <para>
  1273. Genellikle veri tabanı bağlantısının kapatılması gerekmez. PHP
  1274. otomatik olarak istek sonunda tüm kaynakları temizler. Veri tabanı
  1275. eklentileri kaynak nesnesi temizlendiği zaman bağlantıyı kapatacak
  1276. şekilde dizayn edilmiştir.
  1277. </para>
  1278. <para>
  1279. Ancak birçok veri tabanı bağlantısı başlatan PHP betiğiniz(script'iniz) varsa
  1280. RDBMS sunucunuzun kapasitesini tüketmemek için bağlantıyı kapatmanız gerekebilir.
  1281. Bağdaştırıcının <code>closeConnection()</code> metodunu var olan veri tabanı
  1282. bağlantısını kapatmak için kullanabilirsiniz.
  1283. </para>
  1284. <example id="zend.db.adapter.closing.example">
  1285. <title>Veri tabanı bağlantısının kapatılması</title>
  1286. <programlisting role="php"><![CDATA[<?php
  1287. $db->closeConnection();]]>
  1288. </programlisting>
  1289. </example>
  1290. <note>
  1291. <title>Zend_Db sürekli(persistent) bağlantıları destekliyor mu?</title>
  1292. <para>
  1293. Sürekli bağlantıların kullanımı Zen_Db tarafından desteklenmiyor
  1294. veya tercih edilmiyor.
  1295. </para>
  1296. <para>
  1297. Sürekli bağlantıların kullanımı RDBMS sunucusunda fazla boş
  1298. bağlantının olmasına sebep olabilir , bu bağlantı oluşturmak
  1299. için gereken ek yükü azaltarak sağlayacağınız performans artışından
  1300. daha çok problem getirecektir.
  1301. </para>
  1302. <para>
  1303. Veri tabanı bağlantılarının durumu vardır. Öyleki
  1304. RDBMS sunucusunda bazı nesneler oturum kapsamında var olur.
  1305. Örnek olarak kilitler,kullanıcı değişkenleri,geçici tablolar ve
  1306. son çalıştırılan sorgu hakkında etkilenen satırlar , üretilen
  1307. son id değeri gibi bilgiler. Eğer sürekli bağlantılar kullanırsanız
  1308. uygulamanız önceki PHP isteği tarafından oluşturulan geçersiz veya
  1309. yetkisiz veriye erişebilir.
  1310. </para>
  1311. </note>
  1312. </sect2>
  1313. <sect2 id="zend.db.adapter.other-statements">
  1314. <title>Diğer Veri tabanı deyimlerinin çalıştırılması</title>
  1315. <para>
  1316. PHP veri tabanı eklentisi tarafından sağlanan bağlantı nesnesine
  1317. direk bağlantı kurma ihtiyacınız olacak durumlar olabilir.
  1318. Bu eklentilerin kimisi Zend_Db_Adapter_Abstract tarafından
  1319. kapsanmayan özellikler sunabilir.
  1320. </para>
  1321. <para>
  1322. Örneğin Zend_Db'nin çalıştırdığı tüm SQL deyimleri önce hazırlanır
  1323. sonra çalıştırılır. Ancak bazı veri tabanı özellikleri hazırlanmış
  1324. deyimlerle uyumsuzdur. CREATE ve ALTER gibi DDL deyimleri MySQL'de
  1325. hazırlanamaz. Ayrıca MySQL 5.1.17 öncesinde SQL deyimleri
  1326. <ulink url="http://dev.mysql.com/doc/refman/5.1/en/query-cache-how.html">MySQL Query Cache</ulink>'den faydalanmaz.
  1327. </para>
  1328. <para>
  1329. Çoğu PHP veri tabanı eklentisi SQL deyimlerini hazırlamadan
  1330. çalıştıran metod sağlamaktadır. Örneğin , PDO'de bu metod
  1331. <code>exec()</code>'dir. PHP eklentisindeki bağlantı nesnesine
  1332. getConnection() kullanarak direk erişebilirsiniz.
  1333. </para>
  1334. <example id="zend.db.adapter.other-statements.example">
  1335. <title>PDO bağdaştırıcısında hazırlanmamış deyim çalıştırmak</title>
  1336. <programlisting role="php"><![CDATA[<?php
  1337. $result = $db->getConnection()->exec('DROP TABLE bugs');]]>
  1338. </programlisting>
  1339. </example>
  1340. <para>
  1341. Benzer şekilde PHP veri tabanı eklentilerine özel diğer metodlara
  1342. ulaşabilirsiniz. Bilerek bunun yapılması uygulamanızı
  1343. belli marka RDBMS'ler için sağlanan veri tabanı eklentisinin
  1344. arayüzüyle sınırlandırabilir.
  1345. </para>
  1346. <para>
  1347. Zend_Db'nin gelecek sürümlerinde fonksiyonellik için desteklenen
  1348. PHP veritabanı eklentilerine mahsus method giriş noktaları ekleme
  1349. fırsatı olacak. Bu geriye uyumluluğu etkilemeyecek.
  1350. </para>
  1351. </sect2>
  1352. <sect2 id="zend.db.adapter.adapter-notes">
  1353. <title>Belirli Bağdaştırılar üzerine Notlar</title>
  1354. <para>
  1355. Bu bölüm farkında olmanız gereken bağdaştırıcı sınıfları arasındaki farkları
  1356. listeliyor.
  1357. </para>
  1358. <sect3 id="zend.db.adapter.adapter-notes.ibm-db2">
  1359. <title>IBM DB2</title>
  1360. <itemizedlist>
  1361. <listitem>
  1362. <para>
  1363. Bu bağdaştırıcıyı factory() metoduna 'Db2' adıyla belirtin.
  1364. </para>
  1365. </listitem>
  1366. <listitem>
  1367. <para>
  1368. Bu bağdaştırıcı ibm_db2 PHP eklentisini kullanıyor.
  1369. </para>
  1370. </listitem>
  1371. <listitem>
  1372. <para>
  1373. IBM DB2 sequence'leri ve otomatik artan anahtarları
  1374. desteklemektedir. Bu yüzden <code>lastInsertId()</code>
  1375. metodunun argümanları isteğe bağlıdır. Eğer argüman
  1376. vermezseniz bağdaştırıcı otomatik artışlı anahtar için
  1377. üretilen son değeri döndürecektir. Eğer argüman verirseniz
  1378. bağdaştırıcı kuralına göre isimlendirilen sequence'in
  1379. ('<emphasis>table</emphasis>_<emphasis>column</emphasis>_seq')
  1380. ürettiği son değeri döndürecektir.
  1381. </para>
  1382. </listitem>
  1383. </itemizedlist>
  1384. </sect3>
  1385. <sect3 id="zend.db.adapter.adapter-notes.mysqli">
  1386. <title>MySQLi</title>
  1387. <itemizedlist>
  1388. <listitem>
  1389. <para>
  1390. Bu bağdaştırıcıyı factory() metoduna 'Mysqli' adıyla belirtin.
  1391. </para>
  1392. </listitem>
  1393. <listitem>
  1394. <para>
  1395. Bu bağdaştırıcı mysqli PHP eklentisinden faydalanmaktadır.
  1396. </para>
  1397. </listitem>
  1398. <listitem>
  1399. <para>
  1400. MySQL sequence'ları desteklemiyor bu yüzden <code>lastInsertId()</code>
  1401. argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
  1402. son değeri döndürür. <code>lastSequenceId()</code> metodu
  1403. <code>null</code> döndürür.
  1404. </para>
  1405. </listitem>
  1406. </itemizedlist>
  1407. </sect3>
  1408. <sect3 id="zend.db.adapter.adapter-notes.oracle">
  1409. <title>Oracle</title>
  1410. <itemizedlist>
  1411. <listitem>
  1412. <para>
  1413. Bu bağdaştırıcıyı factory() metoduna 'Oracle' adıyla belirtin.
  1414. </para>
  1415. </listitem>
  1416. <listitem>
  1417. <para>
  1418. Bu bağdaştırıcı oci8 PHP eklentisini kullanıyor.
  1419. </para>
  1420. </listitem>
  1421. <listitem>
  1422. <para>
  1423. Oracle otomatik artan anahtarları desteklemiyor bu yüzden
  1424. <code>lastInsertId()</code>'ye veya <code>lastSequenceId()</code> 'ye
  1425. sequence'in adını belirtmelisiniz.
  1426. </para>
  1427. </listitem>
  1428. <listitem>
  1429. <para>
  1430. Oracle eklentisi konumsal parametreleri desteklemiyor.
  1431. Adlandırılan parametreleri kullanmalısınız.
  1432. </para>
  1433. </listitem>
  1434. <listitem>
  1435. <para>
  1436. Şu anda <code>Zend_Db::CASE_FOLDING</code> seçeneği Oracle
  1437. bağdaştırıcısı tarafından desteklenmiyor. Bu seçeneği Oracle
  1438. ile kullanabilmek için PDO OCI bağdaştırıcısını kullanmalısınız.
  1439. </para>
  1440. </listitem>
  1441. </itemizedlist>
  1442. </sect3>
  1443. <sect3 id="zend.db.adapter.adapter-notes.pdo-ibm">
  1444. <title>IBM DB2 ve Informix Dynamic Server (IDS) için PDO</title>
  1445. <itemizedlist>
  1446. <listitem>
  1447. <para>
  1448. Bu bağdaştırıcıyı factory() metoduna 'Pdo_Ibm' adıyla belirtin.
  1449. </para>
  1450. </listitem>
  1451. <listitem>
  1452. <para>
  1453. Bu bağdaştırıcı pdo ve pdo_ibm PHP eklentilerini kullanıyor.
  1454. </para>
  1455. </listitem>
  1456. <listitem>
  1457. <para>
  1458. En azından PDO_IBM eklentisinin 1.2.2 sürümünü kullanmalısınız.
  1459. Eğer bu eklentinin daha öncesi bir sürümüne sahipseniz PDO_IBM
  1460. eklentisini PECL'den güncellemelisiniz.
  1461. </para>
  1462. </listitem>
  1463. </itemizedlist>
  1464. </sect3>
  1465. <sect3 id="zend.db.adapter.adapter-notes.pdo-mssql">
  1466. <title>PDO Microsoft SQL Server</title>
  1467. <itemizedlist>
  1468. <listitem>
  1469. <para>
  1470. Bu bağdaştırıcıyı factory() metoduna 'Pdo_Mssql' adıyla belirtin.
  1471. </para>
  1472. </listitem>
  1473. <listitem>
  1474. <para>
  1475. Bu bağdaştırıcı pdo ve pdo_mssql PHP eklentilerini kullanıyor.
  1476. </para>
  1477. </listitem>
  1478. <listitem>
  1479. <para>
  1480. Microsoft SQL Server sequence'ları desteklemiyor
  1481. bu yüzden <code>lastInsertId()</code>
  1482. argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
  1483. son değeri döndürür. <code>lastSequenceId()</code> metodu
  1484. <code>null</code> döndürür.
  1485. </para>
  1486. </listitem>
  1487. <listitem>
  1488. <para>
  1489. Zend_Db_Adapter_Pdo_Mssql SQL Server veri tabanına bağlanır
  1490. bağlanmaz <code>QUOTED_IDENTIFIER ON</code> yapar.
  1491. Bu sürücünün tanıtıcı sınırlandırmaları için SQL Server'ın
  1492. köşeli parantezi yerine standart SQL tanıtıcı sınırlandırıcı
  1493. sembolü (<code>"</code>) kullanmasını sağlar.
  1494. </para>
  1495. </listitem>
  1496. <listitem>
  1497. <para>
  1498. Seçenekler dizisinde <code>pdoType</code>'ı anahtar olarak
  1499. belirtebilirsiniz. Değer "mssql"(varsayılan) ,"dblib", "freetds"
  1500. , veya "sybase" olabilir. Bu seçenek bağdaştırıcının DSN string'ini
  1501. inşa sırasında kullandığı DSN önekini etkiler. "freetds" ve "sybase"
  1502. <ulink url="http://www.freetds.org/">FreeTDS</ulink> kütüphane seti için
  1503. kullanılan "sybase:" önekini içerir.
  1504. Ayrıca bu sürücede kullanılan DSN önekleri hakkında daha çok bilgi için
  1505. bakınız <ulink url="http://www.php.net/manual/en/ref.pdo-dblib.connection.php">
  1506. http://www.php.net/manual/en/ref.pdo-dblib.connection.php</ulink>
  1507. </para>
  1508. </listitem>
  1509. </itemizedlist>
  1510. </sect3>
  1511. <sect3 id="zend.db.adapter.adapter-notes.pdo-mysql">
  1512. <title>PDO MySQL</title>
  1513. <itemizedlist>
  1514. <listitem>
  1515. <para>
  1516. Bu bağdaştırıcıyı factory() metoduna 'Pdo_Mysql' adıyla belirtin.
  1517. </para>
  1518. </listitem>
  1519. <listitem>
  1520. <para>
  1521. Bu bağdaştırıcı pdo ve pdo_mysql eklentilerini kullanıyor.
  1522. </para>
  1523. </listitem>
  1524. <listitem>
  1525. <para>
  1526. MySQL sequence'ları desteklemiyor , bu yüzden <code>lastInsertId()</code>
  1527. argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
  1528. son değeri döndürür. <code>lastSequenceId()</code> metodu
  1529. <code>null</code> döndürür.
  1530. </para>
  1531. </listitem>
  1532. </itemizedlist>
  1533. </sect3>
  1534. <sect3 id="zend.db.adapter.adapter-notes.pdo-oci">
  1535. <title>PDO Oracle</title>
  1536. <itemizedlist>
  1537. <listitem>
  1538. <para>
  1539. Bu bağdaştırıcıyı factory() metoduna 'Pdo_Oci' adıyla belirtin.
  1540. </para>
  1541. </listitem>
  1542. <listitem>
  1543. <para>
  1544. Bu bağdaştırıcı pdo ve pdo_oci PHP eklentilerini kullanıyor.
  1545. </para>
  1546. </listitem>
  1547. <listitem>
  1548. <para>
  1549. Oracle otomatik artışlı anahtarları desteklemiyor bu yüzden
  1550. sequence'in adını <code>lastInsertId()</code> veya
  1551. <code>lastSequenceId()</code>'ye belirtmelisiniz.
  1552. </para>
  1553. </listitem>
  1554. </itemizedlist>
  1555. </sect3>
  1556. <sect3 id="zend.db.adapter.adapter-notes.pdo-pgsql">
  1557. <title>PDO PostgreSQL</title>
  1558. <itemizedlist>
  1559. <listitem>
  1560. <para>
  1561. Bu bağdaştırıcıyı factory() metoduna 'Pdo_Pgsql' adıyla belirtin.
  1562. </para>
  1563. </listitem>
  1564. <listitem>
  1565. <para>
  1566. Bu bağdaştırıcı pdo ve pdo_pgsql eklentilerini kullanıyor.
  1567. </para>
  1568. </listitem>
  1569. <listitem>
  1570. <para>
  1571. PostgreSQL otomatik artışlı anahtarları hem de sequence'ları
  1572. destekliyor. Bu nedenle <code>lastInsertId()</code> argümanları
  1573. isteğe bağlı. Eğer hiç argüman vermezseniz bağdaştırıcı otomatik
  1574. artışlı anahtar için üretilen son değeri döndürür. Eğer argümanları
  1575. verirseniz bağdaştırıcı bağdaştırıcı kuralına göre isimlendirilen sequence'in
  1576. ('<emphasis>table</emphasis>_<emphasis>column</emphasis>_seq')
  1577. ürettiği son değeri döndürecektir.
  1578. </para>
  1579. </listitem>
  1580. </itemizedlist>
  1581. </sect3>
  1582. <sect3 id="zend.db.adapter.adapter-notes.pdo-sqlite">
  1583. <title>PDO SQLite</title>
  1584. <itemizedlist>
  1585. <listitem>
  1586. <para>
  1587. Bu bağdaştırıcıyı factory() metoduna 'Pdo_Sqlite' adıyla belirtin.
  1588. </para>
  1589. </listitem>
  1590. <listitem>
  1591. <para>
  1592. Bu bağdaştırıcı pdo ve pdo_sqlite eklentilerini kullanıyor.
  1593. </para>
  1594. </listitem>
  1595. <listitem>
  1596. <para>
  1597. SQLite sequence'ları desteklemiyor , bu yüzden <code>lastInsertId()</code>
  1598. argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
  1599. son değeri döndürür. <code>lastSequenceId()</code> metodu
  1600. <code>null</code> döndürür.
  1601. </para>
  1602. </listitem>
  1603. <listitem>
  1604. <para>
  1605. SQLite2 veri tabanına bağlanmak için Pdo_Sqlite bağdaştırcısının
  1606. instance'ını oluştururken parametreler dizisine <code>'dsnprefix'=>'sqlite2'</code>
  1607. ekleyin.
  1608. </para>
  1609. </listitem>
  1610. <listitem>
  1611. <para>
  1612. Hafızadaki (in-memory) SQLite veri tabanına bağlanmak için
  1613. Pdo_Sqlite bağdaştırcısının instance'ını oluştururken parametreler
  1614. dizisine <code>'dsnprefix'=>'sqlite2'</code> ekleyin.
  1615. </para>
  1616. </listitem>
  1617. <listitem>
  1618. <para>
  1619. PHP için SQLite sürücüsünün eski sürümleri sonuç listesinde
  1620. kısa sütun adları kullanılmasını sağlamak için gerekli olan
  1621. PRAGMA komutlarını desteklemiyor gibi. Eğer join sorgusu
  1622. yaptığınızda sonuç listeniz "tabloadı.sütunadı" şeklinde
  1623. problemli dönüyorsa PHP'nin güncel sürümüne terfi etmelisiniz.
  1624. </para>
  1625. </listitem>
  1626. </itemizedlist>
  1627. </sect3>
  1628. </sect2>
  1629. </sect1>
  1630. <!--
  1631. vim:se ts=4 sw=4 et:
  1632. -->