Zend_Db_Adapter.xml 108 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.adapter">
  5. <title>Zend_Db_Adapter</title>
  6. <para>
  7. <classname>Zend_Db</classname> e suas classes relacionadas provêem uma interface de banco
  8. de dados <acronym>SQL</acronym> simples para Zend Framework.
  9. <classname>Zend_Db_Adapter</classname> é a classe básica que você usa para conectar sua
  10. aplicação <acronym>PHP</acronym>a um <acronym>SGBDR</acronym>. Há uma classe adaptadora
  11. diferente para cada marca de <acronym>SGBDR</acronym>.
  12. </para>
  13. <para>
  14. Os adaptadores <classname>Zend_Db</classname> criam uma ponte entre extensões
  15. <acronym>PHP</acronym> específicas de cada fabricante para uma interface comum que ajuda
  16. você a escrever aplicações <acronym>PHP</acronym> uma vez e distribui-las com múltiplas
  17. marcas de <acronym>SGBDR</acronym> com muito pouco esforço.
  18. </para>
  19. <para>
  20. A interface da classe adaptadora é similar à interface da extensão
  21. <ulink url="http://www.php.net/pdo">PHP Data Objects</ulink>.
  22. <classname>Zend_Db</classname> provê classes adaptadoras para drivers
  23. <acronym>PDO</acronym> das seguintes marcas de <acronym>SGBDR</acronym>:
  24. </para>
  25. <itemizedlist>
  26. <listitem>
  27. <para>
  28. <acronym>IBM</acronym> <acronym>DB2</acronym> e Informix Dynamic Server
  29. (<acronym>IDS</acronym>), usando a extensão <acronym>PHP</acronym>
  30. <ulink url="http://www.php.net/pdo-ibm">pdo_ibm</ulink>
  31. </para>
  32. </listitem>
  33. <listitem>
  34. <para>
  35. MariaDB, usando a extensão <acronym>PHP</acronym>
  36. <ulink url="http://www.php.net/pdo-mysql">pdo_mysql</ulink>
  37. </para>
  38. </listitem>
  39. <listitem>
  40. <para>
  41. MySQL, usando a extensão <acronym>PHP</acronym>
  42. <ulink url="http://www.php.net/pdo-mysql">pdo_mysql</ulink>
  43. </para>
  44. </listitem>
  45. <listitem>
  46. <para>
  47. Microsoft <acronym>SQL</acronym> Server, usando a extensão <acronym>PHP</acronym>
  48. <ulink url="http://www.php.net/pdo-dblib">pdo_dblib</ulink>
  49. </para>
  50. </listitem>
  51. <listitem>
  52. <para>
  53. Oracle, usando a extensão <acronym>PHP</acronym>
  54. <ulink url="http://www.php.net/pdo-oci">pdo_oci</ulink>
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. PostgreSQL, usando a extensão <acronym>PHP</acronym>
  60. <ulink url="http://www.php.net/pdo-pgsql">pdo_pgsql</ulink>
  61. </para>
  62. </listitem>
  63. <listitem>
  64. <para>
  65. SQLite, usando a extensão <acronym>PHP</acronym>
  66. <ulink url="http://www.php.net/pdo-sqlite">pdo_sqlite</ulink>
  67. </para>
  68. </listitem>
  69. </itemizedlist>
  70. <para>
  71. Além disso, <classname>Zend_Db</classname> provê classes adaptadoras que utilizam extensões
  72. de bancos de dados
  73. <acronym>PHP</acronym> para as seguintes marcas de <acronym>SGBDR</acronym>:
  74. </para>
  75. <itemizedlist>
  76. <listitem>
  77. <para>
  78. MariaDB, usando a extensão <acronym>PHP</acronym>
  79. <ulink url="http://www.php.net/mysqli">mysqli</ulink>
  80. </para>
  81. </listitem>
  82. <listitem>
  83. <para>
  84. MySQL, usando a extensão <acronym>PHP</acronym>
  85. <ulink url="http://www.php.net/mysqli">mysqli</ulink>
  86. </para>
  87. </listitem>
  88. <listitem>
  89. <para>
  90. Oracle, usando a extensão <acronym>PHP</acronym>
  91. <ulink url="http://www.php.net/oci8">oci8</ulink>
  92. </para>
  93. </listitem>
  94. <listitem>
  95. <para>
  96. <acronym>IBM</acronym> <acronym>DB2</acronym> e <acronym>DB2</acronym> I5, usando a
  97. extensão <acronym>PHP</acronym> <ulink
  98. url="http://www.php.net/ibm_db2">ibm_db2</ulink>
  99. </para>
  100. </listitem>
  101. <listitem>
  102. <para>
  103. Firebird (Interbase), usando a extensão <acronym>PHP</acronym> <ulink
  104. url="http://www.php.net/ibase">php_interbase</ulink>
  105. </para>
  106. </listitem>
  107. </itemizedlist>
  108. <note>
  109. <para>
  110. Cada classe adaptadora <classname>Zend_Db</classname> usa uma extensão
  111. <acronym>PHP</acronym>. Você deve ter a respectiva extensão <acronym>PHP</acronym>
  112. habilitada em seu ambiente <acronym>PHP</acronym> para usar uma classe adaptadora
  113. <classname>Zend_Db</classname>. Por exemplo, se você usa qualquer uma das classes
  114. adaptadoras <acronym>PDO</acronym> do <classname>Zend_Db</classname>
  115. , você precisa habilitar tanto a extensão <acronym>PDO</acronym> quanto o driver
  116. <acronym>PDO</acronym> para a marca de <acronym>SGBDR</acronym> que você usa.
  117. </para>
  118. </note>
  119. <sect2 id="zend.db.adapter.connecting">
  120. <title>Conectando-se a um Banco de Dados Usando uma Adaptadora</title>
  121. <para>
  122. Esta seção descreve como criar uma instância de uma classe adaptadora de banco de
  123. dados. Isso corresponde a fazer uma conexão com seu servidor <acronym>SGBDR</acronym> a
  124. partir de sua aplicação <acronym>PHP</acronym>.
  125. </para>
  126. <sect3 id="zend.db.adapter.connecting.constructor">
  127. <title>Usando um Construtor de Adaptadora Zend_Db</title>
  128. <para>
  129. Você pode criar uma instância de uma classe adaptadora usando seu construtor.
  130. Um construtor de classe adaptadora leva um argumento, que é um matriz
  131. de parâmetros usado para declarar a conexão.
  132. </para>
  133. <example id="zend.db.adapter.connecting.constructor.example">
  134. <title>Usando um Construtor de Adaptadora</title>
  135. <programlisting language="php"><![CDATA[
  136. $db = new Zend_Db_Adapter_Pdo_Mysql(array(
  137. 'host' => '127.0.0.1',
  138. 'username' => 'webuser',
  139. 'password' => 'xxxxxxxx',
  140. 'dbname' => 'test'
  141. ));
  142. ]]></programlisting>
  143. </example>
  144. </sect3>
  145. <sect3 id="zend.db.adapter.connecting.factory">
  146. <title>Usando a Fábrica Zend_Db</title>
  147. <para>
  148. Como uma alternativa ao uso direto do construtor da classe adaptadora, você
  149. pode criar uma instância de uma adaptadora usando o método estático
  150. <methodname>Zend_Db::factory()</methodname>. Este método carrega dinamicamente
  151. o arquivo da classe adaptadora sob demanda usando o método
  152. <link linkend="zend.loader.load.class">Zend_Loader::loadClass()</link>.
  153. </para>
  154. <para>
  155. O primeiro argumento é um string que identifica o nome base da
  156. classe adaptadora. Por exemplo, a string '<classname>Pdo_Mysql</classname>'
  157. corresponde à classe <classname>Zend_Db_Adapter_Pdo_Mysql</classname>. O segundo
  158. argumento é a mesma matriz de parâmetros que você teria passado para
  159. o construtor da adaptadora.
  160. </para>
  161. <example id="zend.db.adapter.connecting.factory.example">
  162. <title>Using the Adapter Factory Method</title>
  163. <programlisting language="php"><![CDATA[
  164. // Nós não precisamos seguir a declaração a seguir porque o
  165. // arquivo Zend_Db_Adapter_Pdo_Mysql será carregado para nós pelo método Zend_Db
  166. // factory.
  167. // require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
  168. // Carrega automaticamente a classe Zend_Db_Adapter_Pdo_Mysql
  169. // e cria uma instância dela.
  170. $db = Zend_Db::factory('Pdo_Mysql', array(
  171. 'host' => '127.0.0.1',
  172. 'username' => 'webuser',
  173. 'password' => 'xxxxxxxx',
  174. 'dbname' => 'test'
  175. ));
  176. ]]></programlisting>
  177. </example>
  178. <para>
  179. Se você criar sua própria classe que estende
  180. <classname>Zend_Db_Adapter_Abstract</classname>, mas não nomear sua
  181. classe com o prefixo de pacote "<classname>Zend_Db_Adapter</classname>", você pode
  182. usar o método <methodname>factory()</methodname> para carregar sua adaptadora se
  183. você especificar a parte principal da classe adaptadora com a
  184. chave 'adapterNamespace' na matriz de parâmetros.
  185. </para>
  186. <example id="zend.db.adapter.connecting.factory.example2">
  187. <title>
  188. Usando o Método de Fábrica da Adaptadora para uma Classe Adaptadora Personalizada
  189. </title>
  190. <programlisting language="php"><![CDATA[
  191. // Nós não precisamos carregar o arquivo da classe adaptadora
  192. // porque ele será carregado para nós pelo método de fábrica do Zend_Db.
  193. // Carrega automaticamente a classe MyProject_Db_Adapter_Pdo_Mysql e cria
  194. // uma instância dela.
  195. $db = Zend_Db::factory('Pdo_Mysql', array(
  196. 'host' => '127.0.0.1',
  197. 'username' => 'webuser',
  198. 'password' => 'xxxxxxxx',
  199. 'dbname' => 'test',
  200. 'adapterNamespace' => 'MyProject_Db_Adapter'
  201. ));
  202. ]]></programlisting>
  203. </example>
  204. </sect3>
  205. <sect3 id="zend.db.adapter.connecting.factory-config">
  206. <title>Usando Zend_Config com Zend_Db Factory</title>
  207. <para>
  208. Opcionalmente, você pode especificar cada argumento do
  209. método <methodname>factory()</methodname> como um objeto do tipo
  210. <link linkend="zend.config">Zend_Config</link>.
  211. </para>
  212. <para>
  213. Se o primeiro argumento é um objeto de configuração, espera-se que
  214. ele contenha uma propriedade chamada <property>adapter</property>, contendo uma
  215. string que designa a base do nome da classe adaptadora. Opcionalmente, o objeto
  216. pode conter uma propriedade chamada <property>params</property>, com
  217. subpropriedades correspondentes aos nomes de parâmetro da adaptadora.
  218. Isso é usado somente se o segundo argumento do
  219. método <methodname>factory()</methodname> for omitido.
  220. </para>
  221. <example id="zend.db.adapter.connecting.factory.example1">
  222. <title>Usando o Método de Fábrica da Adaptadora com um Objeto Zend_Config</title>
  223. <para>
  224. No exemplo abaixo, um objeto <classname>Zend_Config</classname> é criado
  225. a partir de um matriz. Você pode também carregar dados a partir de um arquivo
  226. externo usando classes tais como
  227. <link linkend="zend.config.adapters.ini">Zend_Config_Ini</link>
  228. e <link linkend="zend.config.adapters.xml">Zend_Config_Xml</link>.
  229. </para>
  230. <programlisting language="php"><![CDATA[
  231. $config = new Zend_Config(
  232. array(
  233. 'database' => array(
  234. 'adapter' => 'Mysqli',
  235. 'params' => array(
  236. 'host' => '127.0.0.1',
  237. 'dbname' => 'test',
  238. 'username' => 'webuser',
  239. 'password' => 'secret',
  240. )
  241. )
  242. )
  243. );
  244. $db = Zend_Db::factory($config->database);
  245. ]]></programlisting>
  246. </example>
  247. <para>
  248. O segundo argumento do método <methodname>factory()</methodname> pode ser
  249. um matriz associativo contendo entradas correspondentes aos
  250. parâmetros da adaptadora. Esse argumento é opcional. Se o primeiro
  251. argumento é do tipo <classname>Zend_Config</classname>, é assumido que ele contém
  252. todos os parâmetros, e o segundo argumento é ignorado
  253. </para>
  254. </sect3>
  255. <sect3 id="zend.db.adapter.connecting.parameters">
  256. <title>Parâmetros da Adaptadora</title>
  257. <para>
  258. A seguinte lista explica parâmetros comuns reconhecidos pelas
  259. classes adaptadoras <classname>Zend_Db</classname>.
  260. </para>
  261. <itemizedlist>
  262. <listitem>
  263. <para>
  264. <emphasis>host</emphasis>:
  265. uma string contendo um hostname ou endereço IP do
  266. servidor de banco de dados. Se o banco de dados está rodando no
  267. mesmo servidor anfitrião da aplicação <acronym>PHP</acronym>, você pode
  268. usar 'localhost' ou '127.0.0.1'.
  269. </para>
  270. </listitem>
  271. <listitem>
  272. <para>
  273. <emphasis>username</emphasis>:
  274. identificador da conta para autenticar uma conexão com o
  275. servidor <acronym>SGBDR</acronym>.
  276. </para>
  277. </listitem>
  278. <listitem>
  279. <para>
  280. <emphasis>password</emphasis>:
  281. credencial de senha para autenticar uma
  282. conexão com o servidor <acronym>SGBDR</acronym>.
  283. </para>
  284. </listitem>
  285. <listitem>
  286. <para>
  287. <emphasis>dbname</emphasis>:
  288. nome da instância do banco de dados no servidor <acronym>SGBDR</acronym>.
  289. </para>
  290. </listitem>
  291. <listitem>
  292. <para>
  293. <emphasis>port</emphasis>:
  294. alguns servidores <acronym>SGBDR</acronym> podem aceitar conexões de rede
  295. em um número de porta especificado pelo administrador. O parâmetro port
  296. permite que você especifique a porta a qual sua
  297. aplicação <acronym>PHP</acronym> se conecta, para casar com a porta
  298. configurada no servidor <acronym>SGBDR</acronym>.
  299. </para>
  300. </listitem>
  301. <listitem>
  302. <para>
  303. <emphasis>charset</emphasis>:
  304. especifica o conjunto de caracteres usado para a conexão.
  305. </para>
  306. </listitem>
  307. <listitem>
  308. <para>
  309. <emphasis>options</emphasis>:
  310. este parâmetro é um matriz associativo de opções
  311. que são genéricas para todas as classes
  312. <classname>Zend_Db_Adapter</classname>.
  313. </para>
  314. </listitem>
  315. <listitem>
  316. <para>
  317. <emphasis>driver_options</emphasis>:
  318. este parâmetro é um matriz associativo de opções
  319. adicionais que são específicas para uma dada extensão
  320. de banco de dados. Um uso típico deste parâmetro é para
  321. configurar atributos de um driver <acronym>PDO</acronym>.
  322. </para>
  323. </listitem>
  324. <listitem>
  325. <para>
  326. <emphasis>adapterNamespace</emphasis>:
  327. nomeia a parte inicial do nome da classe para a
  328. adaptadora, em vez de '<classname>Zend_Db_Adapter</classname>'. Use isto se
  329. você precisar do método <methodname>factory()</methodname> para
  330. carregar uma classe adaptadora de banco de dados não-Zend.
  331. </para>
  332. </listitem>
  333. </itemizedlist>
  334. <example id="zend.db.adapter.connecting.parameters.example1">
  335. <title>Passando a Opção Case-Folding para a Fábrica</title>
  336. <para>
  337. Você pode especificar essa opção pela constante
  338. <constant>Zend_Db::CASE_FOLDING</constant>. Ela corresponde ao atributo
  339. <constant>ATTR_CASE</constant> nos drivers de banco de dados
  340. <acronym>PDO</acronym> e <acronym>IBM</acronym> <acronym>DB2</acronym>,
  341. ajustando a caixa das chaves de string nos conjuntos de resultado de consulta.
  342. A opção leva os valores <constant>Zend_Db::CASE_NATURAL</constant> (padrão),
  343. <constant>Zend_Db::CASE_UPPER</constant>, e
  344. <constant>Zend_Db::CASE_LOWER</constant>.
  345. </para>
  346. <programlisting language="php"><![CDATA[
  347. $options = array(
  348. Zend_Db::CASE_FOLDING => Zend_Db::CASE_UPPER
  349. );
  350. $params = array(
  351. 'host' => '127.0.0.1',
  352. 'username' => 'webuser',
  353. 'password' => 'xxxxxxxx',
  354. 'dbname' => 'test',
  355. 'options' => $options
  356. );
  357. $db = Zend_Db::factory('Db2', $params);
  358. ]]></programlisting>
  359. </example>
  360. <example id="zend.db.adapter.connecting.parameters.example2">
  361. <title>Passando a Opção Auto-Quoting para a Fábrica</title>
  362. <para>
  363. Você pode especificar essa opção pela constante
  364. <constant>Zend_Db::AUTO_QUOTE_IDENTIFIERS</constant>. Se o valor
  365. é <constant>TRUE</constant> (padrão), identificadores como nomes de
  366. tabela, nomes de coluna, e mesmo apelidos são delimitados em toda
  367. sintaxe <acronym>SQL</acronym> gerada pelo objeto adaptador. Isso torna simples
  368. usar identificadores que contêm palavras-chave <acronym>SQL</acronym>, ou
  369. caracteres especiais. Se o valor é <constant>FALSE</constant>,
  370. identificadores não são delimitados automaticamente. Se você precisa
  371. delimitar identificadores, você deve fazer por conta própria usando
  372. o método <methodname>quoteIdentifier()</methodname>.
  373. </para>
  374. <programlisting language="php"><![CDATA[
  375. $options = array(
  376. Zend_Db::AUTO_QUOTE_IDENTIFIERS => false
  377. );
  378. $params = array(
  379. 'host' => '127.0.0.1',
  380. 'username' => 'webuser',
  381. 'password' => 'xxxxxxxx',
  382. 'dbname' => 'test',
  383. 'options' => $options
  384. );
  385. $db = Zend_Db::factory('Pdo_Mysql', $params);
  386. ]]></programlisting>
  387. </example>
  388. <example id="zend.db.adapter.connecting.parameters.example3">
  389. <title>Passando Opções de Driver PDO para a Fábrica</title>
  390. <programlisting language="php"><![CDATA[
  391. $pdoParams = array(
  392. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
  393. );
  394. $params = array(
  395. 'host' => '127.0.0.1',
  396. 'username' => 'webuser',
  397. 'password' => 'xxxxxxxx',
  398. 'dbname' => 'test',
  399. 'driver_options' => $pdoParams
  400. );
  401. $db = Zend_Db::factory('Pdo_Mysql', $params);
  402. echo $db->getConnection()
  403. ->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
  404. ]]></programlisting>
  405. </example>
  406. <example id="zend.db.adapter.connecting.parameters.example4">
  407. <title>Passando Opções de Serialização para a Fábrica</title>
  408. <programlisting language="php"><![CDATA[
  409. $options = array(
  410. Zend_Db::ALLOW_SERIALIZATION => false
  411. );
  412. $params = array(
  413. 'host' => '127.0.0.1',
  414. 'username' => 'webuser',
  415. 'password' => 'xxxxxxxx',
  416. 'dbname' => 'test',
  417. 'options' => $options
  418. );
  419. $db = Zend_Db::factory('Pdo_Mysql', $params);
  420. ]]></programlisting>
  421. </example>
  422. </sect3>
  423. <sect3 id="zend.db.adapter.connecting.getconnection">
  424. <title>Gerenciando Conexões Preguiçosas</title>
  425. <para>
  426. Criar uma instância de uma classe adaptadora não abre uma conexão
  427. com o servidor <acronym>SGBDR</acronym> imediatamente. A adaptadora guarda os
  428. parâmetros de conexão, e a estabelece por demanda, na primeira
  429. vez que você precisar executar uma consulta. Isso garante que
  430. criar um objeto adaptador é rápido é barato. Você pode
  431. criar uma instância de uma adaptadora mesmo se não estiver certo
  432. que precisa rodar quaisquer consultas de banco de dados durante a requisição
  433. atual que sua aplicação está servindo.
  434. </para>
  435. <para>
  436. Se você precisa forçar a adaptador a se conectar ao <acronym>SGBDR</acronym>, use
  437. o método <methodname>getConnection()</methodname>. Esse método retorna
  438. um objeto para a conexão como representado pela respectiva
  439. extensão de banco de dados <acronym>PHP</acronym>. Por exemplo, se você usar
  440. qualquer uma das classes adaptadoras para drivers <acronym>PDO</acronym>, então
  441. <methodname>getConnection()</methodname> retorna o objeto <acronym>PDO</acronym>,
  442. depois de iniciá-lo como uma conexão ativa para o banco de dados especificado.
  443. </para>
  444. <para>
  445. Pode ser útil forçar a conexão se você quer capturar
  446. quaisquer exceções que ela lançar como resultado de credenciais de conta
  447. inválidas, ou outra falha ao conectar-se ao servidor <acronym>SGBDR</acronym>.
  448. Essas exceções não são lançadas até que a conexão seja feita,
  449. assim isso pode ajudar a simplificar o código de sua aplicação se você manipular as
  450. exceções em um lugar, em vez de fazê-lo
  451. na primeira consulta ao banco de dados.
  452. </para>
  453. <para>
  454. Adicionalmente, uma adaptadora pode ser serializada para armazená-la, por exemplo,
  455. em uma variável de sessão. Isso pode ser muito útil não somente para a
  456. própria adaptadora, mas para outros objetos que a agreguem, como um
  457. objeto <classname>Zend_Db_Select</classname>. Por padrão, adaptadoras têm permissão
  458. de serem serializadas, se você não quiser isso, deve considerar passar a
  459. opção <constant>Zend_Db::ALLOW_SERIALIZATION</constant> com
  460. <constant>FALSE</constant>, veja o exemplo abaixo. Em respeito ao princípio de
  461. conexões preguiçosas, a adaptadora não reconectará a si própria depois de ser
  462. revertida sua serialização. Você deve então chamar
  463. <methodname>getConnection()</methodname> por conta própria. Você pode fazer a
  464. adaptadora se autorreconectar pela passagem de
  465. <constant>Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE</constant> com
  466. <constant>TRUE</constant> como uma opção da adaptadora.
  467. </para>
  468. <example id="zend.db.adapter.connecting.getconnection.example">
  469. <title>Manipulando Exceções de Conexão</title>
  470. <programlisting language="php"><![CDATA[
  471. try {
  472. $db = Zend_Db::factory('Pdo_Mysql', $parameters);
  473. $db->getConnection();
  474. } catch (Zend_Db_Adapter_Exception $e) {
  475. // talvez uma credencial de login falhou, ou talvez o SGBDR não está rodando
  476. } catch (Zend_Exception $e) {
  477. // talvez factory() falhou em carregar a classe adaptadora especificada
  478. }
  479. ]]></programlisting>
  480. </example>
  481. </sect3>
  482. </sect2>
  483. <sect2 id="zend.db.adapter.example-database">
  484. <title>Banco de Dados de Exemplo</title>
  485. <para>
  486. Na documentação para classes <classname>Zend_Db</classname>, nós usamos um conjunto de
  487. tabelas simples para ilustrar o uso de classes e métodos. Estas
  488. tabelas de exemplo podem armazenar informações sobre rastreamento de bugs em um
  489. projeto de desenvolvimento de software. O banco de dados contém quatro tabelas:
  490. </para>
  491. <itemizedlist>
  492. <listitem>
  493. <para>
  494. <emphasis>accounts</emphasis> armazena
  495. informação sobre cada usuário do banco de dados de rastreamento de bugs.
  496. </para>
  497. </listitem>
  498. <listitem>
  499. <para>
  500. <emphasis>products</emphasis> armazena
  501. informação sobre cada produto para o qual um bug pode ser
  502. registrado.
  503. </para>
  504. </listitem>
  505. <listitem>
  506. <para>
  507. <emphasis>bugs</emphasis> armazena informação
  508. sobre bugs, incluindo o estado atual do bug, a
  509. pessoa que o reportou, a pessoa que se encarregou de
  510. corrigí-lo e a pessoa que se encarregou de verificar a
  511. correção.
  512. </para>
  513. </listitem>
  514. <listitem>
  515. <para>
  516. <emphasis>bugs_products</emphasis> armazena um
  517. relacionamento entre bugs e produtos. Ela implementa um
  518. relacionamento muitos-para-muitos, porque para um dado bug pode ter
  519. relevância para múltiplos produtos, e, obviamente, um dado
  520. produto pode ter múltiplos bugs.
  521. </para>
  522. </listitem>
  523. </itemizedlist>
  524. <para>
  525. O seguinte pseudocódigo de linguagem de definição de dados <acronym>SQL</acronym>
  526. descreve as tabelas neste banco de dados de exemplo. Estas tabelas de exemplo são
  527. extensivamente usadas pelos testes unitários automatizados de
  528. <classname>Zend_Db</classname>.
  529. </para>
  530. <programlisting language="sql"><![CDATA[
  531. CREATE TABLE accounts (
  532. account_name VARCHAR(100) NOT NULL PRIMARY KEY
  533. );
  534. CREATE TABLE products (
  535. product_id INTEGER NOT NULL PRIMARY KEY,
  536. product_name VARCHAR(100)
  537. );
  538. CREATE TABLE bugs (
  539. bug_id INTEGER NOT NULL PRIMARY KEY,
  540. bug_description VARCHAR(100),
  541. bug_status VARCHAR(20),
  542. reported_by VARCHAR(100) REFERENCES accounts(account_name),
  543. assigned_to VARCHAR(100) REFERENCES accounts(account_name),
  544. verified_by VARCHAR(100) REFERENCES accounts(account_name)
  545. );
  546. CREATE TABLE bugs_products (
  547. bug_id INTEGER NOT NULL REFERENCES bugs,
  548. product_id INTEGER NOT NULL REFERENCES products,
  549. PRIMARY KEY (bug_id, product_id)
  550. );
  551. ]]></programlisting>
  552. <para>
  553. Note também que a tabela 'bugs' contém múltiplas referências de chave estrangeira para a
  554. tabela 'accounts'. Cada uma das chaves estrangeiras pode referenciar uma linha diferente
  555. na tabela 'accounts' para um dado bug.
  556. </para>
  557. <para>
  558. O diagrama abaixo ilustra o modelo físico de dados do banco de dados de exemplo.
  559. </para>
  560. <para>
  561. <inlinegraphic width="387" scale="100" align="center" valign="middle"
  562. fileref="figures/zend.db.adapter.example-database.png" format="PNG" />
  563. </para>
  564. </sect2>
  565. <sect2 id="zend.db.adapter.select">
  566. <title>Lendo Resultados de Consulta</title>
  567. <para>
  568. Esta seção descreve métodos da classe adaptadora com os quais você
  569. pode rodar consultas <acronym>SELECT</acronym> e recuperar seus resultados.
  570. </para>
  571. <sect3 id="zend.db.adapter.select.fetchall">
  572. <title>Buscando um Conjunto Completo de Resultados</title>
  573. <para>
  574. Você pode rodar uma consulta <acronym>SQL</acronym> <acronym>SELECT</acronym> e
  575. recuperar seus resultados em um passo usando o método
  576. <methodname>fetchAll()</methodname>.
  577. </para>
  578. <para>
  579. O primeiro argumento para este método é uma string contendo uma
  580. declaração <acronym>SELECT</acronym>. Como alternativa, o primeiro argumento pode
  581. ser um objeto da classe <link linkend="zend.db.select">Zend_Db_Select</link>.
  582. A classe adaptadora converte automaticamente esse objeto em uma representação de
  583. string da declaração <acronym>SELECT</acronym>.
  584. </para>
  585. <para>
  586. O segundo argumento para <methodname>fetchAll()</methodname> é um matriz de
  587. valores para substituir por curingas de parâmetro na declaração
  588. <acronym>SQL</acronym>.
  589. </para>
  590. <example id="zend.db.adapter.select.fetchall.example">
  591. <title>Usando fetchAll()</title>
  592. <programlisting language="php"><![CDATA[
  593. $sql = 'SELECT * FROM bugs WHERE bug_id = ?';
  594. $result = $db->fetchAll($sql, 2);
  595. ]]></programlisting>
  596. </example>
  597. </sect3>
  598. <sect3 id="zend.db.adapter.select.fetch-mode">
  599. <title>Alterando o Modo de Busca</title>
  600. <para>
  601. Por padrão, <methodname>fetchAll()</methodname> retorna um matriz de
  602. linhas, cada uma das quais é um matriz associativo. As chaves do
  603. matriz associativo são as colunas ou apelidos de coluna dados
  604. na consulta de seleção.
  605. </para>
  606. <para>
  607. Você pode especificar um estilo diferente de resultados de busca usando o
  608. método <methodname>setFetchMode()</methodname>. Os modos suportados são
  609. identificados por constantes:
  610. </para>
  611. <itemizedlist>
  612. <listitem>
  613. <para>
  614. <emphasis><constant>Zend_Db::FETCH_ASSOC</constant></emphasis>:
  615. retorna dados em um matriz de matrizs associativos.
  616. As chaves de matriz são nomes de coluna, como strings. Este é o modo padrão
  617. de busca para classes <classname>Zend_Db_Adapter</classname>.
  618. </para>
  619. <para>
  620. Note que se sua lista de seleção contém mais de uma
  621. coluna com o mesmo nome, por exemplo se elas são de
  622. duas tabelas diferentes em um <acronym>JOIN</acronym>, pode haver somente
  623. uma entrada na matriz associativa para o nome dado.
  624. Se você usa o modo <constant>FETCH_ASSOC</constant>, deve especificar
  625. apelidos de coluna em sua consulta <acronym>SELECT</acronym> para garantir
  626. que os nomes resultem em chaves de matriz únicas.
  627. </para>
  628. <para>
  629. Por padrão, essas strings são devolvidas como foram
  630. devolvidas pelo driver de banco de dados. Isso é tipicamente
  631. a leitura da coluna no servidor <acronym>SGBDR</acronym>. Você pode
  632. especificar a caixa para essas strings, usando a
  633. opção <constant>Zend_Db::CASE_FOLDING</constant>.
  634. Especifique isso quando instanciar a adaptadora.
  635. Veja <link linkend="zend.db.adapter.connecting.parameters.example1">este
  636. exemplo</link>.
  637. </para>
  638. </listitem>
  639. <listitem>
  640. <para>
  641. <emphasis><constant>Zend_Db::FETCH_NUM</constant></emphasis>:
  642. retorna dados em um matriz de matrizs. Os matrizs são
  643. indexados por inteiros, correspondendo à posição do
  644. respectivo campo na lista de seleção da consulta.
  645. </para>
  646. </listitem>
  647. <listitem>
  648. <para>
  649. <emphasis><constant>Zend_Db::FETCH_BOTH</constant></emphasis>:
  650. retorna dados em um matriz de matrizs. As chaves de matriz são
  651. tanto strings como as usadas no modo <constant>FETCH_ASSOC</constant>, como
  652. inteiros como os usados no modo <constant>FETCH_NUM</constant>. Note que o
  653. número de elementos na matriz é o dobro do que seria se você usasse
  654. <constant>FETCH_ASSOC</constant> ou <constant>FETCH_NUM</constant>.
  655. </para>
  656. </listitem>
  657. <listitem>
  658. <para>
  659. <emphasis><constant>Zend_Db::FETCH_COLUMN</constant></emphasis>:
  660. retorna dados em um matriz de valores. O valor em cada matriz
  661. é o valor retornado pela coluna do conjunto de resultados.
  662. Por padrão, essa é a primeira coluna, indexada por 0.
  663. </para>
  664. </listitem>
  665. <listitem>
  666. <para>
  667. <emphasis><constant>Zend_Db::FETCH_OBJ</constant></emphasis>:
  668. retorna dados em um matriz de objetos. A classe padrão
  669. é a classe interna <acronym>PHP</acronym> stdClass. Colunas do conjunto de
  670. resultados estão disponíveis como propriedades públicas do
  671. objeto.
  672. </para>
  673. </listitem>
  674. </itemizedlist>
  675. <example id="zend.db.adapter.select.fetch-mode.example">
  676. <title>Usando setFetchMode()</title>
  677. <programlisting language="php"><![CDATA[
  678. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  679. $result = $db->fetchAll('SELECT * FROM bugs WHERE bug_id = ?', 2);
  680. // $result é um matriz de objetos
  681. echo $result[0]->bug_description;
  682. ]]></programlisting>
  683. </example>
  684. </sect3>
  685. <sect3 id="zend.db.adapter.select.fetchassoc">
  686. <title>Buscando um Conjunto de Resultados como um matriz Associativo</title>
  687. <para>
  688. O método <methodname>fetchAssoc()</methodname> retorna dados em uma matriz
  689. de matrizes associativas, independente de qual valor você tenha configurado
  690. para o modo de busca, utilizando a primeira coluna como índice da matriz.
  691. </para>
  692. <example id="zend.db.adapter.select.fetchassoc.example">
  693. <title>Usando fetchAssoc()</title>
  694. <programlisting language="php"><![CDATA[
  695. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  696. $result = $db->fetchAssoc(
  697. 'SELECT bug_id, bug_description, bug_status FROM bugs'
  698. );
  699. // $result é uma matriz de matrizes associativas, conforme o modo de busca
  700. echo $result[2]['bug_description']; // Descrição do Bug #2
  701. echo $result[1]['bug_description']; // Descrição do Bug #1
  702. ]]></programlisting>
  703. </example>
  704. </sect3>
  705. <sect3 id="zend.db.adapter.select.fetchcol">
  706. <title>Buscando uma Única Coluna a partir de um Conjunto de Resultados</title>
  707. <para>
  708. O método <methodname>fetchCol()</methodname> retorna dados em um matriz
  709. de valores, independente do valor que você tenha configurado para o modo de busca
  710. Ele devolve somente a primeira coluna devolvida pela consulta.
  711. Quaisquer outras colunas devolvidas pela consulta são descartadas.
  712. Se você precisar devolver uma outra coluna que não seja a primeira, veja
  713. <link linkend="zend.db.statement.fetching.fetchcolumn">esta seção</link>.
  714. </para>
  715. <example id="zend.db.adapter.select.fetchcol.example">
  716. <title>Usando fetchCol()</title>
  717. <programlisting language="php"><![CDATA[
  718. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  719. $result = $db->fetchCol(
  720. 'SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2);
  721. // contém bug_description; bug_id não é devolvida
  722. echo $result[0];
  723. ]]></programlisting>
  724. </example>
  725. </sect3>
  726. <sect3 id="zend.db.adapter.select.fetchpairs">
  727. <title>Buscando Pares Chave-Valor a partir de um Conjunto de Resultados</title>
  728. <para>
  729. O método <methodname>fetchPairs()</methodname> retorna dados em um matriz
  730. de pares chave-valor, como um matriz associativo com uma entrada única
  731. por linha. A chave desse matriz associativo é tomada da
  732. primeira coluna devolvida pela consulta <acronym>SELECT</acronym>. O valor é tomado
  733. da segunda coluna devolvida pela consulta <acronym>SELECT</acronym>. Quaisquer
  734. outras colunas devolvidas pela consulta são descartadas.
  735. </para>
  736. <para>
  737. Você deve projetar a conuslta <acronym>SELECT</acronym> de modo que a primeira
  738. coluna devolvida tenha valores únicos. Se há valores duplicados na
  739. primeira coluna, entradas na matriz associativo serão
  740. sobrescritas.
  741. </para>
  742. <example id="zend.db.adapter.select.fetchpairs.example">
  743. <title>Usando fetchPairs()</title>
  744. <programlisting language="php"><![CDATA[
  745. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  746. $result = $db->fetchPairs('SELECT bug_id, bug_status FROM bugs');
  747. echo $result[2];
  748. ]]></programlisting>
  749. </example>
  750. </sect3>
  751. <sect3 id="zend.db.adapter.select.fetchrow">
  752. <title>Buscando uma Linha Única a partir de um Conjunto de Resultados</title>
  753. <para>
  754. O método <methodname>fetchRow()</methodname> retorna dados usando o
  755. modo de busca atual, mas retorna somente a primeira linha
  756. buscada a partir do conjunto de resultados.
  757. </para>
  758. <example id="zend.db.adapter.select.fetchrow.example">
  759. <title>Using fetchRow()</title>
  760. <programlisting language="php"><![CDATA[
  761. $db->setFetchMode(Zend_Db::FETCH_OBJ);
  762. $result = $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2');
  763. // note que $result é um único objeto, não um matriz de objetos
  764. echo $result->bug_description;
  765. ]]></programlisting>
  766. </example>
  767. </sect3>
  768. <sect3 id="zend.db.adapter.select.fetchone">
  769. <title>Buscando um Escalar Único a partir de um Conjunto de Resultados</title>
  770. <para>
  771. O método <methodname>fetchOne()</methodname> é como uma combinação
  772. do método <methodname>fetchRow()</methodname> com o método
  773. <methodname>fetchCol()</methodname>, no que ele retorna dados somente
  774. para a primeira linha buscada a partir do conjunto de resultados, e retorna
  775. somente o valor da primeira coluna naquela linha. Portanto ele retorna somente
  776. um único valor escalar, nem um matriz nem um objeto.
  777. </para>
  778. <example id="zend.db.adapter.select.fetchone.example">
  779. <title>Usando fetchOne()</title>
  780. <programlisting language="php"><![CDATA[
  781. $result = $db->fetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2');
  782. // este é um valor string único
  783. echo $result;
  784. ]]></programlisting>
  785. </example>
  786. </sect3>
  787. </sect2>
  788. <sect2 id="zend.db.adapter.write">
  789. <title>Gravando Mudanças no Banco de Dados</title>
  790. <para>
  791. Você pode usar a classe adaptadora para gravar novos dados ou alterar
  792. dados existentes em seu banco de dados. Esta seção descreve métodos para fazer essas
  793. operações.
  794. </para>
  795. <sect3 id="zend.db.adapter.write.insert">
  796. <title>Incluindo Dados</title>
  797. <para>
  798. Você pode adicionar novas linhas em uma tabela de seu banco de dados usando
  799. o método <methodname>insert()</methodname>. O primeiro argumento é uma string
  800. que denomina a tabela, e o segundo argumento é um matriz
  801. associativo, mapeando nomes de coluna para valores de dados.
  802. </para>
  803. <example id="zend.db.adapter.write.insert.example">
  804. <title>Incluindo em uma Tabela</title>
  805. <programlisting language="php"><![CDATA[
  806. $data = array(
  807. 'created_on' => '2007-03-22',
  808. 'bug_description' => 'Something wrong',
  809. 'bug_status' => 'NEW'
  810. );
  811. $db->insert('bugs', $data);
  812. ]]></programlisting>
  813. </example>
  814. <para>
  815. Colunas que você excluir da matriz de dados não serão especificadas para
  816. o banco de dados. Portanto, elas seguem as mesmas regras que uma
  817. declaração <acronym>SQL</acronym> <acronym>INSERT</acronym> segue: se a coluna
  818. tem uma cláusula <acronym>DEFAULT</acronym>, a coluna leva o valor na linha
  819. criada, caso contrário é deixado em um estado <constant>NULL</constant>.
  820. </para>
  821. <para>
  822. Por padrão, os valores em seu matriz de dados são incluídos usando
  823. parâmetros. ISso reduz o risco de alguns tipos de problemas de
  824. segurança. Você não precisa aplicar escaping ou quoting para valores
  825. na matriz de dados.
  826. </para>
  827. <para>
  828. Você pode precisar que valores na matriz de dados sejam tratados como expressões
  829. <acronym>SQL</acronym>, caso no qual elas não devam sofrer quoting. Por
  830. padrão, todos os valores de dados passados como strings são tratados como
  831. literais string. Para especificar que o valor é uma expressão
  832. <acronym>SQL</acronym> e portanto não deve sofrer quoting, passe o valor
  833. na matriz de dados como um objeto do tipo <classname>Zend_Db_Expr</classname>
  834. em vez de texto claro.
  835. </para>
  836. <example id="zend.db.adapter.write.insert.example2">
  837. <title>Incluindo Expressões em uma Tabela</title>
  838. <programlisting language="php"><![CDATA[
  839. $data = array(
  840. 'created_on' => new Zend_Db_Expr('CURDATE()'),
  841. 'bug_description' => 'Something wrong',
  842. 'bug_status' => 'NEW'
  843. );
  844. $db->insert('bugs', $data);
  845. ]]></programlisting>
  846. </example>
  847. </sect3>
  848. <sect3 id="zend.db.adapter.write.lastinsertid">
  849. <title>Recuperando um Valor Gerado</title>
  850. <para>
  851. Algumas marcas de <acronym>SGBDR</acronym> suportam autoincremento de chaves
  852. primárias. Uma tabela definida desse modo gera um valor de chave primária
  853. automaticamente durante um <acronym>INSERT</acronym> de uma nova linha. O valor de
  854. retorno do método <methodname>insert()</methodname> <emphasis>não</emphasis> é
  855. o último ID incluído, porque a tabela pode não ter uma
  856. coluna de autoincremento. Em vez disso, o valor de retorno é o
  857. número de linhas afetadas (geralmente 1).
  858. </para>
  859. <para>
  860. Se sua tabela é definida com uma chave primária de autoincremento
  861. você pode chamar o método <methodname>lastInsertId()</methodname> depois da
  862. inclusão. Esse método retonra o último valor gerado no
  863. escopo da conexão atual com o banco de dados.
  864. </para>
  865. <example id="zend.db.adapter.write.lastinsertid.example-1">
  866. <title>Usando lastInsertId() para uma Chave de Autoincremento</title>
  867. <programlisting language="php"><![CDATA[
  868. $db->insert('bugs', $data);
  869. // retorna o último valor gerado por uma coluna de autoincremento
  870. $id = $db->lastInsertId();
  871. ]]></programlisting>
  872. </example>
  873. <para>
  874. Algumas marcas de <acronym>SGBDR</acronym> suportam um objeto de sequencia, que
  875. gera valores únicos para servir como valores da chave primária. Para suportar
  876. sequencias, o método <methodname>lastInsertId()</methodname> aceita dois
  877. argumentos string opcionais. Esses argumentos denominam a tabela e
  878. a coluna, assumindo que você tenha seguido a convenção de que uma
  879. sequencias é denominada usando os nomes de tabela e coluna para os quais
  880. a sequencia gera valores, e um sufixo "_seq". Isso é
  881. baseado na convenção usada pelo PostgreSQL quando nomeia
  882. sequencias para colunas <constant>SERIAL</constant>. Por exemplo, uma tabela "bugs"
  883. com a coluna de chave primária "bug_id" usaria uma sequencia denominada
  884. "bugs_bug_id_seq".
  885. </para>
  886. <example id="zend.db.adapter.write.lastinsertid.example-2">
  887. <title>Usando lastInsertId() para uma Sequencia</title>
  888. <programlisting language="php"><![CDATA[
  889. $db->insert('bugs', $data);
  890. // retorna o último valor gerado pela sequencia 'bugs_bug_id_seq'.
  891. $id = $db->lastInsertId('bugs', 'bug_id');
  892. // alternativamente, retorna o último valor gerado pela sequencia 'bugs_seq'.
  893. $id = $db->lastInsertId('bugs');
  894. ]]></programlisting>
  895. </example>
  896. <para>
  897. Se o nome de seu objeto de sequencia não seguir essa convenção
  898. de nomes, use o método <methodname>lastSequenceId()</methodname>
  899. em seu lugar. Esse método leva um único argumento string, nomeando
  900. literalmente a sequencia.
  901. </para>
  902. <example id="zend.db.adapter.write.lastinsertid.example-3">
  903. <title>Usando lastSequenceId()</title>
  904. <programlisting language="php"><![CDATA[
  905. $db->insert('bugs', $data);
  906. // retorna o último valor gerado pela sequencia 'bugs_id_gen'.
  907. $id = $db->lastSequenceId('bugs_id_gen');
  908. ]]></programlisting>
  909. </example>
  910. <para>
  911. Para as marcas de <acronym>SGBDR</acronym> que não suportam sequencias, incluindo
  912. MariaDB, MySQL, Microsoft <acronym>SQL</acronym> Server, e SQLite, os argumentos
  913. para o método <methodname>lastInsertId()</methodname> são ignorados, e o valor
  914. devolvido é o valor mais recente gerado para qualquer tabela por operações
  915. <acronym>INSERT</acronym> durante a conexão atual. Para essas marcas de
  916. <acronym>SGBDR</acronym>, o método <methodname>lastSequenceId()</methodname> sempre
  917. devolve <constant>NULL</constant>.
  918. </para>
  919. <note>
  920. <title>Porque Não Usar "SELECT MAX(id) FROM table"?</title>
  921. <para>
  922. Algumas essa consulta retorna valor de chave primária mais recente
  923. incluído em uma tabela. Entretanto, essa técnica
  924. não é segura para ser usada em um ambiente onde múltiplos clientes estão
  925. incluindo registros no banco de dados. É possível, e
  926. portanto pode acontecer eventualmente, que outro
  927. cliente inclua outra linha no instante entre a
  928. inclusão executada por sua aplicação cliente e sua consulta
  929. para o valor de <methodname>MAX(id)</methodname>. Assim o valor devolvido
  930. não identifica a linha que você incluiu, mas sim a linha
  931. incluída por algum outro cliente. Não há um modo de saber
  932. quando isso aconteceu.
  933. </para>
  934. <para>
  935. Usar um modo de isolamento de transação forte tal como
  936. "repeatable read" pode mitigar esse risco, mas algumas marcas de
  937. <acronym>SGBDR</acronym> não suportam o isolamento de transação necessário para
  938. isso, ou sua aplicação pode usar um modo de isolamento
  939. de transação baixo por projeto.
  940. </para>
  941. <para>
  942. Além disso, usar uma expressão como "<command>MAX(id)+1</command>" para gerar
  943. um novo valor para uma chave primária não é seguro, porque dois clientes
  944. poderiam fazer esta consulta simultanamente, e em seguida, ambos usariam
  945. o mesmo valor calculado para sua próxima operação <acronym>INSERT</acronym>.
  946. </para>
  947. <para>
  948. Todas as marcas de <acronym>SGBDR</acronym> fornecem mecanismos para gerar
  949. valores únicos e retornar o último valor gerado. Esses
  950. mecanismos necessariamente trabalham fora do escopo de
  951. isolamento da transação, portanto, não há chance de dois clientes
  952. gerarem o mesmo valor, e não há chance de que o
  953. valor gerado por um outro cliente possa ser informado à sua
  954. conexão de cliente como o último valor gerado.
  955. </para>
  956. </note>
  957. </sect3>
  958. <sect3 id="zend.db.adapter.write.update">
  959. <title>Updating Data</title>
  960. <para>
  961. Você pode atualizar linhas em uma tabela de banco de dados usando o
  962. método <methodname>update()</methodname> de uma adaptadora. Esse método leva
  963. três argumentos: o primeiro é o nome da tabela, o
  964. segundo é um matriz associativo mapeando as colunas a serem alteradas para os novos
  965. valores a serem atribuídos a essas colunas.
  966. </para>
  967. <para>
  968. Os valores na matriz de dados são tratados como sequências de caracteres.
  969. Veja <link linkend="zend.db.adapter.write.insert">esta seção</link>
  970. para obter informações sobre como utilizar expressões <acronym>SQL</acronym> na
  971. matriz de dados.
  972. </para>
  973. <para>
  974. O terceiro argumento é uma string contendo uma expressão <acronym>SQL</acronym>
  975. que é usada como critério para as linhas a serem alteradas. Os valores
  976. e identificadores nesse argumento não são citados ou escapados.
  977. Você é responsável por garantir que o conteúdo dinâmico seja
  978. interpolados para essa sequência de forma segura.
  979. Veja <link linkend="zend.db.adapter.quoting">esta seção</link>
  980. para métodos que o ajudam a fazer isso.
  981. </para>
  982. <para>
  983. O valor de retorno é o número de linhas afetadas pela operação
  984. de atualização.
  985. </para>
  986. <example id="zend.db.adapter.write.update.example">
  987. <title>Atualizando Linhas</title>
  988. <programlisting language="php"><![CDATA[
  989. $data = array(
  990. 'updated_on' => '2007-03-23',
  991. 'bug_status' => 'FIXED'
  992. );
  993. $n = $db->update('bugs', $data, 'bug_id = 2');
  994. ]]></programlisting>
  995. </example>
  996. <para>
  997. Se você omitir o terceiro argumento, então todas as linhas na tabela
  998. do banco de dados são atualizadas com os valores especificados no matriz de dados.
  999. </para>
  1000. <para>
  1001. Se você fornecer um matriz de strings como terceiro argumento, essas
  1002. strings são unidas como termos em uma expressão separada
  1003. por operadores <constant>AND</constant>.
  1004. </para>
  1005. <para>
  1006. Se você fornecer um matriz de matrizs como terceiro argumento, os
  1007. valores serão automaticamente citados dentro das chaves. Esses
  1008. serão então unidos como termos, separados por
  1009. operadores <constant>AND</constant>.
  1010. </para>
  1011. <example id="zend.db.adapter.write.update.example-array">
  1012. <title>Atualizando Linhas Usando um matriz de Expressões</title>
  1013. <programlisting language="php"><![CDATA[
  1014. $data = array(
  1015. 'updated_on' => '2007-03-23',
  1016. 'bug_status' => 'FIXED'
  1017. );
  1018. $where[] = "reported_by = 'goofy'";
  1019. $where[] = "bug_status = 'OPEN'";
  1020. $n = $db->update('bugs', $data, $where);
  1021. // A SQL resultante é:
  1022. // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
  1023. // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')
  1024. ]]></programlisting>
  1025. </example>
  1026. <example id="zend.db.adapter.write.update.example-arrayofarrays">
  1027. <title>Atualizando Linhas Usando um matriz de matrizs</title>
  1028. <programlisting language="php"><![CDATA[
  1029. $data = array(
  1030. 'updated_on' => '2007-03-23',
  1031. 'bug_status' => 'FIXED'
  1032. );
  1033. $where['reported_by = ?'] = 'goofy';
  1034. $where['bug_status = ?'] = 'OPEN';
  1035. $n = $db->update('bugs', $data, $where);
  1036. // A SQL resultante é:
  1037. // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
  1038. // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')
  1039. ]]></programlisting>
  1040. </example>
  1041. </sect3>
  1042. <sect3 id="zend.db.adapter.write.delete">
  1043. <title>Excluindo Dados</title>
  1044. <para>
  1045. Você pode excluir linhas de uma tabela de banco de dados usando o
  1046. método <methodname>delete()</methodname>methodName>. Esse método leva dois
  1047. argumentos: O primeiro é uma string com o nome da tabela.
  1048. </para>
  1049. <para>
  1050. O segundo argumento é uma string contendo uma expressão <acronym>SQL</acronym>
  1051. que é usada como critério para as linhas a eliminar. Os valores
  1052. e identificadores nesse argumento não são citados ou escapado.
  1053. Você é responsável por garantir que o conteúdo dinâmico seja
  1054. interpolado para esta seqüência de forma segura.
  1055. Veja <link linkend="zend.db.adapter.quoting">esta seção</link>
  1056. para métodos que o ajudam a fazer isso.
  1057. </para>
  1058. <para>
  1059. O valor de retorno é o número de linhas afetadas pela operação
  1060. de exclusão.
  1061. </para>
  1062. <example id="zend.db.adapter.write.delete.example">
  1063. <title>Excluindo Linhas</title>
  1064. <programlisting language="php"><![CDATA[
  1065. $n = $db->delete('bugs', 'bug_id = 3');
  1066. ]]></programlisting>
  1067. </example>
  1068. <para>
  1069. Se você omitir o segundo argumento, o resultado é que todas as linhas na
  1070. tabela do banco de dados são eliminadas.
  1071. </para>
  1072. <para>
  1073. Se você fornecer um matriz de strings como o segundo argumento, essas
  1074. strings são unidas como termos em uma expressão separada
  1075. por operadores <constant>AND</constant>.
  1076. </para>
  1077. <para>
  1078. Se você fornecer um matriz de matrizs como segundo argumento, os
  1079. valores serão automaticamente citados dentro das chaves. Esses
  1080. serão então unidos como termos, separados por
  1081. operadores <constant>AND</constant>.
  1082. </para>
  1083. </sect3>
  1084. </sect2>
  1085. <sect2 id="zend.db.adapter.quoting">
  1086. <title>Citando Valores e Identificadores</title>
  1087. <para>
  1088. Quando você monta consultas <acronym>SQL</acronym>, muitas vezes é o caso de você
  1089. precisar incluir os valores de variáveis<acronym>PHP</acronym> em expressões
  1090. <acronym>SQL</acronym>. Isso é arriscado, porque se o valor em uma string
  1091. <acronym>PHP</acronym> contém certos símbolos, como o símbolo de citação, isso pode
  1092. resultar em <acronym>SQL</acronym> inválido. Por exemplo, observe os apóstrofos não
  1093. balanceados na seguinte consulta:
  1094. </para>
  1095. <programlisting language="php"><![CDATA[
  1096. $name = "O'Reilly";
  1097. $sql = "SELECT * FROM bugs WHERE reported_by = '$name'";
  1098. echo $sql;
  1099. // SELECT * FROM bugs WHERE reported_by = 'O'Reilly'
  1100. ]]></programlisting>
  1101. <para>
  1102. Ainda pior é o risco de tais erros de código possam ser explorados
  1103. deliberadamente por uma pessoa que está tentando manipular a função
  1104. de sua aplicação web. Se eles podem especificar o valor de uma variável
  1105. <acronym>PHP</acronym> através do uso de um parâmetro <acronym>HTTP</acronym> ou
  1106. outro mecanismo, eles podem ser capazes de fazer suas consultas <acronym>SQL</acronym>
  1107. fazerem coisas que você não pretendia que elas fizessem, tais retornar dados para a
  1108. pessoa que não deveria ter o privilégio de lê-los. Essa é uma técnica grave e
  1109. generalizada para violar a segurança do aplicativo, conhecido como "SQL Injection"
  1110. (veja <ulink url="http://en.wikipedia.org/wiki/SQL_Injection">
  1111. http://en.wikipedia.org/wiki/SQL_Injection
  1112. </ulink>).
  1113. </para>
  1114. <para>
  1115. A classe adaptadora <classname>Zend_Db</classname> fornece funções convenientes para
  1116. ajudar a reduzir as vulnerabilidades para ataques de Injeção de <acronym>SQL</acronym>
  1117. em seu código <acronym>PHP</acronym>. A solução é escapar caracteres especiais tais
  1118. como apóstrofos em valores <acronym>PHP</acronym> antes deles serem interpolados em
  1119. suas strings <acronym>SQL</acronym>. Isso protege tanto contra manipulação acidental
  1120. quanto deliberada de strings <acronym>SQL</acronym> por variáveis
  1121. <acronym>PHP</acronym> que contém caracteres especiais.
  1122. </para>
  1123. <sect3 id="zend.db.adapter.quoting.quote">
  1124. <title>Usando quote()</title>
  1125. <para>
  1126. O método <methodname>quote()</methodname> aceita um único argumento, um
  1127. valor string escalar. Ele retorna o valor com
  1128. caracteres especiais de uma forma adequada para o <acronym>SGBDR</acronym> que você
  1129. está usando, e rodeado por delimitadores de valor de string. O
  1130. delimitador de valor de string padrão <acronym>SQL</acronym> é o apóstrofo
  1131. ( ').
  1132. </para>
  1133. <example id="zend.db.adapter.quoting.quote.example">
  1134. <title>Usando quote()</title>
  1135. <programlisting language="php"><![CDATA[
  1136. $name = $db->quote("O'Reilly");
  1137. echo $name;
  1138. // 'O\'Reilly'
  1139. $sql = "SELECT * FROM bugs WHERE reported_by = $name";
  1140. echo $sql;
  1141. // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'
  1142. ]]></programlisting>
  1143. </example>
  1144. <para>
  1145. Note que o valor de retorno de <methodname>quote()</methodname> inclui os
  1146. delimitadores de citação em torno da cadeia. Isso é diferente de
  1147. algumas funções que escapam caracteres especiais, mas não adicionam
  1148. os delimitadores de citação, por exemplo
  1149. <ulink url="http://www.php.net/mysqli_real_escape_string">
  1150. mysql_real_escape_string()
  1151. </ulink>.
  1152. </para>
  1153. <para>
  1154. Os valores podem precisar ser citados ou não citados de acordo com o
  1155. contexto de tipo de dados <acronym>SQL</acronym> em que eles são usados. Por
  1156. exemplo, em algumas marcas de <acronym>SGBDR</acronym>, um valor inteiro não deve
  1157. ser citado como uma string se for comparado a uma coluna ou expressão do tipo
  1158. inteiro. Em outras palavras, o código seguinte é um erro em algumas implementações
  1159. <acronym>SQL</acronym>, assumindo que <property>intColumn</property> tem um tipo de
  1160. dados <acronym>SQL</acronym> <constant>INTEGER</constant>
  1161. </para>
  1162. <programlisting language="php"><![CDATA[
  1163. SELECT * FROM atable WHERE intColumn = '123'
  1164. ]]></programlisting>
  1165. <para>
  1166. Você pode usar o segundo argumento opcional para o
  1167. método <methodname>quote()</methodname> para aplicar citação seletivamente para
  1168. o tipo de dados <acronym>SQL</acronym> que você especificar.
  1169. </para>
  1170. <example id="zend.db.adapter.quoting.quote.example-2">
  1171. <title>Usando quote() com um Tipo SQL</title>
  1172. <programlisting language="php"><![CDATA[
  1173. $value = '1234';
  1174. $sql = 'SELECT * FROM atable WHERE intColumn = '
  1175. . $db->quote($value, 'INTEGER');
  1176. ]]></programlisting>
  1177. </example>
  1178. <para>
  1179. Cada classe <classname>Zend_Db_Adapter</classname> tem codificada os nomes de
  1180. tipos de dados <acronym>SQL</acronym> numéricos para a respectiva marca de
  1181. <acronym>SGBDR</acronym>. Você também pode usar as constantes
  1182. <constant>Zend_Db::INT_TYPE</constant>, <constant>Zend_Db::BIGINT_TYPE</constant>,
  1183. e <constant>Zend_Db::FLOAT_TYPE</constant> para escrever código de uma forma mais
  1184. independente de <acronym>SGBDR</acronym>.
  1185. </para>
  1186. <para>
  1187. <classname>Zend_Db_Table</classname> especifica <acronym>SQL</acronym> para
  1188. <methodname>quote()</methodname> automaticamente ao gerar
  1189. consultas <acronym>SQL</acronym> que referenciam colunas-chave de uma tabela.
  1190. </para>
  1191. </sect3>
  1192. <sect3 id="zend.db.adapter.quoting.quote-into">
  1193. <title>Usando quoteInto()</title>
  1194. <para>
  1195. O uso mais típico de citação é para interpolar uma variável <acronym>PHP</acronym>
  1196. em uma expressão ou declaração <acronym>SQL</acronym>. Você pode usar o
  1197. método <methodname>quoteInto()</methodname> para fazer isso em uma única etapa.
  1198. Esse método leva dois argumentos: o primeiro argumento é uma string
  1199. contendo um símbolo marcador (?), e o
  1200. segundo argumento é um valor ou variável <acronym>PHP</acronym> que deve ser
  1201. substituída pelo marcador.
  1202. </para>
  1203. <para>
  1204. O símbolo marcador é o mesmo símbolo usado por muitas marcas de
  1205. <acronym>SGBDR</acronym> para parâmetros posicionais, mas o
  1206. método <methodname>quoteInto()</methodname> apenas emula parâmetros de consulta.
  1207. O método simplesmente interpola o valor para a string,
  1208. escapa caracteres especiais, e aplica apóstrofos em torno dele.
  1209. Parâmetros de consulta verdadeiros mantêm a separação entre a string
  1210. <acronym>SQL</acronym> e os parâmetros assim que a declaração é analisada no
  1211. servidor <acronym>SGBDR</acronym>.
  1212. </para>
  1213. <example id="zend.db.adapter.quoting.quote-into.example">
  1214. <title>Usando quoteInto()</title>
  1215. <programlisting language="php"><![CDATA[
  1216. $sql = $db->quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");
  1217. echo $sql;
  1218. // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'
  1219. ]]></programlisting>
  1220. </example>
  1221. <para>
  1222. Você pode usar o terceiro parâmetro opcional de
  1223. <methodname>quoteInto()</methodname> para especificar o tipo de dados
  1224. <acronym>SQL</acronym>.
  1225. Tipos de dados numéricos não são citados, e outros tipos são citados.
  1226. </para>
  1227. <example id="zend.db.adapter.quoting.quote-into.example-2">
  1228. <title>Using quoteInto() with a SQL Type</title>
  1229. <programlisting language="php"><![CDATA[
  1230. $sql = $db
  1231. ->quoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER');
  1232. echo $sql;
  1233. // SELECT * FROM bugs WHERE reported_by = 1234
  1234. ]]></programlisting>
  1235. </example>
  1236. </sect3>
  1237. <sect3 id="zend.db.adapter.quoting.quote-identifier">
  1238. <title>Usando quoteIdentifier()</title>
  1239. <para>
  1240. Os valores não são a única parte da sintaxe <acronym>SQL</acronym> que pode
  1241. precisar ser variável. Se você usar variáveis <acronym>PHP</acronym> para nomear
  1242. tabelas, colunas, ou outros identificadores em suas declarações
  1243. <acronym>SQL</acronym>, pode ser necessário citar essas strings também. Por padrão,
  1244. identificadores <acronym>SQL</acronym> têm regras de sintaxe como
  1245. <acronym>PHP</acronym> e a maioria das outras linguagens de programação.
  1246. Por exemplo, os identificadores não devem conter espaços, certas
  1247. pontuações ou caracteres especiais, ou ainda caracteres internacionais.
  1248. Certas palavras também são reservadas para a sintaxe <acronym>SQL</acronym>,
  1249. e não devem ser usadas como identificadores.
  1250. </para>
  1251. <para>
  1252. No entanto, <acronym>SQL</acronym> tem um recurso chamado
  1253. <emphasis>identificadores delimitados</emphasis>, que permite escolhas mais amplas
  1254. para a grafia de identificadores. Se você colocar um identificador
  1255. <acronym>SQL</acronym> no tipo adequado de aspas, pode usar identificadores
  1256. com dados que seriam inválidos sem as aspas. Identificadores delimitados podem
  1257. conter espaços, pontuação, ou caracteres internacionais. Você também pode usar
  1258. palavras reservadas da <acronym>SQL</acronym> se colocá-las em identificadores
  1259. delimitados.
  1260. </para>
  1261. <para>
  1262. O método <methodname>quoteIdentifier()</methodname> trabalha como
  1263. <methodname>quote()</methodname>, mas ele aplica caracteres delimitadores
  1264. de identificador para a string de acordo com o tipo de adaptador que você
  1265. usar. Por exemplo, a <acronym>SQL</acronym> padrão usa aspas duplas (")
  1266. para delimitadores de identificador, e a maioria das marcas de
  1267. <acronym>SGBDR</acronym> marcas usam esse símbolo. O MySQL usa crase (`) por
  1268. padrão. O método <methodname>quoteIdentifier()</methodname> também escapa
  1269. caracteres especiais dentro do argumento string.
  1270. </para>
  1271. <example id="zend.db.adapter.quoting.quote-identifier.example">
  1272. <title>Usando quoteIdentifier()</title>
  1273. <programlisting language="php"><![CDATA[
  1274. // podemos deter um nome de tabela que é uma palavra reservada SQL
  1275. $tableName = $db->quoteIdentifier("order");
  1276. $sql = "SELECT * FROM $tableName";
  1277. echo $sql
  1278. // SELECT * FROM "order"
  1279. ]]></programlisting>
  1280. </example>
  1281. <para>
  1282. Identificadores delimitados <acronym>SQL</acronym> são sensíveis à caixa, ao
  1283. contrário de identificadores não citados. Portanto, se você usar identificadores
  1284. delimitados, você deve usar a ortografia do identificador exatamente como ela é
  1285. armazenada no seu esquema, incluindo a caixa das letras.
  1286. </para>
  1287. <para>
  1288. Na maioria dos casos onde <acronym>SQL</acronym> é gerada dentro
  1289. de classes <classname>Zend_Db</classname>, o padrão é que todos os identificadores
  1290. sejam delimitados automaticamente. Você pode alterar esse comportamento com a opção
  1291. <constant>Zend_Db::AUTO_QUOTE_IDENTIFIERS </constant>. Especifique essa opção
  1292. ao instanciar o adaptador.
  1293. Veja <link linkend="zend.db.adapter.connecting.parameters.example2">este
  1294. exemplo</link>.
  1295. </para>
  1296. </sect3>
  1297. </sect2>
  1298. <sect2 id="zend.db.adapter.transactions">
  1299. <title>Controlando Transações de Banco de Dados</title>
  1300. <para>
  1301. Bases de dados definem as operações como unidades lógicas de trabalho que podem ser
  1302. confirmadas ou revertidas como uma única mudança, mesmo que operem em várias tabelas.
  1303. Todas as consultas ao banco de dados são executadas no contexto de uma transação, mesmo
  1304. se o driver de banco de dados as gerencia implicitamente. Isso é chamado modo
  1305. <emphasis>auto-commit</emphasis>, no qual o driver de banco cria uma transação para cada
  1306. declaração que você executa, e confirma essa transação após sua declaração
  1307. <acronym>SQL</acronym> ser executada. Por padrão, todas as classes adaptadoras
  1308. <classname>Zend_Db</classname> operam em modo auto-commit.
  1309. </para>
  1310. <para>
  1311. De forma alternativa, você pode especificar o início e resolução de uma
  1312. transação, e assim controlar quantas consultas <acronym>SQL</acronym> estão incluídas
  1313. em um único grupo que é confirmado (ou revertido) como uma única
  1314. transação. Use o método <methodname>beginTransaction()</methodname> para
  1315. iniciar uma transação. Posteriormente declarações <acronym>SQL</acronym> são executadas
  1316. no contexto da mesma transação, até que você o resolva explicitamente.
  1317. </para>
  1318. <para>
  1319. Para resolver a transação, use o método <methodname>commit()</methodname> ou
  1320. <methodname>rollBack()</methodname>. O método <methodname>commit()</methodname>
  1321. altera marcas feitas durante a sua transação como confirmadas, o que
  1322. significa que os efeitos dessas mudanças são mostrados em consultas executadas em
  1323. outras transações.
  1324. </para>
  1325. <para>
  1326. O método <methodname>rollBack()</methodname> faz o oposto: ele descarta
  1327. as alterações feitas durante a transação. As mudanças são
  1328. efetivamente desfeitas, e o estado dos dados retorna a como estava
  1329. antes de você começar sua transação. No entanto, a reversão de sua
  1330. transação não tem efeito sobre as mudanças feitas por outras transações
  1331. executadas simultaneamente.
  1332. </para>
  1333. <para>
  1334. Depois de resolver essa operação, <classname>Zend_Db_Adapter</classname>
  1335. retorna ao modo auto-commit, até que você chame
  1336. <methodname>beginTransaction()</methodname> novamente.
  1337. </para>
  1338. <example id="zend.db.adapter.transactions.example">
  1339. <title>Gerenciando uma Transação para Garantir Consistência</title>
  1340. <programlisting language="php"><![CDATA[
  1341. // Inicie uma transação explicitamente.
  1342. $db->beginTransaction();
  1343. try {
  1344. // Tenta executar uma ou mais consultas:
  1345. $db->query(...);
  1346. $db->query(...);
  1347. $db->query(...);
  1348. // Se todas tem sucesso, confirma a transação e todas as mudanças
  1349. // são confirmadas de uma vez.
  1350. $db->commit();
  1351. } catch (Exception $e) {
  1352. // Se qualquer uma das consultas falhar e lançar uma exceção
  1353. // nós queremos desfazer a transação inteira, revertendo
  1354. // mudanças feitas na transação, mesmo aquelas que tiveram sucesso
  1355. // Assim todas as mudanças são confirmadas juntas, ou nenhuma é.
  1356. $db->rollBack();
  1357. echo $e->getMessage();
  1358. }
  1359. ]]></programlisting>
  1360. </example>
  1361. </sect2>
  1362. <sect2 id="zend.db.adapter.list-describe">
  1363. <title>Listando e Descrevendo Tabelas</title>
  1364. <para>
  1365. O método <methodname>listTables()</methodname> retorna uma matriz de strings,
  1366. com os nomes de todas as tabelas do banco de dados atual.
  1367. </para>
  1368. <para>
  1369. O método <methodname>describeTable()</methodname> retorna uma matriz associativa
  1370. de metadados sobre uma tabela. Especifique o nome da tabela
  1371. como uma string no primeiro argumento para este método. O segundo
  1372. argumento é opcional, e identifica o esquema no qual a tabela
  1373. existe.
  1374. </para>
  1375. <para>
  1376. As chaves da matriz associativa retornada são os nomes das colunas
  1377. da tabela. O valor correspondente a cada coluna é também uma
  1378. matriz associativa, com as seguintes chaves e valores:
  1379. </para>
  1380. <table frame="all" cellpadding="5" id="zend.db.adapter.list-describe.metadata">
  1381. <title>Campos de Metadados Devolvidos por describeTable()</title>
  1382. <tgroup cols="3" align="left" colsep="1" rowsep="1">
  1383. <thead>
  1384. <row>
  1385. <entry>Key</entry>
  1386. <entry>Type</entry>
  1387. <entry>Description</entry>
  1388. </row>
  1389. </thead>
  1390. <tbody>
  1391. <row>
  1392. <entry><constant>SCHEMA_NAME</constant></entry>
  1393. <entry>(string)</entry>
  1394. <entry>
  1395. Nome do esquema do banco de dados no qual essa tabela existe.
  1396. </entry>
  1397. </row>
  1398. <row>
  1399. <entry><constant>TABLE_NAME</constant></entry>
  1400. <entry>(string)</entry>
  1401. <entry>Nome da tabela a qual esta coluna pertence.</entry>
  1402. </row>
  1403. <row>
  1404. <entry><constant>COLUMN_NAME</constant></entry>
  1405. <entry>(string)</entry>
  1406. <entry>Nome da coluna.</entry>
  1407. </row>
  1408. <row>
  1409. <entry><constant>COLUMN_POSITION</constant></entry>
  1410. <entry>(integer)</entry>
  1411. <entry>Posição ordinal da coluna na tabela.</entry>
  1412. </row>
  1413. <row>
  1414. <entry><constant>DATA_TYPE</constant></entry>
  1415. <entry>(string)</entry>
  1416. <entry>Nome do tipo de dados do <acronym>SGBDR</acronym> da coluna.</entry>
  1417. </row>
  1418. <row>
  1419. <entry><constant>DEFAULT</constant></entry>
  1420. <entry>(string)</entry>
  1421. <entry>Valor padrão para a coluna, se houver.</entry>
  1422. </row>
  1423. <row>
  1424. <entry><constant>NULLABLE</constant></entry>
  1425. <entry>(boolean)</entry>
  1426. <entry>
  1427. <constant>TRUE</constant> se a coluna aceita <acronym>SQL</acronym>
  1428. <constant>NULL</constant>'s, <constant>FALSE</constant> se a
  1429. coluna tem uma restrição <constant>NOT</constant>
  1430. <constant>NULL</constant>.
  1431. </entry>
  1432. </row>
  1433. <row>
  1434. <entry><constant>LENGTH</constant></entry>
  1435. <entry>(integer)</entry>
  1436. <entry>
  1437. Comprimento ou tamanho da coluna como informado pelo
  1438. <acronym>SGBDR</acronym>.
  1439. </entry>
  1440. </row>
  1441. <row>
  1442. <entry><constant>SCALE</constant></entry>
  1443. <entry>(integer)</entry>
  1444. <entry>
  1445. Escala de tipo <acronym>SQL</acronym> <constant>NUMERIC</constant> ou
  1446. <constant>DECIMAL</constant>.
  1447. </entry>
  1448. </row>
  1449. <row>
  1450. <entry><constant>PRECISION</constant></entry>
  1451. <entry>(integer)</entry>
  1452. <entry>
  1453. Precisão de tipo <acronym>SQL</acronym> <constant>NUMERIC</constant> ou
  1454. <constant>DECIMAL</constant>.
  1455. </entry>
  1456. </row>
  1457. <row>
  1458. <entry><constant>UNSIGNED</constant></entry>
  1459. <entry>(boolean)</entry>
  1460. <entry>
  1461. <constant>TRUE</constant> se um tipo baseado em inteiro for informado
  1462. como <constant>UNSIGNED</constant>.
  1463. </entry>
  1464. </row>
  1465. <row>
  1466. <entry><constant>PRIMARY</constant></entry>
  1467. <entry>(boolean)</entry>
  1468. <entry>
  1469. <constant>TRUE</constant> se a coluna é parte da chave primária dessa
  1470. tabela.
  1471. </entry>
  1472. </row>
  1473. <row>
  1474. <entry><constant>PRIMARY_POSITION</constant></entry>
  1475. <entry>(integer)</entry>
  1476. <entry>Posição ordinal (baseada em 1) da coluna na chave primária.</entry>
  1477. </row>
  1478. <row>
  1479. <entry><constant>IDENTITY</constant></entry>
  1480. <entry>(boolean)</entry>
  1481. <entry>
  1482. <constant>TRUE</constant> se a coluna usa um valor autogerado.
  1483. </entry>
  1484. </row>
  1485. </tbody>
  1486. </tgroup>
  1487. </table>
  1488. <note>
  1489. <title>Como o Campo de Metadados IDENTITY Relaciona-se com SGBDRs Específicos</title>
  1490. <para>
  1491. O campo de metadados <constant>IDENTITY</constant> foi escolhido como um termo
  1492. 'idiomático' para representar uma relação de chaves substitutas. Este campo pode ser
  1493. vulgarmente conhecido pelos seguintes valores: --
  1494. </para>
  1495. <itemizedlist>
  1496. <listitem>
  1497. <para>
  1498. <constant>IDENTITY</constant> - <acronym>DB2</acronym>,
  1499. <acronym>MSSQL</acronym>
  1500. </para>
  1501. </listitem>
  1502. <listitem>
  1503. <para>
  1504. <constant>AUTO_INCREMENT</constant> - MySQL/MariaDB
  1505. </para>
  1506. </listitem>
  1507. <listitem>
  1508. <para>
  1509. <constant>SERIAL</constant> - PostgreSQL
  1510. </para>
  1511. </listitem>
  1512. <listitem>
  1513. <para>
  1514. <constant>SEQUENCE</constant> - Oracle
  1515. </para>
  1516. </listitem>
  1517. </itemizedlist>
  1518. </note>
  1519. <para>
  1520. Se não houver nenhum tabela que se encaixe com o nome da tabela e nome de esquema
  1521. opcional especificado, então <methodname>describeTable()</methodname> retorna uma
  1522. matriz vazia.
  1523. </para>
  1524. </sect2>
  1525. <sect2 id="zend.db.adapter.closing">
  1526. <title>Fechando uma Conexão</title>
  1527. <para>
  1528. Normalmente não é necessário fechar uma conexão de dados. <acronym>PHP</acronym>
  1529. limpa automaticamente todos os recursos ao final de uma requisição.
  1530. Extensões de Banco de Dados são projetadas para fechar a conexão assim que a
  1531. referência para o objeto do recurso é eliminada.
  1532. </para>
  1533. <para>
  1534. No entanto, se você tem um script de longa duração <acronym>PHP</acronym> que inicia
  1535. muitas conexões de banco de dados, talvez seja necessário encerrar a conexão, para
  1536. evitar um esgotamento da capacidade de seu servidor <acronym>SGBDR</acronym>. Você pode
  1537. usar o método <methodname>closeConnection()</methodname> da classe adaptadora fechar
  1538. explicitamente a conexão de dados subjacente.
  1539. </para>
  1540. <para>
  1541. Desde a versão 1.7.2, você pode verificar se está conectado ao
  1542. servidor <acronym>SGBDR</acronym> com o método <methodname>isConnected()</methodname>.
  1543. Isso significa que um recurso de conexão foi iniciado e não foi fechado. Essa
  1544. função não é atualmente capaz de testar, por exemplo, um fechamento do lado servidor
  1545. da conexão. Ela é usada internamente para fechar a conexão. Isso permite que você feche
  1546. a conexão várias vezes sem erros. Já era o caso antes de 1.7.2 para adaptadores
  1547. <acronym>PDO</acronym>, mas não para os outros.
  1548. </para>
  1549. <example id="zend.db.adapter.closing.example">
  1550. <title>Fechando uma Conexão com o Banco de Dados</title>
  1551. <programlisting language="php"><![CDATA[
  1552. $db->closeConnection();
  1553. ]]></programlisting>
  1554. </example>
  1555. <note>
  1556. <title>Zend_Db Suporta Conexões Persistentes?</title>
  1557. <para>
  1558. Sim, a persistência é suportada através da adição da
  1559. propriedade <property>persistent</property> definida como <constant>TRUE</constant>
  1560. na configuração (não em driver_configuration) de um adaptador
  1561. em <classname>Zend_Db</classname>.
  1562. </para>
  1563. <example id="zend.db.adapter.connecting.persistence.example">
  1564. <title>Usando a Propriedade Persistence com o Adaptador Oracle</title>
  1565. <programlisting language="php"><![CDATA[
  1566. $db = Zend_Db::factory('Oracle', array(
  1567. 'host' => '127.0.0.1',
  1568. 'username' => 'webuser',
  1569. 'password' => 'xxxxxxxx',
  1570. 'dbname' => 'test',
  1571. 'persistent' => true
  1572. ));
  1573. ]]></programlisting>
  1574. </example>
  1575. <para>
  1576. Por favor, note que o uso de conexões persistentes pode causar um
  1577. excesso de conexões inativas no servidor <acronym>SGBDR</acronym>, o que leva a
  1578. mais problemas do que qualquer ganho de desempenho que você possa obter por
  1579. reduzir a sobrecarga de fazer conexões.
  1580. </para>
  1581. <para>
  1582. Conexões de banco de dados tem estado. Isto é, alguns objetos no
  1583. servidor <acronym>SGBDR</acronym> existem no escopo de sessão.
  1584. Exemplos são bloqueios, variáveis de usuário,
  1585. tabelas temporárias, e informações sobre as consultas mais
  1586. recentemente executadas, tais como linhas afetadas e o último
  1587. valor gerado de id. Se você usa conexões persistentes, a sua
  1588. aplicação pode acessar dados inválidos ou privilegiadas que foram
  1589. criado em uma solicitação <acronym>PHP</acronym> anterior.
  1590. </para>
  1591. <para>
  1592. Atualmente, apenas Oracle, <acronym>DB2</acronym>, e os adaptadores
  1593. <acronym>PDO</acronym> (onde especificado pelo <acronym>PHP</acronym>) suportam
  1594. persistência em <classname>Zend_Db</classname>.
  1595. </para>
  1596. </note>
  1597. </sect2>
  1598. <sect2 id="zend.db.adapter.other-statements">
  1599. <title>Rodando Outras Declarações de Banco de Dados</title>
  1600. <para>
  1601. Pode haver casos em que você precisa acessar o objeto de conexão
  1602. diretamente, como provido pela extensão de banco de dados <acronym>PHP</acronym>.
  1603. Algumas dessas extensões podem oferecer recursos que não são cobertos por
  1604. métodos de <classname>Zend_Db_Adapter_Abstract</classname>.
  1605. </para>
  1606. <para>
  1607. Por exemplo, todas as declarações <acronym>SQL</acronym> rodadas por
  1608. <classname>Zend_Db</classname> são preparadas, então executadas. No entanto, algumas
  1609. funções de banco de dados são incompatíveis com declarações preparadas. Instruções
  1610. <constant>DDL</constant> como <constant>CREATE</constant> e <constant>ALTER</constant>
  1611. não podem ser preparadas no MySQL. Além disso, declarações <acronym>SQL</acronym> não se
  1612. beneficiam do <ulink
  1613. url="http://dev.mysql.com/doc/refman/5.1/en/query-cache-how.html">MySQL Query
  1614. Cache</ulink>, antes do MySQL 5.1.17.
  1615. </para>
  1616. <para>
  1617. A maioria das extensões de banco de dados <acronym>PHP</acronym> fornecem um método
  1618. para executar declarações <acronym>SQL</acronym> sem prepará-los. Por exemplo, em
  1619. <acronym>PDO</acronym>, esse método é <methodname>exec()</methodname>. Você pode
  1620. acessar o objeto de conexão na extensão <acronym>PHP</acronym> diretamente usando
  1621. <methodname>getConnection()</methodname>.
  1622. </para>
  1623. <example id="zend.db.adapter.other-statements.example">
  1624. <title>Rodando uma Declaração Não Preparada em um Adaptador PDO</title>
  1625. <programlisting language="php"><![CDATA[
  1626. $result = $db->getConnection()->exec('DROP TABLE bugs');
  1627. ]]></programlisting>
  1628. </example>
  1629. <para>
  1630. A maioria das extensões de banco de dados <acronym>PHP</acronym> fornecem um método
  1631. para executar declarações <acronym>SQL</acronym> sem prepará-los. Por exemplo, em
  1632. <acronym>PDO</acronym>, esse método é <methodname>exec()</methodname>. Você pode
  1633. acessar o objeto de conexão na extensão <acronym>PHP</acronym> diretamente usando
  1634. <methodname>getConnection()</methodname>.
  1635. </para>
  1636. <para>
  1637. Em versões futuras de <classname>Zend_Db</classname>, haverá oportunidades de
  1638. adicionar pontos de entrada de método para funcionalidades que são comuns às
  1639. extensões de banco de dados <acronym>PHP</acronym> suportadas . Isso não afetará
  1640. compatibilidade com versões anteriores.
  1641. </para>
  1642. </sect2>
  1643. <sect2 id="zend.db.adapter.server-version">
  1644. <title>Recuperanco a Versão do Servidor</title>
  1645. <para>
  1646. Desde a versão 1.7.2, você pode recuperar a versão do servidor no estilo de sintaxe
  1647. <acronym>PHP</acronym> para ser capaz de usar
  1648. <methodname>version_compare()</methodname>. Se a informação não estiver disponível,
  1649. você receberá <constant>NULL</constant>.
  1650. </para>
  1651. <example id="zend.db.adapter.server-version.example">
  1652. <title>Verificando a versão do servidor antes de rodar uma consulta</title>
  1653. <programlisting language="php"><![CDATA[
  1654. $version = $db->getServerVersion();
  1655. if (!is_null($version)) {
  1656. if (version_compare($version, '5.0.0', '>=')) {
  1657. // faz alguma coisa
  1658. } else {
  1659. // faz alguma outra coisa
  1660. }
  1661. } else {
  1662. // impossível ler a versão do servidor
  1663. }
  1664. ]]></programlisting>
  1665. </example>
  1666. </sect2>
  1667. <sect2 id="zend.db.adapter.adapter-notes">
  1668. <title>Notas sobre Adaptadores Específicos</title>
  1669. <para>
  1670. Esta seção lista diferenças entre as classes adaptadoras sobre as quais
  1671. você deve ficar atento.
  1672. </para>
  1673. <sect3 id="zend.db.adapter.adapter-notes.ibm-db2">
  1674. <title>IBM DB2</title>
  1675. <itemizedlist>
  1676. <listitem>
  1677. <para>
  1678. Especifique esse adaptador para o método <methodname>factory()</methodname>
  1679. com o nome 'Db2'.
  1680. </para>
  1681. </listitem>
  1682. <listitem>
  1683. <para>
  1684. Este adaptador usa a extensão <acronym>PHP</acronym>
  1685. <constant>IBM_DB2</constant>.
  1686. </para>
  1687. </listitem>
  1688. <listitem>
  1689. <para>
  1690. <acronym>IBM</acronym> <acronym>DB2</acronym> suporta tanto seqüências
  1691. quanto chaves de autoincremento. Portanto os argumentos para
  1692. <methodname>lastInsertId()</methodname> são opcionais. Se você não fornecer
  1693. argumentos, o adaptador retorna o último valor gerado para uma chave de
  1694. autoincremento. Se você fornecer argumentos, o adaptador retorna o último
  1695. valor gerado pela seqüência nomeada de acordo com a convenção
  1696. '<emphasis>table</emphasis>_<emphasis>column</emphasis>_seq'.
  1697. </para>
  1698. </listitem>
  1699. </itemizedlist>
  1700. </sect3>
  1701. <sect3 id="zend.db.adapter.adapter-notes.mysqli">
  1702. <title>MySQLi</title>
  1703. <itemizedlist>
  1704. <listitem>
  1705. <para>
  1706. Especifique esse adaptador para o método <methodname>factory()</methodname>
  1707. com o nome 'Mysqli'.
  1708. </para>
  1709. </listitem>
  1710. <listitem>
  1711. <para>
  1712. Este adaptador utiliza a extensão <acronym>PHP</acronym>.
  1713. </para>
  1714. </listitem>
  1715. <listitem>
  1716. <para>
  1717. O MySQL e o MariaDB não suportam sequências, assim
  1718. <methodname>lastInsertId()</methodname> ignora seus argumentos e
  1719. sempre retorna o último valor gerado para uma
  1720. chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
  1721. retorna <constant>NULL</constant>.
  1722. </para>
  1723. </listitem>
  1724. </itemizedlist>
  1725. </sect3>
  1726. <sect3 id="zend.db.adapter.adapter-notes.oracle">
  1727. <title>Oracle</title>
  1728. <itemizedlist>
  1729. <listitem>
  1730. <para>
  1731. Especifique esse adaptador para o método <methodname>factory()</methodname>
  1732. com o nome de 'Oracle'.
  1733. </para>
  1734. </listitem>
  1735. <listitem>
  1736. <para>
  1737. Esse adaptador usa a extensão <acronym>PHP</acronym> oci8.
  1738. </para>
  1739. </listitem>
  1740. <listitem>
  1741. <para>
  1742. Oracle não suporta chaves de autoincremento, assim você
  1743. deve especificar o nome de uma sequência de
  1744. <methodname>lastInsertId()</methodname> ou
  1745. <methodname>lastSequenceId()</methodname>.
  1746. </para>
  1747. </listitem>
  1748. <listitem>
  1749. <para>
  1750. A extensão da Oracle não suporta parâmetros
  1751. posicionais. Você deve usar parâmetros nomeados.
  1752. </para>
  1753. </listitem>
  1754. <listitem>
  1755. <para>
  1756. Atualmente, a opção <constant>Zend_Db::CASE_FOLDING</constant>
  1757. não é suportada pelo adaptador Oracle. Para utilizar essa
  1758. opção com a Oracle, você deve usar o adaptador <acronym>PDO</acronym>
  1759. <acronym>OCI</acronym>.
  1760. </para>
  1761. </listitem>
  1762. <listitem>
  1763. <para>
  1764. Por padrão, os campos <acronym>LOB</acronym> são devolvidos como objetos
  1765. <acronym>OCI</acronym>-Lob. Você pode recuperá-los como string para todas as
  1766. solicitações, utilizando as opções do driver
  1767. '<property>lob_as_string</property>' ou para uma solicitação particular,
  1768. usando <methodname>setLobAsString(boolean)</methodname> no adaptador ou na
  1769. declaração.
  1770. </para>
  1771. </listitem>
  1772. </itemizedlist>
  1773. </sect3>
  1774. <sect3 id="zend.db.adapter.adapter-notes.sqlsrv">
  1775. <title>Microsoft SQL Server</title>
  1776. <itemizedlist>
  1777. <listitem>
  1778. <para>
  1779. Especifique esse adaptador para o método <methodname>factory()</methodname>
  1780. com o nome 'Sqlsrv'.
  1781. </para>
  1782. </listitem>
  1783. <listitem>
  1784. <para>
  1785. Esse adaptador usa a extensão <acronym>PHP</acronym> sqlsrv.
  1786. </para>
  1787. </listitem>
  1788. <listitem>
  1789. <para>
  1790. Somente o Microsoft <acronym>SQL</acronym> Server 2005 ou superior é
  1791. suportado.
  1792. </para>
  1793. </listitem>
  1794. <listitem>
  1795. <para>
  1796. Microsoft <acronym>SQL</acronym> Server não suporta sequências, assim
  1797. <methodname>lastInsertId()</methodname> ignora o argumento de chave
  1798. primária e retorna o último valor gerado para uma chave de autoincremento
  1799. se um nome de tabela for especificado ou o último id retornado por uma
  1800. consulta de inserção. O método <methodname>lastSequenceId()</methodname>
  1801. retorna <constant>NULL</constant>.
  1802. </para>
  1803. </listitem>
  1804. <listitem>
  1805. <para>
  1806. <classname>Zend_Db_Adapter_Sqlsrv</classname> configura
  1807. <constant>QUOTED_IDENTIFIER</constant> ON imediatamente após conectar-se a
  1808. um servidor <acronym>SQL</acronym>. Isso faz com que o driver utilize o
  1809. símbolo delimitador de identificador da <acronym>SQL</acronym> padrão
  1810. (<emphasis> "</emphasis>) em vez dos colchetes que a sintaxe do
  1811. <acronym>SQL</acronym> Server usa para delimitar identificadores.
  1812. </para>
  1813. </listitem>
  1814. <listitem>
  1815. <para>
  1816. Você pode especificar <property>driver_options</property> como uma chave na
  1817. matriz de opções. O valor pode ser uma coisa qualquer coisa daqui <ulink
  1818. url="http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx">
  1819. http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx</ulink>.
  1820. </para>
  1821. </listitem>
  1822. <listitem>
  1823. <para>
  1824. Você pode usar <methodname>setTransactionIsolationLevel()</methodname> para
  1825. definir nível de isolamento para a conexão atual. O valor pode ser
  1826. <constant>SQLSRV_TXN_READ_UNCOMMITTED</constant>,
  1827. <constant>SQLSRV_TXN_READ_COMMITTED</constant>,
  1828. <constant>SQLSRV_TXN_REPEATABLE_READ</constant>,
  1829. <constant>SQLSRV_TXN_SNAPSHOT</constant> ou
  1830. <constant>SQLSRV_TXN_SERIALIZABLE</constant>.
  1831. </para>
  1832. </listitem>
  1833. <listitem>
  1834. <para>
  1835. A partir de Zend Framework 1.9, a distribuição mínima suportada da
  1836. extesnão <acronym>PHP</acronym> para <acronym>SQL</acronym> Server
  1837. da Microsoft é a 1.0.1924.0. e o <acronym>MSSQL</acronym> Server Native
  1838. Client versão 9.00.3042.00.
  1839. </para>
  1840. </listitem>
  1841. </itemizedlist>
  1842. </sect3>
  1843. <sect3 id="zend.db.adapter.adapter-notes.pdo-ibm">
  1844. <title>PDO para IBM DB2 e Informix Dynamic Server (IDS)</title>
  1845. <itemizedlist>
  1846. <listitem>
  1847. <para>
  1848. Especifique esse adaptador o método <methodname>factory()</methodname>
  1849. com o nome '<classname>Pdo_Ibm</classname>'.
  1850. </para>
  1851. </listitem>
  1852. <listitem>
  1853. <para>
  1854. Esse adaptador usa as extensões <acronym>PHP</acronym>
  1855. <acronym>PDO</acronym> e <constant>PDO_IBM</constant>.
  1856. </para>
  1857. </listitem>
  1858. <listitem>
  1859. <para>
  1860. Você deve usar pelo menos a versão da extensão <constant>PDO_IBM</constant>
  1861. 1.2.2. Se você tiver uma versão anterior desta extensão, você deve atualizar
  1862. a extensão <constant>PDO_IBM</constant> a partir da <acronym>PECL</acronym>.
  1863. </para>
  1864. </listitem>
  1865. </itemizedlist>
  1866. </sect3>
  1867. <sect3 id="zend.db.adapter.adapter-notes.pdo-mssql">
  1868. <title>PDO Microsoft SQL Server</title>
  1869. <itemizedlist>
  1870. <listitem>
  1871. <para>
  1872. Especifique este adaptador para o método <methodname>factory()</methodname>
  1873. com o nome '<classname>Pdo_Mssql</classname>'.
  1874. </para>
  1875. </listitem>
  1876. <listitem>
  1877. <para>
  1878. Esse adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_dblib.
  1879. </para>
  1880. </listitem>
  1881. <listitem>
  1882. <para>
  1883. Microsoft <acronym>SQL</acronym> Server não suporta sequências, assim
  1884. <methodname>lastInsertId()</methodname> ignora seus argumentos e
  1885. sempre retorna o último valor gerado para uma
  1886. chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
  1887. retorna <constant>NULL</constant>.
  1888. </para>
  1889. </listitem>
  1890. <listitem>
  1891. <para>
  1892. Se você está trabalhando com strings Unicode em uma codificação diferente
  1893. de <acronym>UCS</acronym>-2 (tal como <acronym>UTF</acronym>-8), você pode
  1894. ter que realizar uma conversão no código de sua aplicação ou armazenar os
  1895. dados em uma coluna binária. Por favor, consulte a <ulink
  1896. url="http://support.microsoft.com/kb/232580">Base de Conhecimento da
  1897. Microsoft</ulink> para mais informações.
  1898. </para>
  1899. </listitem>
  1900. <listitem>
  1901. <para>
  1902. <classname>Zend_Db_Adapter_Pdo_Mssql</classname> configura
  1903. <constant>QUOTED_IDENTIFIER</constant> ON imediatamente depois de
  1904. conectar-se a um banco de dados <acronym>SQL</acronym> Server. Isso
  1905. faz com que o driver utilize o símbolo delimitador de identificador
  1906. da <acronym>SQL</acronym> padrão ( ") em vez dos colchetes que a sintaxe
  1907. <acronym>SQL</acronym> Server utiliza para delimitar identificadores.
  1908. </para>
  1909. </listitem>
  1910. <listitem>
  1911. <para>
  1912. Você pode especificar <property>pdoType</property> como uma chave na
  1913. matriz de opções. O valor pode ser "mssql" (o padrão),
  1914. "dblib", "FreeTDS", ou "Sybase". Essa opção afeta
  1915. o prefixo <acronym>DSN</acronym> que o adaptador usa quando constrói a
  1916. string <acronym>DSN</acronym>. Tanto "FreeTDS" quanto "sybase" implicam
  1917. um prefixo de "sybase:", que é usado para o conjunto de bibliotecas
  1918. <ulink url="http://www.freetds.org/">FreeTDS</ulink>.
  1919. Veja também
  1920. <ulink url="http://www.php.net/manual/en/ref.pdo-dblib.connection.php">
  1921. http://www.php.net/manual/en/ref.pdo-dblib.connection.php </ulink>
  1922. Para obter mais informações sobre os prefixos <acronym>DSN</acronym>
  1923. utilizados neste driver.
  1924. </para>
  1925. </listitem>
  1926. </itemizedlist>
  1927. </sect3>
  1928. <sect3 id="zend.db.adapter.adapter-notes.pdo-mysql">
  1929. <title>PDO MySQL</title>
  1930. <itemizedlist>
  1931. <listitem>
  1932. <para>
  1933. Especifique este adaptador para o método <methodname>factory()</methodname>
  1934. com o nome '<classname>Pdo_Mysql</classname>'.
  1935. </para>
  1936. </listitem>
  1937. <listitem>
  1938. <para>
  1939. Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_mysql.
  1940. </para>
  1941. </listitem>
  1942. <listitem>
  1943. <para>
  1944. O MySQL e o MariaDB não suportam sequencias, assim
  1945. <methodname>lastInsertId()</methodname> ignora seus argumentos e
  1946. sempre retorna o último valor gerado para uma
  1947. chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
  1948. retorna <constant>NULL</constant>.
  1949. </para>
  1950. </listitem>
  1951. </itemizedlist>
  1952. </sect3>
  1953. <sect3 id="zend.db.adapter.adapter-notes.pdo-oci">
  1954. <title>PDO Oracle</title>
  1955. <itemizedlist>
  1956. <listitem>
  1957. <para>
  1958. Especifique este adaptador para o método <methodname>factory()</methodname>
  1959. com o nome '<classname>Pdo_Oci</classname>'.
  1960. </para>
  1961. </listitem>
  1962. <listitem>
  1963. <para>
  1964. Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_oci.
  1965. </para>
  1966. </listitem>
  1967. <listitem>
  1968. <para>
  1969. Oracle não suporta chaves de autoincremento, assim você
  1970. deve especificar o nome de uma sequencia para
  1971. <methodname>lastInsertId()</methodname> ou
  1972. <methodname>lastSequenceId()</methodname>.
  1973. </para>
  1974. </listitem>
  1975. </itemizedlist>
  1976. </sect3>
  1977. <sect3 id="zend.db.adapter.adapter-notes.pdo-pgsql">
  1978. <title>PDO PostgreSQL</title>
  1979. <itemizedlist>
  1980. <listitem>
  1981. <para>
  1982. Especifique este adaptador para o método <methodname>factory()</methodname>
  1983. com o nome '<classname>Pdo_Pgsql</classname>'.
  1984. </para>
  1985. </listitem>
  1986. <listitem>
  1987. <para>
  1988. Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_pgsql.
  1989. </para>
  1990. </listitem>
  1991. <listitem>
  1992. <para>
  1993. PostgreSQL supporta tanto sequencias quanto chaves de
  1994. autoincremento. Portanto os argumentos para
  1995. <methodname>lastInsertId()</methodname> são opcionais. Se você não
  1996. fornecer argumentos, o adaptador retorna o último valor
  1997. gerado para uma chave de autoincremento. Se você fornecer
  1998. argumentos, o adaptador retorna o último valor gerado
  1999. pela sequencia nomeado de acordo com a convenção
  2000. '<emphasis>table</emphasis>_<emphasis>column</emphasis>_seq'.
  2001. </para>
  2002. </listitem>
  2003. </itemizedlist>
  2004. </sect3>
  2005. <sect3 id="zend.db.adapter.adapter-notes.pdo-sqlite">
  2006. <title>PDO SQLite</title>
  2007. <itemizedlist>
  2008. <listitem>
  2009. <para>
  2010. Especifique este adaptador para o método <methodname>factory()</methodname>
  2011. com o nome '<classname>Pdo_Sqlite</classname>'.
  2012. </para>
  2013. </listitem>
  2014. <listitem>
  2015. <para>
  2016. Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_sqlite.
  2017. </para>
  2018. </listitem>
  2019. <listitem>
  2020. <para>
  2021. SQLite não suporta sequencias, assim
  2022. <methodname>lastInsertId()</methodname> ignora seus argumentos e
  2023. sempre retorna o último valor gerado para uma
  2024. chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
  2025. retorna <constant>NULL</constant>.
  2026. </para>
  2027. </listitem>
  2028. <listitem>
  2029. <para>
  2030. Para conectar-se com um banco de dados SQLite2, especifique
  2031. <command>'sqlite2' => true</command> na matriz de
  2032. parâmetros quando criar uma instância do adaptador
  2033. <classname>Pdo_Sqlite</classname>.
  2034. </para>
  2035. </listitem>
  2036. <listitem>
  2037. <para>
  2038. Para conectar-se com um banco de dados SQLite em memória,
  2039. especifique <command>'dbname' => ':memory:'</command> na
  2040. matriz de parâmetros quando criar uma instância do
  2041. adaptador <classname>Pdo_Sqlite</classname>.
  2042. </para>
  2043. </listitem>
  2044. <listitem>
  2045. <para>
  2046. Versões antigas do driver SQLite para <acronym>PHP</acronym> parecem não
  2047. suportar os comandos <acronym>PRAGMA</acronym> necessários para garantir que
  2048. nomes de coluna curtos sejam usados em conjuntos de resultados. Se você
  2049. tem problemas que seus conjuntos de resultados são retornados com
  2050. chaves da forma "tablename.columnname" quando você faz uma
  2051. consulta com junção, então você deve atualizar para a versão
  2052. atual do <acronym>PHP</acronym>.
  2053. </para>
  2054. </listitem>
  2055. </itemizedlist>
  2056. </sect3>
  2057. <sect3 id="zend.db.adapter.adapter-notes.firebird">
  2058. <title>Firebird (Interbase)</title>
  2059. <itemizedlist>
  2060. <listitem>
  2061. <para>
  2062. Este adaptador usa a extensão <acronym>PHP</acronym> php_interbase.
  2063. </para>
  2064. </listitem>
  2065. <listitem>
  2066. <para>
  2067. Firebird (Interbase) não suporta chaves de autoincremento,
  2068. portanto, você deve especificar o nome de uma sequência para
  2069. <methodname>lastInsertId()</methodname> ou
  2070. <methodname>lastSequenceId()</methodname>.
  2071. </para>
  2072. </listitem>
  2073. <listitem>
  2074. <para>
  2075. Atualmente, a opção <constant>Zend_Db::CASE_FOLDING</constant>
  2076. não é suportada pelo adaptador Firebird (Interbase).
  2077. Identificadores não citadas são automaticamente devolvidos em
  2078. maiúsculas.
  2079. </para>
  2080. </listitem>
  2081. <listitem>
  2082. <para>
  2083. O nome do adaptador é <classname>ZendX_Db_Adapter_Firebird</classname>.
  2084. </para>
  2085. <para>
  2086. Lembre-se de usar o parâmetro adapterNamespace com o valor
  2087. <classname>ZendX_Db_Adapter</classname>.
  2088. </para>
  2089. <para>
  2090. Recomendamos a atualização de <filename>gds32.dll</filename> (ou equivalente
  2091. Linux) empacotado junto com <acronym>PHP</acronym>, para a mesma versão do
  2092. servidor. Para Firebird o equivalente de <filename>gds32.dll</filename> é
  2093. <filename>fbclient.dll</filename>.
  2094. </para>
  2095. <para>
  2096. Por padrão todos os identificadores (nomes de tabela, campos) são
  2097. devolvidos em caixa
  2098. alta.
  2099. </para>
  2100. </listitem>
  2101. </itemizedlist>
  2102. </sect3>
  2103. </sect2>
  2104. </sect1>
  2105. <!--
  2106. vim:se ts=4 sw=4 et:
  2107. -->