| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.db.adapter">
- <title>Zend_Db_Adapter</title>
- <para>
- <classname>Zend_Db</classname> e suas classes relacionadas provêem uma interface de banco
- de dados <acronym>SQL</acronym> simples para Zend Framework.
- <classname>Zend_Db_Adapter</classname> é a classe básica que você usa para conectar sua
- aplicação <acronym>PHP</acronym>a um <acronym>SGBDR</acronym>. Há uma classe adaptadora
- diferente para cada marca de <acronym>SGBDR</acronym>.
- </para>
- <para>
- Os adaptadores <classname>Zend_Db</classname> criam uma ponte entre extensões
- <acronym>PHP</acronym> específicas de cada fabricante para uma interface comum que ajuda
- você a escrever aplicações <acronym>PHP</acronym> uma vez e distribui-las com múltiplas
- marcas de <acronym>SGBDR</acronym> com muito pouco esforço.
- </para>
- <para>
- A interface da classe adaptadora é similar à interface da extensão
- <ulink url="http://www.php.net/pdo">PHP Data Objects</ulink>.
- <classname>Zend_Db</classname> provê classes adaptadoras para drivers
- <acronym>PDO</acronym> das seguintes marcas de <acronym>SGBDR</acronym>:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <acronym>IBM</acronym> <acronym>DB2</acronym> e Informix Dynamic Server
- (<acronym>IDS</acronym>), usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-ibm">pdo_ibm</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- MariaDB, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-mysql">pdo_mysql</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- MySQL, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-mysql">pdo_mysql</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- Microsoft <acronym>SQL</acronym> Server, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-dblib">pdo_dblib</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- Oracle, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-oci">pdo_oci</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- PostgreSQL, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-pgsql">pdo_pgsql</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- SQLite, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/pdo-sqlite">pdo_sqlite</ulink>
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Além disso, <classname>Zend_Db</classname> provê classes adaptadoras que utilizam extensões
- de bancos de dados
- <acronym>PHP</acronym> para as seguintes marcas de <acronym>SGBDR</acronym>:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- MariaDB, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/mysqli">mysqli</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- MySQL, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/mysqli">mysqli</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- Oracle, usando a extensão <acronym>PHP</acronym>
- <ulink url="http://www.php.net/oci8">oci8</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- <acronym>IBM</acronym> <acronym>DB2</acronym> e <acronym>DB2</acronym> I5, usando a
- extensão <acronym>PHP</acronym> <ulink
- url="http://www.php.net/ibm_db2">ibm_db2</ulink>
- </para>
- </listitem>
- <listitem>
- <para>
- Firebird (Interbase), usando a extensão <acronym>PHP</acronym> <ulink
- url="http://www.php.net/ibase">php_interbase</ulink>
- </para>
- </listitem>
- </itemizedlist>
- <note>
- <para>
- Cada classe adaptadora <classname>Zend_Db</classname> usa uma extensão
- <acronym>PHP</acronym>. Você deve ter a respectiva extensão <acronym>PHP</acronym>
- habilitada em seu ambiente <acronym>PHP</acronym> para usar uma classe adaptadora
- <classname>Zend_Db</classname>. Por exemplo, se você usa qualquer uma das classes
- adaptadoras <acronym>PDO</acronym> do <classname>Zend_Db</classname>
- , você precisa habilitar tanto a extensão <acronym>PDO</acronym> quanto o driver
- <acronym>PDO</acronym> para a marca de <acronym>SGBDR</acronym> que você usa.
- </para>
- </note>
- <sect2 id="zend.db.adapter.connecting">
- <title>Conectando-se a um Banco de Dados Usando uma Adaptadora</title>
- <para>
- Esta seção descreve como criar uma instância de uma classe adaptadora de banco de
- dados. Isso corresponde a fazer uma conexão com seu servidor <acronym>SGBDR</acronym> a
- partir de sua aplicação <acronym>PHP</acronym>.
- </para>
- <sect3 id="zend.db.adapter.connecting.constructor">
- <title>Usando um Construtor de Adaptadora Zend_Db</title>
- <para>
- Você pode criar uma instância de uma classe adaptadora usando seu construtor.
- Um construtor de classe adaptadora leva um argumento, que é um matriz
- de parâmetros usado para declarar a conexão.
- </para>
- <example id="zend.db.adapter.connecting.constructor.example">
- <title>Usando um Construtor de Adaptadora</title>
- <programlisting language="php"><![CDATA[
- $db = new Zend_Db_Adapter_Pdo_Mysql(array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test'
- ));
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.connecting.factory">
- <title>Usando a Fábrica Zend_Db</title>
- <para>
- Como uma alternativa ao uso direto do construtor da classe adaptadora, você
- pode criar uma instância de uma adaptadora usando o método estático
- <methodname>Zend_Db::factory()</methodname>. Este método carrega dinamicamente
- o arquivo da classe adaptadora sob demanda usando o método
- <link linkend="zend.loader.load.class">Zend_Loader::loadClass()</link>.
- </para>
- <para>
- O primeiro argumento é um string que identifica o nome base da
- classe adaptadora. Por exemplo, a string '<classname>Pdo_Mysql</classname>'
- corresponde à classe <classname>Zend_Db_Adapter_Pdo_Mysql</classname>. O segundo
- argumento é a mesma matriz de parâmetros que você teria passado para
- o construtor da adaptadora.
- </para>
- <example id="zend.db.adapter.connecting.factory.example">
- <title>Using the Adapter Factory Method</title>
- <programlisting language="php"><![CDATA[
- // Nós não precisamos seguir a declaração a seguir porque o
- // arquivo Zend_Db_Adapter_Pdo_Mysql será carregado para nós pelo método Zend_Db
- // factory.
- // require_once 'Zend/Db/Adapter/Pdo/Mysql.php';
- // Carrega automaticamente a classe Zend_Db_Adapter_Pdo_Mysql
- // e cria uma instância dela.
- $db = Zend_Db::factory('Pdo_Mysql', array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test'
- ));
- ]]></programlisting>
- </example>
- <para>
- Se você criar sua própria classe que estende
- <classname>Zend_Db_Adapter_Abstract</classname>, mas não nomear sua
- classe com o prefixo de pacote "<classname>Zend_Db_Adapter</classname>", você pode
- usar o método <methodname>factory()</methodname> para carregar sua adaptadora se
- você especificar a parte principal da classe adaptadora com a
- chave 'adapterNamespace' na matriz de parâmetros.
- </para>
- <example id="zend.db.adapter.connecting.factory.example2">
- <title>
- Usando o Método de Fábrica da Adaptadora para uma Classe Adaptadora Personalizada
- </title>
- <programlisting language="php"><![CDATA[
- // Nós não precisamos carregar o arquivo da classe adaptadora
- // porque ele será carregado para nós pelo método de fábrica do Zend_Db.
- // Carrega automaticamente a classe MyProject_Db_Adapter_Pdo_Mysql e cria
- // uma instância dela.
- $db = Zend_Db::factory('Pdo_Mysql', array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test',
- 'adapterNamespace' => 'MyProject_Db_Adapter'
- ));
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.connecting.factory-config">
- <title>Usando Zend_Config com Zend_Db Factory</title>
- <para>
- Opcionalmente, você pode especificar cada argumento do
- método <methodname>factory()</methodname> como um objeto do tipo
- <link linkend="zend.config">Zend_Config</link>.
- </para>
- <para>
- Se o primeiro argumento é um objeto de configuração, espera-se que
- ele contenha uma propriedade chamada <property>adapter</property>, contendo uma
- string que designa a base do nome da classe adaptadora. Opcionalmente, o objeto
- pode conter uma propriedade chamada <property>params</property>, com
- subpropriedades correspondentes aos nomes de parâmetro da adaptadora.
- Isso é usado somente se o segundo argumento do
- método <methodname>factory()</methodname> for omitido.
- </para>
- <example id="zend.db.adapter.connecting.factory.example1">
- <title>Usando o Método de Fábrica da Adaptadora com um Objeto Zend_Config</title>
- <para>
- No exemplo abaixo, um objeto <classname>Zend_Config</classname> é criado
- a partir de um matriz. Você pode também carregar dados a partir de um arquivo
- externo usando classes tais como
- <link linkend="zend.config.adapters.ini">Zend_Config_Ini</link>
- e <link linkend="zend.config.adapters.xml">Zend_Config_Xml</link>.
- </para>
- <programlisting language="php"><![CDATA[
- $config = new Zend_Config(
- array(
- 'database' => array(
- 'adapter' => 'Mysqli',
- 'params' => array(
- 'host' => '127.0.0.1',
- 'dbname' => 'test',
- 'username' => 'webuser',
- 'password' => 'secret',
- )
- )
- )
- );
- $db = Zend_Db::factory($config->database);
- ]]></programlisting>
- </example>
- <para>
- O segundo argumento do método <methodname>factory()</methodname> pode ser
- um matriz associativo contendo entradas correspondentes aos
- parâmetros da adaptadora. Esse argumento é opcional. Se o primeiro
- argumento é do tipo <classname>Zend_Config</classname>, é assumido que ele contém
- todos os parâmetros, e o segundo argumento é ignorado
- </para>
- </sect3>
- <sect3 id="zend.db.adapter.connecting.parameters">
- <title>Parâmetros da Adaptadora</title>
- <para>
- A seguinte lista explica parâmetros comuns reconhecidos pelas
- classes adaptadoras <classname>Zend_Db</classname>.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>host</emphasis>:
- uma string contendo um hostname ou endereço IP do
- servidor de banco de dados. Se o banco de dados está rodando no
- mesmo servidor anfitrião da aplicação <acronym>PHP</acronym>, você pode
- usar 'localhost' ou '127.0.0.1'.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>username</emphasis>:
- identificador da conta para autenticar uma conexão com o
- servidor <acronym>SGBDR</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>password</emphasis>:
- credencial de senha para autenticar uma
- conexão com o servidor <acronym>SGBDR</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>dbname</emphasis>:
- nome da instância do banco de dados no servidor <acronym>SGBDR</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>port</emphasis>:
- alguns servidores <acronym>SGBDR</acronym> podem aceitar conexões de rede
- em um número de porta especificado pelo administrador. O parâmetro port
- permite que você especifique a porta a qual sua
- aplicação <acronym>PHP</acronym> se conecta, para casar com a porta
- configurada no servidor <acronym>SGBDR</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>charset</emphasis>:
- especifica o conjunto de caracteres usado para a conexão.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>options</emphasis>:
- este parâmetro é um matriz associativo de opções
- que são genéricas para todas as classes
- <classname>Zend_Db_Adapter</classname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>driver_options</emphasis>:
- este parâmetro é um matriz associativo de opções
- adicionais que são específicas para uma dada extensão
- de banco de dados. Um uso típico deste parâmetro é para
- configurar atributos de um driver <acronym>PDO</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>adapterNamespace</emphasis>:
- nomeia a parte inicial do nome da classe para a
- adaptadora, em vez de '<classname>Zend_Db_Adapter</classname>'. Use isto se
- você precisar do método <methodname>factory()</methodname> para
- carregar uma classe adaptadora de banco de dados não-Zend.
- </para>
- </listitem>
- </itemizedlist>
- <example id="zend.db.adapter.connecting.parameters.example1">
- <title>Passando a Opção Case-Folding para a Fábrica</title>
- <para>
- Você pode especificar essa opção pela constante
- <constant>Zend_Db::CASE_FOLDING</constant>. Ela corresponde ao atributo
- <constant>ATTR_CASE</constant> nos drivers de banco de dados
- <acronym>PDO</acronym> e <acronym>IBM</acronym> <acronym>DB2</acronym>,
- ajustando a caixa das chaves de string nos conjuntos de resultado de consulta.
- A opção leva os valores <constant>Zend_Db::CASE_NATURAL</constant> (padrão),
- <constant>Zend_Db::CASE_UPPER</constant>, e
- <constant>Zend_Db::CASE_LOWER</constant>.
- </para>
- <programlisting language="php"><![CDATA[
- $options = array(
- Zend_Db::CASE_FOLDING => Zend_Db::CASE_UPPER
- );
- $params = array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test',
- 'options' => $options
- );
- $db = Zend_Db::factory('Db2', $params);
- ]]></programlisting>
- </example>
- <example id="zend.db.adapter.connecting.parameters.example2">
- <title>Passando a Opção Auto-Quoting para a Fábrica</title>
- <para>
- Você pode especificar essa opção pela constante
- <constant>Zend_Db::AUTO_QUOTE_IDENTIFIERS</constant>. Se o valor
- é <constant>TRUE</constant> (padrão), identificadores como nomes de
- tabela, nomes de coluna, e mesmo apelidos são delimitados em toda
- sintaxe <acronym>SQL</acronym> gerada pelo objeto adaptador. Isso torna simples
- usar identificadores que contêm palavras-chave <acronym>SQL</acronym>, ou
- caracteres especiais. Se o valor é <constant>FALSE</constant>,
- identificadores não são delimitados automaticamente. Se você precisa
- delimitar identificadores, você deve fazer por conta própria usando
- o método <methodname>quoteIdentifier()</methodname>.
- </para>
- <programlisting language="php"><![CDATA[
- $options = array(
- Zend_Db::AUTO_QUOTE_IDENTIFIERS => false
- );
- $params = array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test',
- 'options' => $options
- );
- $db = Zend_Db::factory('Pdo_Mysql', $params);
- ]]></programlisting>
- </example>
- <example id="zend.db.adapter.connecting.parameters.example3">
- <title>Passando Opções de Driver PDO para a Fábrica</title>
- <programlisting language="php"><![CDATA[
- $pdoParams = array(
- PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
- );
- $params = array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test',
- 'driver_options' => $pdoParams
- );
- $db = Zend_Db::factory('Pdo_Mysql', $params);
- echo $db->getConnection()
- ->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
- ]]></programlisting>
- </example>
- <example id="zend.db.adapter.connecting.parameters.example4">
- <title>Passando Opções de Serialização para a Fábrica</title>
- <programlisting language="php"><![CDATA[
- $options = array(
- Zend_Db::ALLOW_SERIALIZATION => false
- );
- $params = array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test',
- 'options' => $options
- );
- $db = Zend_Db::factory('Pdo_Mysql', $params);
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.connecting.getconnection">
- <title>Gerenciando Conexões Preguiçosas</title>
- <para>
- Criar uma instância de uma classe adaptadora não abre uma conexão
- com o servidor <acronym>SGBDR</acronym> imediatamente. A adaptadora guarda os
- parâmetros de conexão, e a estabelece por demanda, na primeira
- vez que você precisar executar uma consulta. Isso garante que
- criar um objeto adaptador é rápido é barato. Você pode
- criar uma instância de uma adaptadora mesmo se não estiver certo
- que precisa rodar quaisquer consultas de banco de dados durante a requisição
- atual que sua aplicação está servindo.
- </para>
- <para>
- Se você precisa forçar a adaptador a se conectar ao <acronym>SGBDR</acronym>, use
- o método <methodname>getConnection()</methodname>. Esse método retorna
- um objeto para a conexão como representado pela respectiva
- extensão de banco de dados <acronym>PHP</acronym>. Por exemplo, se você usar
- qualquer uma das classes adaptadoras para drivers <acronym>PDO</acronym>, então
- <methodname>getConnection()</methodname> retorna o objeto <acronym>PDO</acronym>,
- depois de iniciá-lo como uma conexão ativa para o banco de dados especificado.
- </para>
- <para>
- Pode ser útil forçar a conexão se você quer capturar
- quaisquer exceções que ela lançar como resultado de credenciais de conta
- inválidas, ou outra falha ao conectar-se ao servidor <acronym>SGBDR</acronym>.
- Essas exceções não são lançadas até que a conexão seja feita,
- assim isso pode ajudar a simplificar o código de sua aplicação se você manipular as
- exceções em um lugar, em vez de fazê-lo
- na primeira consulta ao banco de dados.
- </para>
- <para>
- Adicionalmente, uma adaptadora pode ser serializada para armazená-la, por exemplo,
- em uma variável de sessão. Isso pode ser muito útil não somente para a
- própria adaptadora, mas para outros objetos que a agreguem, como um
- objeto <classname>Zend_Db_Select</classname>. Por padrão, adaptadoras têm permissão
- de serem serializadas, se você não quiser isso, deve considerar passar a
- opção <constant>Zend_Db::ALLOW_SERIALIZATION</constant> com
- <constant>FALSE</constant>, veja o exemplo abaixo. Em respeito ao princípio de
- conexões preguiçosas, a adaptadora não reconectará a si própria depois de ser
- revertida sua serialização. Você deve então chamar
- <methodname>getConnection()</methodname> por conta própria. Você pode fazer a
- adaptadora se autorreconectar pela passagem de
- <constant>Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE</constant> com
- <constant>TRUE</constant> como uma opção da adaptadora.
- </para>
- <example id="zend.db.adapter.connecting.getconnection.example">
- <title>Manipulando Exceções de Conexão</title>
- <programlisting language="php"><![CDATA[
- try {
- $db = Zend_Db::factory('Pdo_Mysql', $parameters);
- $db->getConnection();
- } catch (Zend_Db_Adapter_Exception $e) {
- // talvez uma credencial de login falhou, ou talvez o SGBDR não está rodando
- } catch (Zend_Exception $e) {
- // talvez factory() falhou em carregar a classe adaptadora especificada
- }
- ]]></programlisting>
- </example>
- </sect3>
- </sect2>
- <sect2 id="zend.db.adapter.example-database">
- <title>Banco de Dados de Exemplo</title>
- <para>
- Na documentação para classes <classname>Zend_Db</classname>, nós usamos um conjunto de
- tabelas simples para ilustrar o uso de classes e métodos. Estas
- tabelas de exemplo podem armazenar informações sobre rastreamento de bugs em um
- projeto de desenvolvimento de software. O banco de dados contém quatro tabelas:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>accounts</emphasis> armazena
- informação sobre cada usuário do banco de dados de rastreamento de bugs.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>products</emphasis> armazena
- informação sobre cada produto para o qual um bug pode ser
- registrado.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>bugs</emphasis> armazena informação
- sobre bugs, incluindo o estado atual do bug, a
- pessoa que o reportou, a pessoa que se encarregou de
- corrigí-lo e a pessoa que se encarregou de verificar a
- correção.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>bugs_products</emphasis> armazena um
- relacionamento entre bugs e produtos. Ela implementa um
- relacionamento muitos-para-muitos, porque para um dado bug pode ter
- relevância para múltiplos produtos, e, obviamente, um dado
- produto pode ter múltiplos bugs.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- O seguinte pseudocódigo de linguagem de definição de dados <acronym>SQL</acronym>
- descreve as tabelas neste banco de dados de exemplo. Estas tabelas de exemplo são
- extensivamente usadas pelos testes unitários automatizados de
- <classname>Zend_Db</classname>.
- </para>
- <programlisting language="sql"><![CDATA[
- CREATE TABLE accounts (
- account_name VARCHAR(100) NOT NULL PRIMARY KEY
- );
- CREATE TABLE products (
- product_id INTEGER NOT NULL PRIMARY KEY,
- product_name VARCHAR(100)
- );
- CREATE TABLE bugs (
- bug_id INTEGER NOT NULL PRIMARY KEY,
- bug_description VARCHAR(100),
- bug_status VARCHAR(20),
- reported_by VARCHAR(100) REFERENCES accounts(account_name),
- assigned_to VARCHAR(100) REFERENCES accounts(account_name),
- verified_by VARCHAR(100) REFERENCES accounts(account_name)
- );
- CREATE TABLE bugs_products (
- bug_id INTEGER NOT NULL REFERENCES bugs,
- product_id INTEGER NOT NULL REFERENCES products,
- PRIMARY KEY (bug_id, product_id)
- );
- ]]></programlisting>
- <para>
- Note também que a tabela 'bugs' contém múltiplas referências de chave estrangeira para a
- tabela 'accounts'. Cada uma das chaves estrangeiras pode referenciar uma linha diferente
- na tabela 'accounts' para um dado bug.
- </para>
- <para>
- O diagrama abaixo ilustra o modelo físico de dados do banco de dados de exemplo.
- </para>
- <para>
- <inlinegraphic width="387" scale="100" align="center" valign="middle"
- fileref="figures/zend.db.adapter.example-database.png" format="PNG" />
- </para>
- </sect2>
- <sect2 id="zend.db.adapter.select">
- <title>Lendo Resultados de Consulta</title>
- <para>
- Esta seção descreve métodos da classe adaptadora com os quais você
- pode rodar consultas <acronym>SELECT</acronym> e recuperar seus resultados.
- </para>
- <sect3 id="zend.db.adapter.select.fetchall">
- <title>Buscando um Conjunto Completo de Resultados</title>
- <para>
- Você pode rodar uma consulta <acronym>SQL</acronym> <acronym>SELECT</acronym> e
- recuperar seus resultados em um passo usando o método
- <methodname>fetchAll()</methodname>.
- </para>
- <para>
- O primeiro argumento para este método é uma string contendo uma
- declaração <acronym>SELECT</acronym>. Como alternativa, o primeiro argumento pode
- ser um objeto da classe <link linkend="zend.db.select">Zend_Db_Select</link>.
- A classe adaptadora converte automaticamente esse objeto em uma representação de
- string da declaração <acronym>SELECT</acronym>.
- </para>
- <para>
- O segundo argumento para <methodname>fetchAll()</methodname> é um matriz de
- valores para substituir por curingas de parâmetro na declaração
- <acronym>SQL</acronym>.
- </para>
- <example id="zend.db.adapter.select.fetchall.example">
- <title>Usando fetchAll()</title>
- <programlisting language="php"><![CDATA[
- $sql = 'SELECT * FROM bugs WHERE bug_id = ?';
- $result = $db->fetchAll($sql, 2);
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.select.fetch-mode">
- <title>Alterando o Modo de Busca</title>
- <para>
- Por padrão, <methodname>fetchAll()</methodname> retorna um matriz de
- linhas, cada uma das quais é um matriz associativo. As chaves do
- matriz associativo são as colunas ou apelidos de coluna dados
- na consulta de seleção.
- </para>
- <para>
- Você pode especificar um estilo diferente de resultados de busca usando o
- método <methodname>setFetchMode()</methodname>. Os modos suportados são
- identificados por constantes:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis><constant>Zend_Db::FETCH_ASSOC</constant></emphasis>:
- retorna dados em um matriz de matrizs associativos.
- As chaves de matriz são nomes de coluna, como strings. Este é o modo padrão
- de busca para classes <classname>Zend_Db_Adapter</classname>.
- </para>
- <para>
- Note que se sua lista de seleção contém mais de uma
- coluna com o mesmo nome, por exemplo se elas são de
- duas tabelas diferentes em um <acronym>JOIN</acronym>, pode haver somente
- uma entrada na matriz associativa para o nome dado.
- Se você usa o modo <constant>FETCH_ASSOC</constant>, deve especificar
- apelidos de coluna em sua consulta <acronym>SELECT</acronym> para garantir
- que os nomes resultem em chaves de matriz únicas.
- </para>
- <para>
- Por padrão, essas strings são devolvidas como foram
- devolvidas pelo driver de banco de dados. Isso é tipicamente
- a leitura da coluna no servidor <acronym>SGBDR</acronym>. Você pode
- especificar a caixa para essas strings, usando a
- opção <constant>Zend_Db::CASE_FOLDING</constant>.
- Especifique isso quando instanciar a adaptadora.
- Veja <link linkend="zend.db.adapter.connecting.parameters.example1">este
- exemplo</link>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><constant>Zend_Db::FETCH_NUM</constant></emphasis>:
- retorna dados em um matriz de matrizs. Os matrizs são
- indexados por inteiros, correspondendo à posição do
- respectivo campo na lista de seleção da consulta.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><constant>Zend_Db::FETCH_BOTH</constant></emphasis>:
- retorna dados em um matriz de matrizs. As chaves de matriz são
- tanto strings como as usadas no modo <constant>FETCH_ASSOC</constant>, como
- inteiros como os usados no modo <constant>FETCH_NUM</constant>. Note que o
- número de elementos na matriz é o dobro do que seria se você usasse
- <constant>FETCH_ASSOC</constant> ou <constant>FETCH_NUM</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><constant>Zend_Db::FETCH_COLUMN</constant></emphasis>:
- retorna dados em um matriz de valores. O valor em cada matriz
- é o valor retornado pela coluna do conjunto de resultados.
- Por padrão, essa é a primeira coluna, indexada por 0.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis><constant>Zend_Db::FETCH_OBJ</constant></emphasis>:
- retorna dados em um matriz de objetos. A classe padrão
- é a classe interna <acronym>PHP</acronym> stdClass. Colunas do conjunto de
- resultados estão disponíveis como propriedades públicas do
- objeto.
- </para>
- </listitem>
- </itemizedlist>
- <example id="zend.db.adapter.select.fetch-mode.example">
- <title>Usando setFetchMode()</title>
- <programlisting language="php"><![CDATA[
- $db->setFetchMode(Zend_Db::FETCH_OBJ);
- $result = $db->fetchAll('SELECT * FROM bugs WHERE bug_id = ?', 2);
- // $result é um matriz de objetos
- echo $result[0]->bug_description;
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.select.fetchassoc">
- <title>Buscando um Conjunto de Resultados como um matriz Associativo</title>
- <para>
- O método <methodname>fetchAssoc()</methodname> retorna dados em uma matriz
- de matrizes associativas, independente de qual valor você tenha configurado
- para o modo de busca, utilizando a primeira coluna como índice da matriz.
- </para>
- <example id="zend.db.adapter.select.fetchassoc.example">
- <title>Usando fetchAssoc()</title>
- <programlisting language="php"><![CDATA[
- $db->setFetchMode(Zend_Db::FETCH_OBJ);
- $result = $db->fetchAssoc(
- 'SELECT bug_id, bug_description, bug_status FROM bugs'
- );
- // $result é uma matriz de matrizes associativas, conforme o modo de busca
- echo $result[2]['bug_description']; // Descrição do Bug #2
- echo $result[1]['bug_description']; // Descrição do Bug #1
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.select.fetchcol">
- <title>Buscando uma Única Coluna a partir de um Conjunto de Resultados</title>
- <para>
- O método <methodname>fetchCol()</methodname> retorna dados em um matriz
- de valores, independente do valor que você tenha configurado para o modo de busca
- Ele devolve somente a primeira coluna devolvida pela consulta.
- Quaisquer outras colunas devolvidas pela consulta são descartadas.
- Se você precisar devolver uma outra coluna que não seja a primeira, veja
- <link linkend="zend.db.statement.fetching.fetchcolumn">esta seção</link>.
- </para>
- <example id="zend.db.adapter.select.fetchcol.example">
- <title>Usando fetchCol()</title>
- <programlisting language="php"><![CDATA[
- $db->setFetchMode(Zend_Db::FETCH_OBJ);
- $result = $db->fetchCol(
- 'SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2);
- // contém bug_description; bug_id não é devolvida
- echo $result[0];
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.select.fetchpairs">
- <title>Buscando Pares Chave-Valor a partir de um Conjunto de Resultados</title>
- <para>
- O método <methodname>fetchPairs()</methodname> retorna dados em um matriz
- de pares chave-valor, como um matriz associativo com uma entrada única
- por linha. A chave desse matriz associativo é tomada da
- primeira coluna devolvida pela consulta <acronym>SELECT</acronym>. O valor é tomado
- da segunda coluna devolvida pela consulta <acronym>SELECT</acronym>. Quaisquer
- outras colunas devolvidas pela consulta são descartadas.
- </para>
- <para>
- Você deve projetar a conuslta <acronym>SELECT</acronym> de modo que a primeira
- coluna devolvida tenha valores únicos. Se há valores duplicados na
- primeira coluna, entradas na matriz associativo serão
- sobrescritas.
- </para>
- <example id="zend.db.adapter.select.fetchpairs.example">
- <title>Usando fetchPairs()</title>
- <programlisting language="php"><![CDATA[
- $db->setFetchMode(Zend_Db::FETCH_OBJ);
- $result = $db->fetchPairs('SELECT bug_id, bug_status FROM bugs');
- echo $result[2];
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.select.fetchrow">
- <title>Buscando uma Linha Única a partir de um Conjunto de Resultados</title>
- <para>
- O método <methodname>fetchRow()</methodname> retorna dados usando o
- modo de busca atual, mas retorna somente a primeira linha
- buscada a partir do conjunto de resultados.
- </para>
- <example id="zend.db.adapter.select.fetchrow.example">
- <title>Using fetchRow()</title>
- <programlisting language="php"><![CDATA[
- $db->setFetchMode(Zend_Db::FETCH_OBJ);
- $result = $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2');
- // note que $result é um único objeto, não um matriz de objetos
- echo $result->bug_description;
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.select.fetchone">
- <title>Buscando um Escalar Único a partir de um Conjunto de Resultados</title>
- <para>
- O método <methodname>fetchOne()</methodname> é como uma combinação
- do método <methodname>fetchRow()</methodname> com o método
- <methodname>fetchCol()</methodname>, no que ele retorna dados somente
- para a primeira linha buscada a partir do conjunto de resultados, e retorna
- somente o valor da primeira coluna naquela linha. Portanto ele retorna somente
- um único valor escalar, nem um matriz nem um objeto.
- </para>
- <example id="zend.db.adapter.select.fetchone.example">
- <title>Usando fetchOne()</title>
- <programlisting language="php"><![CDATA[
- $result = $db->fetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2');
- // este é um valor string único
- echo $result;
- ]]></programlisting>
- </example>
- </sect3>
- </sect2>
- <sect2 id="zend.db.adapter.write">
- <title>Gravando Mudanças no Banco de Dados</title>
- <para>
- Você pode usar a classe adaptadora para gravar novos dados ou alterar
- dados existentes em seu banco de dados. Esta seção descreve métodos para fazer essas
- operações.
- </para>
- <sect3 id="zend.db.adapter.write.insert">
- <title>Incluindo Dados</title>
- <para>
- Você pode adicionar novas linhas em uma tabela de seu banco de dados usando
- o método <methodname>insert()</methodname>. O primeiro argumento é uma string
- que denomina a tabela, e o segundo argumento é um matriz
- associativo, mapeando nomes de coluna para valores de dados.
- </para>
- <example id="zend.db.adapter.write.insert.example">
- <title>Incluindo em uma Tabela</title>
- <programlisting language="php"><![CDATA[
- $data = array(
- 'created_on' => '2007-03-22',
- 'bug_description' => 'Something wrong',
- 'bug_status' => 'NEW'
- );
- $db->insert('bugs', $data);
- ]]></programlisting>
- </example>
- <para>
- Colunas que você excluir da matriz de dados não serão especificadas para
- o banco de dados. Portanto, elas seguem as mesmas regras que uma
- declaração <acronym>SQL</acronym> <acronym>INSERT</acronym> segue: se a coluna
- tem uma cláusula <acronym>DEFAULT</acronym>, a coluna leva o valor na linha
- criada, caso contrário é deixado em um estado <constant>NULL</constant>.
- </para>
- <para>
- Por padrão, os valores em seu matriz de dados são incluídos usando
- parâmetros. ISso reduz o risco de alguns tipos de problemas de
- segurança. Você não precisa aplicar escaping ou quoting para valores
- na matriz de dados.
- </para>
- <para>
- Você pode precisar que valores na matriz de dados sejam tratados como expressões
- <acronym>SQL</acronym>, caso no qual elas não devam sofrer quoting. Por
- padrão, todos os valores de dados passados como strings são tratados como
- literais string. Para especificar que o valor é uma expressão
- <acronym>SQL</acronym> e portanto não deve sofrer quoting, passe o valor
- na matriz de dados como um objeto do tipo <classname>Zend_Db_Expr</classname>
- em vez de texto claro.
- </para>
- <example id="zend.db.adapter.write.insert.example2">
- <title>Incluindo Expressões em uma Tabela</title>
- <programlisting language="php"><![CDATA[
- $data = array(
- 'created_on' => new Zend_Db_Expr('CURDATE()'),
- 'bug_description' => 'Something wrong',
- 'bug_status' => 'NEW'
- );
- $db->insert('bugs', $data);
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.write.lastinsertid">
- <title>Recuperando um Valor Gerado</title>
- <para>
- Algumas marcas de <acronym>SGBDR</acronym> suportam autoincremento de chaves
- primárias. Uma tabela definida desse modo gera um valor de chave primária
- automaticamente durante um <acronym>INSERT</acronym> de uma nova linha. O valor de
- retorno do método <methodname>insert()</methodname> <emphasis>não</emphasis> é
- o último ID incluído, porque a tabela pode não ter uma
- coluna de autoincremento. Em vez disso, o valor de retorno é o
- número de linhas afetadas (geralmente 1).
- </para>
- <para>
- Se sua tabela é definida com uma chave primária de autoincremento
- você pode chamar o método <methodname>lastInsertId()</methodname> depois da
- inclusão. Esse método retonra o último valor gerado no
- escopo da conexão atual com o banco de dados.
- </para>
- <example id="zend.db.adapter.write.lastinsertid.example-1">
- <title>Usando lastInsertId() para uma Chave de Autoincremento</title>
- <programlisting language="php"><![CDATA[
- $db->insert('bugs', $data);
- // retorna o último valor gerado por uma coluna de autoincremento
- $id = $db->lastInsertId();
- ]]></programlisting>
- </example>
- <para>
- Algumas marcas de <acronym>SGBDR</acronym> suportam um objeto de sequencia, que
- gera valores únicos para servir como valores da chave primária. Para suportar
- sequencias, o método <methodname>lastInsertId()</methodname> aceita dois
- argumentos string opcionais. Esses argumentos denominam a tabela e
- a coluna, assumindo que você tenha seguido a convenção de que uma
- sequencias é denominada usando os nomes de tabela e coluna para os quais
- a sequencia gera valores, e um sufixo "_seq". Isso é
- baseado na convenção usada pelo PostgreSQL quando nomeia
- sequencias para colunas <constant>SERIAL</constant>. Por exemplo, uma tabela "bugs"
- com a coluna de chave primária "bug_id" usaria uma sequencia denominada
- "bugs_bug_id_seq".
- </para>
- <example id="zend.db.adapter.write.lastinsertid.example-2">
- <title>Usando lastInsertId() para uma Sequencia</title>
- <programlisting language="php"><![CDATA[
- $db->insert('bugs', $data);
- // retorna o último valor gerado pela sequencia 'bugs_bug_id_seq'.
- $id = $db->lastInsertId('bugs', 'bug_id');
- // alternativamente, retorna o último valor gerado pela sequencia 'bugs_seq'.
- $id = $db->lastInsertId('bugs');
- ]]></programlisting>
- </example>
- <para>
- Se o nome de seu objeto de sequencia não seguir essa convenção
- de nomes, use o método <methodname>lastSequenceId()</methodname>
- em seu lugar. Esse método leva um único argumento string, nomeando
- literalmente a sequencia.
- </para>
- <example id="zend.db.adapter.write.lastinsertid.example-3">
- <title>Usando lastSequenceId()</title>
- <programlisting language="php"><![CDATA[
- $db->insert('bugs', $data);
- // retorna o último valor gerado pela sequencia 'bugs_id_gen'.
- $id = $db->lastSequenceId('bugs_id_gen');
- ]]></programlisting>
- </example>
- <para>
- Para as marcas de <acronym>SGBDR</acronym> que não suportam sequencias, incluindo
- MariaDB, MySQL, Microsoft <acronym>SQL</acronym> Server, e SQLite, os argumentos
- para o método <methodname>lastInsertId()</methodname> são ignorados, e o valor
- devolvido é o valor mais recente gerado para qualquer tabela por operações
- <acronym>INSERT</acronym> durante a conexão atual. Para essas marcas de
- <acronym>SGBDR</acronym>, o método <methodname>lastSequenceId()</methodname> sempre
- devolve <constant>NULL</constant>.
- </para>
- <note>
- <title>Porque Não Usar "SELECT MAX(id) FROM table"?</title>
- <para>
- Algumas essa consulta retorna valor de chave primária mais recente
- incluído em uma tabela. Entretanto, essa técnica
- não é segura para ser usada em um ambiente onde múltiplos clientes estão
- incluindo registros no banco de dados. É possível, e
- portanto pode acontecer eventualmente, que outro
- cliente inclua outra linha no instante entre a
- inclusão executada por sua aplicação cliente e sua consulta
- para o valor de <methodname>MAX(id)</methodname>. Assim o valor devolvido
- não identifica a linha que você incluiu, mas sim a linha
- incluída por algum outro cliente. Não há um modo de saber
- quando isso aconteceu.
- </para>
- <para>
- Usar um modo de isolamento de transação forte tal como
- "repeatable read" pode mitigar esse risco, mas algumas marcas de
- <acronym>SGBDR</acronym> não suportam o isolamento de transação necessário para
- isso, ou sua aplicação pode usar um modo de isolamento
- de transação baixo por projeto.
- </para>
- <para>
- Além disso, usar uma expressão como "<command>MAX(id)+1</command>" para gerar
- um novo valor para uma chave primária não é seguro, porque dois clientes
- poderiam fazer esta consulta simultanamente, e em seguida, ambos usariam
- o mesmo valor calculado para sua próxima operação <acronym>INSERT</acronym>.
- </para>
- <para>
- Todas as marcas de <acronym>SGBDR</acronym> fornecem mecanismos para gerar
- valores únicos e retornar o último valor gerado. Esses
- mecanismos necessariamente trabalham fora do escopo de
- isolamento da transação, portanto, não há chance de dois clientes
- gerarem o mesmo valor, e não há chance de que o
- valor gerado por um outro cliente possa ser informado à sua
- conexão de cliente como o último valor gerado.
- </para>
- </note>
- </sect3>
- <sect3 id="zend.db.adapter.write.update">
- <title>Updating Data</title>
- <para>
- Você pode atualizar linhas em uma tabela de banco de dados usando o
- método <methodname>update()</methodname> de uma adaptadora. Esse método leva
- três argumentos: o primeiro é o nome da tabela, o
- segundo é um matriz associativo mapeando as colunas a serem alteradas para os novos
- valores a serem atribuídos a essas colunas.
- </para>
- <para>
- Os valores na matriz de dados são tratados como sequências de caracteres.
- Veja <link linkend="zend.db.adapter.write.insert">esta seção</link>
- para obter informações sobre como utilizar expressões <acronym>SQL</acronym> na
- matriz de dados.
- </para>
- <para>
- O terceiro argumento é uma string contendo uma expressão <acronym>SQL</acronym>
- que é usada como critério para as linhas a serem alteradas. Os valores
- e identificadores nesse argumento não são citados ou escapados.
- Você é responsável por garantir que o conteúdo dinâmico seja
- interpolados para essa sequência de forma segura.
- Veja <link linkend="zend.db.adapter.quoting">esta seção</link>
- para métodos que o ajudam a fazer isso.
- </para>
- <para>
- O valor de retorno é o número de linhas afetadas pela operação
- de atualização.
- </para>
- <example id="zend.db.adapter.write.update.example">
- <title>Atualizando Linhas</title>
- <programlisting language="php"><![CDATA[
- $data = array(
- 'updated_on' => '2007-03-23',
- 'bug_status' => 'FIXED'
- );
- $n = $db->update('bugs', $data, 'bug_id = 2');
- ]]></programlisting>
- </example>
- <para>
- Se você omitir o terceiro argumento, então todas as linhas na tabela
- do banco de dados são atualizadas com os valores especificados no matriz de dados.
- </para>
- <para>
- Se você fornecer um matriz de strings como terceiro argumento, essas
- strings são unidas como termos em uma expressão separada
- por operadores <constant>AND</constant>.
- </para>
- <para>
- Se você fornecer um matriz de matrizs como terceiro argumento, os
- valores serão automaticamente citados dentro das chaves. Esses
- serão então unidos como termos, separados por
- operadores <constant>AND</constant>.
- </para>
- <example id="zend.db.adapter.write.update.example-array">
- <title>Atualizando Linhas Usando um matriz de Expressões</title>
- <programlisting language="php"><![CDATA[
- $data = array(
- 'updated_on' => '2007-03-23',
- 'bug_status' => 'FIXED'
- );
- $where[] = "reported_by = 'goofy'";
- $where[] = "bug_status = 'OPEN'";
- $n = $db->update('bugs', $data, $where);
- // A SQL resultante é:
- // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
- // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')
- ]]></programlisting>
- </example>
- <example id="zend.db.adapter.write.update.example-arrayofarrays">
- <title>Atualizando Linhas Usando um matriz de matrizs</title>
- <programlisting language="php"><![CDATA[
- $data = array(
- 'updated_on' => '2007-03-23',
- 'bug_status' => 'FIXED'
- );
- $where['reported_by = ?'] = 'goofy';
- $where['bug_status = ?'] = 'OPEN';
- $n = $db->update('bugs', $data, $where);
- // A SQL resultante é:
- // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
- // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.write.delete">
- <title>Excluindo Dados</title>
- <para>
- Você pode excluir linhas de uma tabela de banco de dados usando o
- método <methodname>delete()</methodname>methodName>. Esse método leva dois
- argumentos: O primeiro é uma string com o nome da tabela.
- </para>
- <para>
- O segundo argumento é uma string contendo uma expressão <acronym>SQL</acronym>
- que é usada como critério para as linhas a eliminar. Os valores
- e identificadores nesse argumento não são citados ou escapado.
- Você é responsável por garantir que o conteúdo dinâmico seja
- interpolado para esta seqüência de forma segura.
- Veja <link linkend="zend.db.adapter.quoting">esta seção</link>
- para métodos que o ajudam a fazer isso.
- </para>
- <para>
- O valor de retorno é o número de linhas afetadas pela operação
- de exclusão.
- </para>
- <example id="zend.db.adapter.write.delete.example">
- <title>Excluindo Linhas</title>
- <programlisting language="php"><![CDATA[
- $n = $db->delete('bugs', 'bug_id = 3');
- ]]></programlisting>
- </example>
- <para>
- Se você omitir o segundo argumento, o resultado é que todas as linhas na
- tabela do banco de dados são eliminadas.
- </para>
- <para>
- Se você fornecer um matriz de strings como o segundo argumento, essas
- strings são unidas como termos em uma expressão separada
- por operadores <constant>AND</constant>.
- </para>
- <para>
- Se você fornecer um matriz de matrizs como segundo argumento, os
- valores serão automaticamente citados dentro das chaves. Esses
- serão então unidos como termos, separados por
- operadores <constant>AND</constant>.
- </para>
- </sect3>
- </sect2>
- <sect2 id="zend.db.adapter.quoting">
- <title>Citando Valores e Identificadores</title>
- <para>
- Quando você monta consultas <acronym>SQL</acronym>, muitas vezes é o caso de você
- precisar incluir os valores de variáveis<acronym>PHP</acronym> em expressões
- <acronym>SQL</acronym>. Isso é arriscado, porque se o valor em uma string
- <acronym>PHP</acronym> contém certos símbolos, como o símbolo de citação, isso pode
- resultar em <acronym>SQL</acronym> inválido. Por exemplo, observe os apóstrofos não
- balanceados na seguinte consulta:
- </para>
- <programlisting language="php"><![CDATA[
- $name = "O'Reilly";
- $sql = "SELECT * FROM bugs WHERE reported_by = '$name'";
- echo $sql;
- // SELECT * FROM bugs WHERE reported_by = 'O'Reilly'
- ]]></programlisting>
- <para>
- Ainda pior é o risco de tais erros de código possam ser explorados
- deliberadamente por uma pessoa que está tentando manipular a função
- de sua aplicação web. Se eles podem especificar o valor de uma variável
- <acronym>PHP</acronym> através do uso de um parâmetro <acronym>HTTP</acronym> ou
- outro mecanismo, eles podem ser capazes de fazer suas consultas <acronym>SQL</acronym>
- fazerem coisas que você não pretendia que elas fizessem, tais retornar dados para a
- pessoa que não deveria ter o privilégio de lê-los. Essa é uma técnica grave e
- generalizada para violar a segurança do aplicativo, conhecido como "SQL Injection"
- (veja <ulink url="http://en.wikipedia.org/wiki/SQL_Injection">
- http://en.wikipedia.org/wiki/SQL_Injection
- </ulink>).
- </para>
- <para>
- A classe adaptadora <classname>Zend_Db</classname> fornece funções convenientes para
- ajudar a reduzir as vulnerabilidades para ataques de Injeção de <acronym>SQL</acronym>
- em seu código <acronym>PHP</acronym>. A solução é escapar caracteres especiais tais
- como apóstrofos em valores <acronym>PHP</acronym> antes deles serem interpolados em
- suas strings <acronym>SQL</acronym>. Isso protege tanto contra manipulação acidental
- quanto deliberada de strings <acronym>SQL</acronym> por variáveis
- <acronym>PHP</acronym> que contém caracteres especiais.
- </para>
- <sect3 id="zend.db.adapter.quoting.quote">
- <title>Usando quote()</title>
- <para>
- O método <methodname>quote()</methodname> aceita um único argumento, um
- valor string escalar. Ele retorna o valor com
- caracteres especiais de uma forma adequada para o <acronym>SGBDR</acronym> que você
- está usando, e rodeado por delimitadores de valor de string. O
- delimitador de valor de string padrão <acronym>SQL</acronym> é o apóstrofo
- ( ').
- </para>
- <example id="zend.db.adapter.quoting.quote.example">
- <title>Usando quote()</title>
- <programlisting language="php"><![CDATA[
- $name = $db->quote("O'Reilly");
- echo $name;
- // 'O\'Reilly'
- $sql = "SELECT * FROM bugs WHERE reported_by = $name";
- echo $sql;
- // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'
- ]]></programlisting>
- </example>
- <para>
- Note que o valor de retorno de <methodname>quote()</methodname> inclui os
- delimitadores de citação em torno da cadeia. Isso é diferente de
- algumas funções que escapam caracteres especiais, mas não adicionam
- os delimitadores de citação, por exemplo
- <ulink url="http://www.php.net/mysqli_real_escape_string">
- mysql_real_escape_string()
- </ulink>.
- </para>
- <para>
- Os valores podem precisar ser citados ou não citados de acordo com o
- contexto de tipo de dados <acronym>SQL</acronym> em que eles são usados. Por
- exemplo, em algumas marcas de <acronym>SGBDR</acronym>, um valor inteiro não deve
- ser citado como uma string se for comparado a uma coluna ou expressão do tipo
- inteiro. Em outras palavras, o código seguinte é um erro em algumas implementações
- <acronym>SQL</acronym>, assumindo que <property>intColumn</property> tem um tipo de
- dados <acronym>SQL</acronym> <constant>INTEGER</constant>
- </para>
- <programlisting language="php"><![CDATA[
- SELECT * FROM atable WHERE intColumn = '123'
- ]]></programlisting>
- <para>
- Você pode usar o segundo argumento opcional para o
- método <methodname>quote()</methodname> para aplicar citação seletivamente para
- o tipo de dados <acronym>SQL</acronym> que você especificar.
- </para>
- <example id="zend.db.adapter.quoting.quote.example-2">
- <title>Usando quote() com um Tipo SQL</title>
- <programlisting language="php"><![CDATA[
- $value = '1234';
- $sql = 'SELECT * FROM atable WHERE intColumn = '
- . $db->quote($value, 'INTEGER');
- ]]></programlisting>
- </example>
- <para>
- Cada classe <classname>Zend_Db_Adapter</classname> tem codificada os nomes de
- tipos de dados <acronym>SQL</acronym> numéricos para a respectiva marca de
- <acronym>SGBDR</acronym>. Você também pode usar as constantes
- <constant>Zend_Db::INT_TYPE</constant>, <constant>Zend_Db::BIGINT_TYPE</constant>,
- e <constant>Zend_Db::FLOAT_TYPE</constant> para escrever código de uma forma mais
- independente de <acronym>SGBDR</acronym>.
- </para>
- <para>
- <classname>Zend_Db_Table</classname> especifica <acronym>SQL</acronym> para
- <methodname>quote()</methodname> automaticamente ao gerar
- consultas <acronym>SQL</acronym> que referenciam colunas-chave de uma tabela.
- </para>
- </sect3>
- <sect3 id="zend.db.adapter.quoting.quote-into">
- <title>Usando quoteInto()</title>
- <para>
- O uso mais típico de citação é para interpolar uma variável <acronym>PHP</acronym>
- em uma expressão ou declaração <acronym>SQL</acronym>. Você pode usar o
- método <methodname>quoteInto()</methodname> para fazer isso em uma única etapa.
- Esse método leva dois argumentos: o primeiro argumento é uma string
- contendo um símbolo marcador (?), e o
- segundo argumento é um valor ou variável <acronym>PHP</acronym> que deve ser
- substituída pelo marcador.
- </para>
- <para>
- O símbolo marcador é o mesmo símbolo usado por muitas marcas de
- <acronym>SGBDR</acronym> para parâmetros posicionais, mas o
- método <methodname>quoteInto()</methodname> apenas emula parâmetros de consulta.
- O método simplesmente interpola o valor para a string,
- escapa caracteres especiais, e aplica apóstrofos em torno dele.
- Parâmetros de consulta verdadeiros mantêm a separação entre a string
- <acronym>SQL</acronym> e os parâmetros assim que a declaração é analisada no
- servidor <acronym>SGBDR</acronym>.
- </para>
- <example id="zend.db.adapter.quoting.quote-into.example">
- <title>Usando quoteInto()</title>
- <programlisting language="php"><![CDATA[
- $sql = $db->quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");
- echo $sql;
- // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'
- ]]></programlisting>
- </example>
- <para>
- Você pode usar o terceiro parâmetro opcional de
- <methodname>quoteInto()</methodname> para especificar o tipo de dados
- <acronym>SQL</acronym>.
- Tipos de dados numéricos não são citados, e outros tipos são citados.
- </para>
- <example id="zend.db.adapter.quoting.quote-into.example-2">
- <title>Using quoteInto() with a SQL Type</title>
- <programlisting language="php"><![CDATA[
- $sql = $db
- ->quoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER');
- echo $sql;
- // SELECT * FROM bugs WHERE reported_by = 1234
- ]]></programlisting>
- </example>
- </sect3>
- <sect3 id="zend.db.adapter.quoting.quote-identifier">
- <title>Usando quoteIdentifier()</title>
- <para>
- Os valores não são a única parte da sintaxe <acronym>SQL</acronym> que pode
- precisar ser variável. Se você usar variáveis <acronym>PHP</acronym> para nomear
- tabelas, colunas, ou outros identificadores em suas declarações
- <acronym>SQL</acronym>, pode ser necessário citar essas strings também. Por padrão,
- identificadores <acronym>SQL</acronym> têm regras de sintaxe como
- <acronym>PHP</acronym> e a maioria das outras linguagens de programação.
- Por exemplo, os identificadores não devem conter espaços, certas
- pontuações ou caracteres especiais, ou ainda caracteres internacionais.
- Certas palavras também são reservadas para a sintaxe <acronym>SQL</acronym>,
- e não devem ser usadas como identificadores.
- </para>
- <para>
- No entanto, <acronym>SQL</acronym> tem um recurso chamado
- <emphasis>identificadores delimitados</emphasis>, que permite escolhas mais amplas
- para a grafia de identificadores. Se você colocar um identificador
- <acronym>SQL</acronym> no tipo adequado de aspas, pode usar identificadores
- com dados que seriam inválidos sem as aspas. Identificadores delimitados podem
- conter espaços, pontuação, ou caracteres internacionais. Você também pode usar
- palavras reservadas da <acronym>SQL</acronym> se colocá-las em identificadores
- delimitados.
- </para>
- <para>
- O método <methodname>quoteIdentifier()</methodname> trabalha como
- <methodname>quote()</methodname>, mas ele aplica caracteres delimitadores
- de identificador para a string de acordo com o tipo de adaptador que você
- usar. Por exemplo, a <acronym>SQL</acronym> padrão usa aspas duplas (")
- para delimitadores de identificador, e a maioria das marcas de
- <acronym>SGBDR</acronym> marcas usam esse símbolo. O MySQL usa crase (`) por
- padrão. O método <methodname>quoteIdentifier()</methodname> também escapa
- caracteres especiais dentro do argumento string.
- </para>
- <example id="zend.db.adapter.quoting.quote-identifier.example">
- <title>Usando quoteIdentifier()</title>
- <programlisting language="php"><![CDATA[
- // podemos deter um nome de tabela que é uma palavra reservada SQL
- $tableName = $db->quoteIdentifier("order");
- $sql = "SELECT * FROM $tableName";
- echo $sql
- // SELECT * FROM "order"
- ]]></programlisting>
- </example>
- <para>
- Identificadores delimitados <acronym>SQL</acronym> são sensíveis à caixa, ao
- contrário de identificadores não citados. Portanto, se você usar identificadores
- delimitados, você deve usar a ortografia do identificador exatamente como ela é
- armazenada no seu esquema, incluindo a caixa das letras.
- </para>
- <para>
- Na maioria dos casos onde <acronym>SQL</acronym> é gerada dentro
- de classes <classname>Zend_Db</classname>, o padrão é que todos os identificadores
- sejam delimitados automaticamente. Você pode alterar esse comportamento com a opção
- <constant>Zend_Db::AUTO_QUOTE_IDENTIFIERS </constant>. Especifique essa opção
- ao instanciar o adaptador.
- Veja <link linkend="zend.db.adapter.connecting.parameters.example2">este
- exemplo</link>.
- </para>
- </sect3>
- </sect2>
- <sect2 id="zend.db.adapter.transactions">
- <title>Controlando Transações de Banco de Dados</title>
- <para>
- Bases de dados definem as operações como unidades lógicas de trabalho que podem ser
- confirmadas ou revertidas como uma única mudança, mesmo que operem em várias tabelas.
- Todas as consultas ao banco de dados são executadas no contexto de uma transação, mesmo
- se o driver de banco de dados as gerencia implicitamente. Isso é chamado modo
- <emphasis>auto-commit</emphasis>, no qual o driver de banco cria uma transação para cada
- declaração que você executa, e confirma essa transação após sua declaração
- <acronym>SQL</acronym> ser executada. Por padrão, todas as classes adaptadoras
- <classname>Zend_Db</classname> operam em modo auto-commit.
- </para>
- <para>
- De forma alternativa, você pode especificar o início e resolução de uma
- transação, e assim controlar quantas consultas <acronym>SQL</acronym> estão incluídas
- em um único grupo que é confirmado (ou revertido) como uma única
- transação. Use o método <methodname>beginTransaction()</methodname> para
- iniciar uma transação. Posteriormente declarações <acronym>SQL</acronym> são executadas
- no contexto da mesma transação, até que você o resolva explicitamente.
- </para>
- <para>
- Para resolver a transação, use o método <methodname>commit()</methodname> ou
- <methodname>rollBack()</methodname>. O método <methodname>commit()</methodname>
- altera marcas feitas durante a sua transação como confirmadas, o que
- significa que os efeitos dessas mudanças são mostrados em consultas executadas em
- outras transações.
- </para>
- <para>
- O método <methodname>rollBack()</methodname> faz o oposto: ele descarta
- as alterações feitas durante a transação. As mudanças são
- efetivamente desfeitas, e o estado dos dados retorna a como estava
- antes de você começar sua transação. No entanto, a reversão de sua
- transação não tem efeito sobre as mudanças feitas por outras transações
- executadas simultaneamente.
- </para>
- <para>
- Depois de resolver essa operação, <classname>Zend_Db_Adapter</classname>
- retorna ao modo auto-commit, até que você chame
- <methodname>beginTransaction()</methodname> novamente.
- </para>
- <example id="zend.db.adapter.transactions.example">
- <title>Gerenciando uma Transação para Garantir Consistência</title>
- <programlisting language="php"><![CDATA[
- // Inicie uma transação explicitamente.
- $db->beginTransaction();
- try {
- // Tenta executar uma ou mais consultas:
- $db->query(...);
- $db->query(...);
- $db->query(...);
- // Se todas tem sucesso, confirma a transação e todas as mudanças
- // são confirmadas de uma vez.
- $db->commit();
- } catch (Exception $e) {
- // Se qualquer uma das consultas falhar e lançar uma exceção
- // nós queremos desfazer a transação inteira, revertendo
- // mudanças feitas na transação, mesmo aquelas que tiveram sucesso
- // Assim todas as mudanças são confirmadas juntas, ou nenhuma é.
- $db->rollBack();
- echo $e->getMessage();
- }
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.db.adapter.list-describe">
- <title>Listando e Descrevendo Tabelas</title>
- <para>
- O método <methodname>listTables()</methodname> retorna uma matriz de strings,
- com os nomes de todas as tabelas do banco de dados atual.
- </para>
- <para>
- O método <methodname>describeTable()</methodname> retorna uma matriz associativa
- de metadados sobre uma tabela. Especifique o nome da tabela
- como uma string no primeiro argumento para este método. O segundo
- argumento é opcional, e identifica o esquema no qual a tabela
- existe.
- </para>
- <para>
- As chaves da matriz associativa retornada são os nomes das colunas
- da tabela. O valor correspondente a cada coluna é também uma
- matriz associativa, com as seguintes chaves e valores:
- </para>
- <table frame="all" cellpadding="5" id="zend.db.adapter.list-describe.metadata">
- <title>Campos de Metadados Devolvidos por describeTable()</title>
- <tgroup cols="3" align="left" colsep="1" rowsep="1">
- <thead>
- <row>
- <entry>Key</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><constant>SCHEMA_NAME</constant></entry>
- <entry>(string)</entry>
- <entry>
- Nome do esquema do banco de dados no qual essa tabela existe.
- </entry>
- </row>
- <row>
- <entry><constant>TABLE_NAME</constant></entry>
- <entry>(string)</entry>
- <entry>Nome da tabela a qual esta coluna pertence.</entry>
- </row>
- <row>
- <entry><constant>COLUMN_NAME</constant></entry>
- <entry>(string)</entry>
- <entry>Nome da coluna.</entry>
- </row>
- <row>
- <entry><constant>COLUMN_POSITION</constant></entry>
- <entry>(integer)</entry>
- <entry>Posição ordinal da coluna na tabela.</entry>
- </row>
- <row>
- <entry><constant>DATA_TYPE</constant></entry>
- <entry>(string)</entry>
- <entry>Nome do tipo de dados do <acronym>SGBDR</acronym> da coluna.</entry>
- </row>
- <row>
- <entry><constant>DEFAULT</constant></entry>
- <entry>(string)</entry>
- <entry>Valor padrão para a coluna, se houver.</entry>
- </row>
- <row>
- <entry><constant>NULLABLE</constant></entry>
- <entry>(boolean)</entry>
- <entry>
- <constant>TRUE</constant> se a coluna aceita <acronym>SQL</acronym>
- <constant>NULL</constant>'s, <constant>FALSE</constant> se a
- coluna tem uma restrição <constant>NOT</constant>
- <constant>NULL</constant>.
- </entry>
- </row>
- <row>
- <entry><constant>LENGTH</constant></entry>
- <entry>(integer)</entry>
- <entry>
- Comprimento ou tamanho da coluna como informado pelo
- <acronym>SGBDR</acronym>.
- </entry>
- </row>
- <row>
- <entry><constant>SCALE</constant></entry>
- <entry>(integer)</entry>
- <entry>
- Escala de tipo <acronym>SQL</acronym> <constant>NUMERIC</constant> ou
- <constant>DECIMAL</constant>.
- </entry>
- </row>
- <row>
- <entry><constant>PRECISION</constant></entry>
- <entry>(integer)</entry>
- <entry>
- Precisão de tipo <acronym>SQL</acronym> <constant>NUMERIC</constant> ou
- <constant>DECIMAL</constant>.
- </entry>
- </row>
- <row>
- <entry><constant>UNSIGNED</constant></entry>
- <entry>(boolean)</entry>
- <entry>
- <constant>TRUE</constant> se um tipo baseado em inteiro for informado
- como <constant>UNSIGNED</constant>.
- </entry>
- </row>
- <row>
- <entry><constant>PRIMARY</constant></entry>
- <entry>(boolean)</entry>
- <entry>
- <constant>TRUE</constant> se a coluna é parte da chave primária dessa
- tabela.
- </entry>
- </row>
- <row>
- <entry><constant>PRIMARY_POSITION</constant></entry>
- <entry>(integer)</entry>
- <entry>Posição ordinal (baseada em 1) da coluna na chave primária.</entry>
- </row>
- <row>
- <entry><constant>IDENTITY</constant></entry>
- <entry>(boolean)</entry>
- <entry>
- <constant>TRUE</constant> se a coluna usa um valor autogerado.
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <note>
- <title>Como o Campo de Metadados IDENTITY Relaciona-se com SGBDRs Específicos</title>
- <para>
- O campo de metadados <constant>IDENTITY</constant> foi escolhido como um termo
- 'idiomático' para representar uma relação de chaves substitutas. Este campo pode ser
- vulgarmente conhecido pelos seguintes valores: --
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <constant>IDENTITY</constant> - <acronym>DB2</acronym>,
- <acronym>MSSQL</acronym>
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>AUTO_INCREMENT</constant> - MySQL/MariaDB
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>SERIAL</constant> - PostgreSQL
- </para>
- </listitem>
- <listitem>
- <para>
- <constant>SEQUENCE</constant> - Oracle
- </para>
- </listitem>
- </itemizedlist>
- </note>
- <para>
- Se não houver nenhum tabela que se encaixe com o nome da tabela e nome de esquema
- opcional especificado, então <methodname>describeTable()</methodname> retorna uma
- matriz vazia.
- </para>
- </sect2>
- <sect2 id="zend.db.adapter.closing">
- <title>Fechando uma Conexão</title>
- <para>
- Normalmente não é necessário fechar uma conexão de dados. <acronym>PHP</acronym>
- limpa automaticamente todos os recursos ao final de uma requisição.
- Extensões de Banco de Dados são projetadas para fechar a conexão assim que a
- referência para o objeto do recurso é eliminada.
- </para>
- <para>
- No entanto, se você tem um script de longa duração <acronym>PHP</acronym> que inicia
- muitas conexões de banco de dados, talvez seja necessário encerrar a conexão, para
- evitar um esgotamento da capacidade de seu servidor <acronym>SGBDR</acronym>. Você pode
- usar o método <methodname>closeConnection()</methodname> da classe adaptadora fechar
- explicitamente a conexão de dados subjacente.
- </para>
- <para>
- Desde a versão 1.7.2, você pode verificar se está conectado ao
- servidor <acronym>SGBDR</acronym> com o método <methodname>isConnected()</methodname>.
- Isso significa que um recurso de conexão foi iniciado e não foi fechado. Essa
- função não é atualmente capaz de testar, por exemplo, um fechamento do lado servidor
- da conexão. Ela é usada internamente para fechar a conexão. Isso permite que você feche
- a conexão várias vezes sem erros. Já era o caso antes de 1.7.2 para adaptadores
- <acronym>PDO</acronym>, mas não para os outros.
- </para>
- <example id="zend.db.adapter.closing.example">
- <title>Fechando uma Conexão com o Banco de Dados</title>
- <programlisting language="php"><![CDATA[
- $db->closeConnection();
- ]]></programlisting>
- </example>
- <note>
- <title>Zend_Db Suporta Conexões Persistentes?</title>
- <para>
- Sim, a persistência é suportada através da adição da
- propriedade <property>persistent</property> definida como <constant>TRUE</constant>
- na configuração (não em driver_configuration) de um adaptador
- em <classname>Zend_Db</classname>.
- </para>
- <example id="zend.db.adapter.connecting.persistence.example">
- <title>Usando a Propriedade Persistence com o Adaptador Oracle</title>
- <programlisting language="php"><![CDATA[
- $db = Zend_Db::factory('Oracle', array(
- 'host' => '127.0.0.1',
- 'username' => 'webuser',
- 'password' => 'xxxxxxxx',
- 'dbname' => 'test',
- 'persistent' => true
- ));
- ]]></programlisting>
- </example>
- <para>
- Por favor, note que o uso de conexões persistentes pode causar um
- excesso de conexões inativas no servidor <acronym>SGBDR</acronym>, o que leva a
- mais problemas do que qualquer ganho de desempenho que você possa obter por
- reduzir a sobrecarga de fazer conexões.
- </para>
- <para>
- Conexões de banco de dados tem estado. Isto é, alguns objetos no
- servidor <acronym>SGBDR</acronym> existem no escopo de sessão.
- Exemplos são bloqueios, variáveis de usuário,
- tabelas temporárias, e informações sobre as consultas mais
- recentemente executadas, tais como linhas afetadas e o último
- valor gerado de id. Se você usa conexões persistentes, a sua
- aplicação pode acessar dados inválidos ou privilegiadas que foram
- criado em uma solicitação <acronym>PHP</acronym> anterior.
- </para>
- <para>
- Atualmente, apenas Oracle, <acronym>DB2</acronym>, e os adaptadores
- <acronym>PDO</acronym> (onde especificado pelo <acronym>PHP</acronym>) suportam
- persistência em <classname>Zend_Db</classname>.
- </para>
- </note>
- </sect2>
- <sect2 id="zend.db.adapter.other-statements">
- <title>Rodando Outras Declarações de Banco de Dados</title>
- <para>
- Pode haver casos em que você precisa acessar o objeto de conexão
- diretamente, como provido pela extensão de banco de dados <acronym>PHP</acronym>.
- Algumas dessas extensões podem oferecer recursos que não são cobertos por
- métodos de <classname>Zend_Db_Adapter_Abstract</classname>.
- </para>
- <para>
- Por exemplo, todas as declarações <acronym>SQL</acronym> rodadas por
- <classname>Zend_Db</classname> são preparadas, então executadas. No entanto, algumas
- funções de banco de dados são incompatíveis com declarações preparadas. Instruções
- <constant>DDL</constant> como <constant>CREATE</constant> e <constant>ALTER</constant>
- não podem ser preparadas no MySQL. Além disso, declarações <acronym>SQL</acronym> não se
- beneficiam do <ulink
- url="http://dev.mysql.com/doc/refman/5.1/en/query-cache-how.html">MySQL Query
- Cache</ulink>, antes do MySQL 5.1.17.
- </para>
- <para>
- A maioria das extensões de banco de dados <acronym>PHP</acronym> fornecem um método
- para executar declarações <acronym>SQL</acronym> sem prepará-los. Por exemplo, em
- <acronym>PDO</acronym>, esse método é <methodname>exec()</methodname>. Você pode
- acessar o objeto de conexão na extensão <acronym>PHP</acronym> diretamente usando
- <methodname>getConnection()</methodname>.
- </para>
- <example id="zend.db.adapter.other-statements.example">
- <title>Rodando uma Declaração Não Preparada em um Adaptador PDO</title>
- <programlisting language="php"><![CDATA[
- $result = $db->getConnection()->exec('DROP TABLE bugs');
- ]]></programlisting>
- </example>
- <para>
- A maioria das extensões de banco de dados <acronym>PHP</acronym> fornecem um método
- para executar declarações <acronym>SQL</acronym> sem prepará-los. Por exemplo, em
- <acronym>PDO</acronym>, esse método é <methodname>exec()</methodname>. Você pode
- acessar o objeto de conexão na extensão <acronym>PHP</acronym> diretamente usando
- <methodname>getConnection()</methodname>.
- </para>
- <para>
- Em versões futuras de <classname>Zend_Db</classname>, haverá oportunidades de
- adicionar pontos de entrada de método para funcionalidades que são comuns às
- extensões de banco de dados <acronym>PHP</acronym> suportadas . Isso não afetará
- compatibilidade com versões anteriores.
- </para>
- </sect2>
- <sect2 id="zend.db.adapter.server-version">
- <title>Recuperanco a Versão do Servidor</title>
- <para>
- Desde a versão 1.7.2, você pode recuperar a versão do servidor no estilo de sintaxe
- <acronym>PHP</acronym> para ser capaz de usar
- <methodname>version_compare()</methodname>. Se a informação não estiver disponível,
- você receberá <constant>NULL</constant>.
- </para>
- <example id="zend.db.adapter.server-version.example">
- <title>Verificando a versão do servidor antes de rodar uma consulta</title>
- <programlisting language="php"><![CDATA[
- $version = $db->getServerVersion();
- if (!is_null($version)) {
- if (version_compare($version, '5.0.0', '>=')) {
- // faz alguma coisa
- } else {
- // faz alguma outra coisa
- }
- } else {
- // impossível ler a versão do servidor
- }
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.db.adapter.adapter-notes">
- <title>Notas sobre Adaptadores Específicos</title>
- <para>
- Esta seção lista diferenças entre as classes adaptadoras sobre as quais
- você deve ficar atento.
- </para>
- <sect3 id="zend.db.adapter.adapter-notes.ibm-db2">
- <title>IBM DB2</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique esse adaptador para o método <methodname>factory()</methodname>
- com o nome 'Db2'.
- </para>
- </listitem>
- <listitem>
- <para>
- Este adaptador usa a extensão <acronym>PHP</acronym>
- <constant>IBM_DB2</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- <acronym>IBM</acronym> <acronym>DB2</acronym> suporta tanto seqüências
- quanto chaves de autoincremento. Portanto os argumentos para
- <methodname>lastInsertId()</methodname> são opcionais. Se você não fornecer
- argumentos, o adaptador retorna o último valor gerado para uma chave de
- autoincremento. Se você fornecer argumentos, o adaptador retorna o último
- valor gerado pela seqüência nomeada de acordo com a convenção
- '<emphasis>table</emphasis>_<emphasis>column</emphasis>_seq'.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.mysqli">
- <title>MySQLi</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique esse adaptador para o método <methodname>factory()</methodname>
- com o nome 'Mysqli'.
- </para>
- </listitem>
- <listitem>
- <para>
- Este adaptador utiliza a extensão <acronym>PHP</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- O MySQL e o MariaDB não suportam sequências, assim
- <methodname>lastInsertId()</methodname> ignora seus argumentos e
- sempre retorna o último valor gerado para uma
- chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
- retorna <constant>NULL</constant>.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.oracle">
- <title>Oracle</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique esse adaptador para o método <methodname>factory()</methodname>
- com o nome de 'Oracle'.
- </para>
- </listitem>
- <listitem>
- <para>
- Esse adaptador usa a extensão <acronym>PHP</acronym> oci8.
- </para>
- </listitem>
- <listitem>
- <para>
- Oracle não suporta chaves de autoincremento, assim você
- deve especificar o nome de uma sequência de
- <methodname>lastInsertId()</methodname> ou
- <methodname>lastSequenceId()</methodname>.
- </para>
- </listitem>
- <listitem>
- <para>
- A extensão da Oracle não suporta parâmetros
- posicionais. Você deve usar parâmetros nomeados.
- </para>
- </listitem>
- <listitem>
- <para>
- Atualmente, a opção <constant>Zend_Db::CASE_FOLDING</constant>
- não é suportada pelo adaptador Oracle. Para utilizar essa
- opção com a Oracle, você deve usar o adaptador <acronym>PDO</acronym>
- <acronym>OCI</acronym>.
- </para>
- </listitem>
- <listitem>
- <para>
- Por padrão, os campos <acronym>LOB</acronym> são devolvidos como objetos
- <acronym>OCI</acronym>-Lob. Você pode recuperá-los como string para todas as
- solicitações, utilizando as opções do driver
- '<property>lob_as_string</property>' ou para uma solicitação particular,
- usando <methodname>setLobAsString(boolean)</methodname> no adaptador ou na
- declaração.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.sqlsrv">
- <title>Microsoft SQL Server</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique esse adaptador para o método <methodname>factory()</methodname>
- com o nome 'Sqlsrv'.
- </para>
- </listitem>
- <listitem>
- <para>
- Esse adaptador usa a extensão <acronym>PHP</acronym> sqlsrv.
- </para>
- </listitem>
- <listitem>
- <para>
- Somente o Microsoft <acronym>SQL</acronym> Server 2005 ou superior é
- suportado.
- </para>
- </listitem>
- <listitem>
- <para>
- Microsoft <acronym>SQL</acronym> Server não suporta sequências, assim
- <methodname>lastInsertId()</methodname> ignora o argumento de chave
- primária e retorna o último valor gerado para uma chave de autoincremento
- se um nome de tabela for especificado ou o último id retornado por uma
- consulta de inserção. O método <methodname>lastSequenceId()</methodname>
- retorna <constant>NULL</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Db_Adapter_Sqlsrv</classname> configura
- <constant>QUOTED_IDENTIFIER</constant> ON imediatamente após conectar-se a
- um servidor <acronym>SQL</acronym>. Isso faz com que o driver utilize o
- símbolo delimitador de identificador da <acronym>SQL</acronym> padrão
- (<emphasis> "</emphasis>) em vez dos colchetes que a sintaxe do
- <acronym>SQL</acronym> Server usa para delimitar identificadores.
- </para>
- </listitem>
- <listitem>
- <para>
- Você pode especificar <property>driver_options</property> como uma chave na
- matriz de opções. O valor pode ser uma coisa qualquer coisa daqui <ulink
- url="http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx">
- http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx</ulink>.
- </para>
- </listitem>
- <listitem>
- <para>
- Você pode usar <methodname>setTransactionIsolationLevel()</methodname> para
- definir nível de isolamento para a conexão atual. O valor pode ser
- <constant>SQLSRV_TXN_READ_UNCOMMITTED</constant>,
- <constant>SQLSRV_TXN_READ_COMMITTED</constant>,
- <constant>SQLSRV_TXN_REPEATABLE_READ</constant>,
- <constant>SQLSRV_TXN_SNAPSHOT</constant> ou
- <constant>SQLSRV_TXN_SERIALIZABLE</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- A partir de Zend Framework 1.9, a distribuição mínima suportada da
- extesnão <acronym>PHP</acronym> para <acronym>SQL</acronym> Server
- da Microsoft é a 1.0.1924.0. e o <acronym>MSSQL</acronym> Server Native
- Client versão 9.00.3042.00.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.pdo-ibm">
- <title>PDO para IBM DB2 e Informix Dynamic Server (IDS)</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique esse adaptador o método <methodname>factory()</methodname>
- com o nome '<classname>Pdo_Ibm</classname>'.
- </para>
- </listitem>
- <listitem>
- <para>
- Esse adaptador usa as extensões <acronym>PHP</acronym>
- <acronym>PDO</acronym> e <constant>PDO_IBM</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- Você deve usar pelo menos a versão da extensão <constant>PDO_IBM</constant>
- 1.2.2. Se você tiver uma versão anterior desta extensão, você deve atualizar
- a extensão <constant>PDO_IBM</constant> a partir da <acronym>PECL</acronym>.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.pdo-mssql">
- <title>PDO Microsoft SQL Server</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique este adaptador para o método <methodname>factory()</methodname>
- com o nome '<classname>Pdo_Mssql</classname>'.
- </para>
- </listitem>
- <listitem>
- <para>
- Esse adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_dblib.
- </para>
- </listitem>
- <listitem>
- <para>
- Microsoft <acronym>SQL</acronym> Server não suporta sequências, assim
- <methodname>lastInsertId()</methodname> ignora seus argumentos e
- sempre retorna o último valor gerado para uma
- chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
- retorna <constant>NULL</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- Se você está trabalhando com strings Unicode em uma codificação diferente
- de <acronym>UCS</acronym>-2 (tal como <acronym>UTF</acronym>-8), você pode
- ter que realizar uma conversão no código de sua aplicação ou armazenar os
- dados em uma coluna binária. Por favor, consulte a <ulink
- url="http://support.microsoft.com/kb/232580">Base de Conhecimento da
- Microsoft</ulink> para mais informações.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Db_Adapter_Pdo_Mssql</classname> configura
- <constant>QUOTED_IDENTIFIER</constant> ON imediatamente depois de
- conectar-se a um banco de dados <acronym>SQL</acronym> Server. Isso
- faz com que o driver utilize o símbolo delimitador de identificador
- da <acronym>SQL</acronym> padrão ( ") em vez dos colchetes que a sintaxe
- <acronym>SQL</acronym> Server utiliza para delimitar identificadores.
- </para>
- </listitem>
- <listitem>
- <para>
- Você pode especificar <property>pdoType</property> como uma chave na
- matriz de opções. O valor pode ser "mssql" (o padrão),
- "dblib", "FreeTDS", ou "Sybase". Essa opção afeta
- o prefixo <acronym>DSN</acronym> que o adaptador usa quando constrói a
- string <acronym>DSN</acronym>. Tanto "FreeTDS" quanto "sybase" implicam
- um prefixo de "sybase:", que é usado para o conjunto de bibliotecas
- <ulink url="http://www.freetds.org/">FreeTDS</ulink>.
- Veja também
- <ulink url="http://www.php.net/manual/en/ref.pdo-dblib.connection.php">
- http://www.php.net/manual/en/ref.pdo-dblib.connection.php </ulink>
- Para obter mais informações sobre os prefixos <acronym>DSN</acronym>
- utilizados neste driver.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.pdo-mysql">
- <title>PDO MySQL</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique este adaptador para o método <methodname>factory()</methodname>
- com o nome '<classname>Pdo_Mysql</classname>'.
- </para>
- </listitem>
- <listitem>
- <para>
- Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_mysql.
- </para>
- </listitem>
- <listitem>
- <para>
- O MySQL e o MariaDB não suportam sequencias, assim
- <methodname>lastInsertId()</methodname> ignora seus argumentos e
- sempre retorna o último valor gerado para uma
- chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
- retorna <constant>NULL</constant>.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.pdo-oci">
- <title>PDO Oracle</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique este adaptador para o método <methodname>factory()</methodname>
- com o nome '<classname>Pdo_Oci</classname>'.
- </para>
- </listitem>
- <listitem>
- <para>
- Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_oci.
- </para>
- </listitem>
- <listitem>
- <para>
- Oracle não suporta chaves de autoincremento, assim você
- deve especificar o nome de uma sequencia para
- <methodname>lastInsertId()</methodname> ou
- <methodname>lastSequenceId()</methodname>.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.pdo-pgsql">
- <title>PDO PostgreSQL</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique este adaptador para o método <methodname>factory()</methodname>
- com o nome '<classname>Pdo_Pgsql</classname>'.
- </para>
- </listitem>
- <listitem>
- <para>
- Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_pgsql.
- </para>
- </listitem>
- <listitem>
- <para>
- PostgreSQL supporta tanto sequencias quanto chaves de
- autoincremento. Portanto os argumentos para
- <methodname>lastInsertId()</methodname> são opcionais. Se você não
- fornecer argumentos, o adaptador retorna o último valor
- gerado para uma chave de autoincremento. Se você fornecer
- argumentos, o adaptador retorna o último valor gerado
- pela sequencia nomeado de acordo com a convenção
- '<emphasis>table</emphasis>_<emphasis>column</emphasis>_seq'.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.pdo-sqlite">
- <title>PDO SQLite</title>
- <itemizedlist>
- <listitem>
- <para>
- Especifique este adaptador para o método <methodname>factory()</methodname>
- com o nome '<classname>Pdo_Sqlite</classname>'.
- </para>
- </listitem>
- <listitem>
- <para>
- Este adaptador usa as extensões <acronym>PHP</acronym> pdo e pdo_sqlite.
- </para>
- </listitem>
- <listitem>
- <para>
- SQLite não suporta sequencias, assim
- <methodname>lastInsertId()</methodname> ignora seus argumentos e
- sempre retorna o último valor gerado para uma
- chave de autoincremento. O método <methodname>lastSequenceId()</methodname>
- retorna <constant>NULL</constant>.
- </para>
- </listitem>
- <listitem>
- <para>
- Para conectar-se com um banco de dados SQLite2, especifique
- <command>'sqlite2' => true</command> na matriz de
- parâmetros quando criar uma instância do adaptador
- <classname>Pdo_Sqlite</classname>.
- </para>
- </listitem>
- <listitem>
- <para>
- Para conectar-se com um banco de dados SQLite em memória,
- especifique <command>'dbname' => ':memory:'</command> na
- matriz de parâmetros quando criar uma instância do
- adaptador <classname>Pdo_Sqlite</classname>.
- </para>
- </listitem>
- <listitem>
- <para>
- Versões antigas do driver SQLite para <acronym>PHP</acronym> parecem não
- suportar os comandos <acronym>PRAGMA</acronym> necessários para garantir que
- nomes de coluna curtos sejam usados em conjuntos de resultados. Se você
- tem problemas que seus conjuntos de resultados são retornados com
- chaves da forma "tablename.columnname" quando você faz uma
- consulta com junção, então você deve atualizar para a versão
- atual do <acronym>PHP</acronym>.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.db.adapter.adapter-notes.firebird">
- <title>Firebird (Interbase)</title>
- <itemizedlist>
- <listitem>
- <para>
- Este adaptador usa a extensão <acronym>PHP</acronym> php_interbase.
- </para>
- </listitem>
- <listitem>
- <para>
- Firebird (Interbase) não suporta chaves de autoincremento,
- portanto, você deve especificar o nome de uma sequência para
- <methodname>lastInsertId()</methodname> ou
- <methodname>lastSequenceId()</methodname>.
- </para>
- </listitem>
- <listitem>
- <para>
- Atualmente, a opção <constant>Zend_Db::CASE_FOLDING</constant>
- não é suportada pelo adaptador Firebird (Interbase).
- Identificadores não citadas são automaticamente devolvidos em
- maiúsculas.
- </para>
- </listitem>
- <listitem>
- <para>
- O nome do adaptador é <classname>ZendX_Db_Adapter_Firebird</classname>.
- </para>
- <para>
- Lembre-se de usar o parâmetro adapterNamespace com o valor
- <classname>ZendX_Db_Adapter</classname>.
- </para>
- <para>
- Recomendamos a atualização de <filename>gds32.dll</filename> (ou equivalente
- Linux) empacotado junto com <acronym>PHP</acronym>, para a mesma versão do
- servidor. Para Firebird o equivalente de <filename>gds32.dll</filename> é
- <filename>fbclient.dll</filename>.
- </para>
- <para>
- Por padrão todos os identificadores (nomes de tabela, campos) são
- devolvidos em caixa
- alta.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|