Zend_Db_Adapter.xml 107 KB

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