You are on page 1of 27

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.

delete

Search :

Search

Espaol

English

Franais

Deutsch

Portugus do Brasil

Polski

API

Index / III. Referncia do Zend Framework / 27. Zend_Db

ndice

Translation 12.2% Update 2011-11-16 - Revision 24447 - Version ZF 1.11.x


Captulo 27. Zend_Db Anterior Parte III. Referncia do Zend Framework Prxima

Captulo 27. Zend_Db


Cursos de Java Cursos de programao em Java no RJ. Matricule-se j!
www.cotiinformatica.com.br

EFiX USB Supports 10.7 Patented multi-OS solution for PC Win, MacOS 10.6, 10.7 &now 10.8 www.efix-shop.com Cursos de Java - RJ Aprenda Java com o Professor Carlos Ribeiro (Prof. da UFF)
www.carlosribeiro.com

ndice 27.1. Zend_Db_Adapter 27.1.1. Conectando-se a um Banco de Dados Usando uma Adaptadora 27.1.1.1. Usando um Construtor de Adaptadora Zend_Db 27.1.1.2. Usando a Fbrica Zend_Db 27.1.1.3. Usando Zend_Config com Zend_Db Factory 27.1.1.4. Parmetros da Adaptadora 27.1.1.5. Gerenciando Conexes Preguiosas 27.1.2. Banco de Dados de Exemplo 27.1.3. Lendo Resultados de Consulta 27.1.3.1. Buscando um Conjunto Completo de Resultados 27.1.3.2. Alterando o Modo de Busca 27.1.3.3. Buscando um Conjunto de Resultados como um matriz Associativo 27.1.3.4. Buscando uma nica Coluna a partir de um Conjunto de Resultados 27.1.3.5. Buscando Pares Chave-Valor a partir de um Conjunto de Resultados 27.1.3.6. Buscando uma Linha nica a partir de um Conjunto de Resultados 27.1.3.7. Buscando um Escalar nico a partir de um Conjunto de Resultados 27.1.4. Gravando Mudanas no Banco de Dados 27.1.4.1. Incluindo Dados 27.1.4.2. Recuperando um Valor Gerado 27.1.4.3. Updating Data 27.1.4.4. Excluindo Dados 27.1.5. Citando Valores e Identificadores 27.1.5.1. Usando quote() 27.1.5.2. Usando quoteInto() 27.1.5.3. Usando quoteIdentifier() 27.1.6. Controlando Transaes de Banco de Dados

1 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.1.7. Listando e Descrevendo Tabelas 27.1.8. Fechando uma Conexo 27.1.9. Rodando Outras Declaraes de Banco de Dados 27.1.10. Recuperanco a Verso do Servidor 27.1.11. Notas sobre Adaptadores Especficos 27.1.11.1. IBM DB2 27.1.11.2. MySQLi 27.1.11.3. Oracle 27.1.11.4. Microsoft SQL Server 27.1.11.5. PDO para IBM DB2 e Informix Dynamic Server (IDS) 27.1.11.6. PDO Microsoft SQL Server 27.1.11.7. PDO MySQL 27.1.11.8. PDO Oracle 27.1.11.9. PDO PostgreSQL 27.1.11.10. PDO SQLite 27.1.11.11. Firebird (Interbase) 27.2. Zend_Db_Statement 27.2.1. Creating a Statement 27.2.2. Executing a Statement 27.2.3. Fetching Results from a SELECT Statement 27.2.3.1. Fetching a Single Row from a Result Set 27.2.3.2. Fetching a Complete Result Set 27.2.3.3. Changing the Fetch Mode 27.2.3.4. Fetching a Single Column from a Result Set 27.2.3.5. Fetching a Row as an Object 27.3. Zend_Db_Profiler 27.3.1. Introduction 27.3.2. Using the Profiler 27.3.3. Advanced Profiler Usage 27.3.3.1. Filter by query elapsed time 27.3.3.2. Filter by query type 27.3.3.3. Retrieve profiles by query type 27.3.4. Specialized Profilers 27.3.4.1. Analisando o Desempenho com Firebug 27.4. Zend_Db_Select 27.4.1. Introduction 27.4.2. Creating a Select Object 27.4.3. Building Select queries 27.4.3.1. Adding a FROM clause 27.4.3.2. Adding Columns 27.4.3.3. Adding Expression Columns 27.4.3.4. Adding columns to an existing FROM or JOIN table 27.4.3.5. Adding Another Table to the Query with JOIN 27.4.3.6. Adding a WHERE Clause 27.4.3.7. Adding a GROUP BY Clause

2 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.4.3.8. Adding a HAVING Clause 27.4.3.9. Adding an ORDER BY Clause 27.4.3.10. Adding a LIMIT Clause 27.4.3.11. Adding the DISTINCT Query Modifier 27.4.3.12. Adding the FOR UPDATE Query Modifier 27.4.3.13. Building a UNION Query 27.4.4. Executing Select Queries 27.4.4.1. Executing Select Queries from the Db Adapter 27.4.4.2. Executing Select Queries from the Object 27.4.4.3. Converting a Select Object to a SQL String 27.4.5. Other methods 27.4.5.1. Retrieving Parts of the Select Object 27.4.5.2. Resetting Parts of the Select Object 27.5. Zend_Db_Table 27.5.1. Introduction 27.5.2. Using Zend_Db_Table as a concrete class 27.5.3. Defining a Table Class 27.5.3.1. Defining the Table Name and Schema 27.5.3.2. Defining the Table Primary Key 27.5.3.3. Overriding Table Setup Methods 27.5.3.4. Table initialization 27.5.4. Creating an Instance of a Table 27.5.4.1. Specifying a Database Adapter 27.5.4.2. Setting a Default Database Adapter 27.5.4.3. Storing a Database Adapter in the Registry 27.5.5. Inserting Rows to a Table 27.5.5.1. Using a Table with an Auto-incrementing Key 27.5.5.2. Using a Table with a Sequence 27.5.5.3. Using a Table with a Natural Key 27.5.6. Updating Rows in a Table 27.5.7. Deleting Rows from a Table 27.5.8. Finding Rows by Primary Key 27.5.9. Querying for a Set of Rows 27.5.9.1. Select API 27.5.9.2. Fetching a rowset 27.5.9.3. Advanced usage 27.5.10. Querying for a Single Row 27.5.11. Retrieving Table Metadata Information 27.5.12. Caching Table Metadata 27.5.12.1. Hardcoding Table Metadata 27.5.13. Customizing and Extending a Table Class 27.5.13.1. Using Custom Row or Rowset Classes 27.5.13.2. Defining Custom Logic for Insert, Update, and Delete 27.5.13.3. Define Custom Search Methods in Zend_Db_Table 27.5.13.4. Define Inflection in Zend_Db_Table

3 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.6. Zend_Db_Table_Row 27.6.1. Introduction 27.6.2. Fetching a Row 27.6.2.1. Reading column values from a row 27.6.2.2. Retrieving Row Data as an Array 27.6.2.3. Fetching data from related tables 27.6.3. Writing rows to the database 27.6.3.1. Changing column values in a row 27.6.3.2. Inserting a new row 27.6.3.3. Changing values in multiple columns 27.6.3.4. Deleting a row 27.6.4. Serializing and unserializing rows 27.6.4.1. Serializing a Row 27.6.4.2. Unserializing Row Data 27.6.4.3. Reactivating a Row as Live Data 27.6.5. Extending the Row class 27.6.5.1. Row initialization 27.6.5.2. Defining Custom Logic for Insert, Update, and Delete in Zend_Db_Table_Row 27.6.5.3. Define Inflection in Zend_Db_Table_Row 27.7. Zend_Db_Table_Rowset 27.7.1. Introduction 27.7.2. Fetching a Rowset 27.7.3. Retrieving Rows from a Rowset 27.7.4. Retrieving a Rowset as an Array 27.7.5. Serializing and Unserializing a Rowset 27.7.6. Extending the Rowset class 27.8. Zend_Db_Table Relationships 27.8.1. Introduction 27.8.2. Defining Relationships 27.8.3. Fetching a Dependent Rowset 27.8.4. Fetching a Parent Row 27.8.5. Fetching a Rowset via a Many-to-many Relationship 27.8.6. Cascading Write Operations 27.8.6.1. Notes Regarding Cascading Operations 27.9. Zend_Db_Table_Definition 27.9.1. Introduction 27.9.2. Basic Usage 27.9.3. Advanced Usage

27.1. Zend_Db_Adapter
Zend_Db e suas classes relacionadas provem uma interface de banco de dados SQL simples para Zend Framework. Zend_Db_Adapter a classe bsica que voc usa para conectar sua aplicao PHPa um SGBDR. H uma classe adaptadora diferente para cada marca de SGBDR. Os adaptadores Zend_Db criam uma ponte entre extenses PHP especficas de cada fabricante para uma

4 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

interface comum que ajuda voc a escrever aplicaes PHP uma vez e distribui-las com mltiplas marcas de SGBDR com muito pouco esforo. A interface da classe adaptadora similar interface da extenso PHP Data Objects. Zend_Db prov classes adaptadoras para drivers PDO das seguintes marcas de SGBDR: IBM DB2 e Informix Dynamic Server (IDS), usando a extenso PHP pdo_ibm MariaDB, usando a extenso PHP pdo_mysql MySQL, usando a extenso PHP pdo_mysql Microsoft SQL Server, usando a extenso PHP pdo_dblib Oracle, usando a extenso PHP pdo_oci PostgreSQL, usando a extenso PHP pdo_pgsql SQLite, usando a extenso PHP pdo_sqlite Alm disso, Zend_Db prov classes adaptadoras que utilizam extenses de bancos de dados PHP para as seguintes marcas de SGBDR: MariaDB, usando a extenso PHP mysqli MySQL, usando a extenso PHP mysqli Oracle, usando a extenso PHP oci8 IBM DB2 e DB2 I5, usando a extenso PHP ibm_db2 Firebird (Interbase), usando a extenso PHP php_interbase
Nota Cada classe adaptadora Zend_Db usa uma extenso PHP. Voc deve ter a respectiva extenso PHP habilitada em seu ambiente PHP para usar uma classe adaptadora Zend_Db. Por exemplo, se voc usa qualquer uma das classes adaptadoras PDO do Zend_Db , voc precisa habilitar tanto a extenso PDO quanto o driver PDO para a marca de SGBDR que voc usa.

Curso Java Completo Digidata - Programao - RJ 21-2233-8967 ou 2203 2276

www.digidatabrasil.com.br www.ivee.com.br

COBOL e Mainframe na WEB Formao online profissionalizante com certificao de concluso. Gesto de redes Sociais Monitore a Presena da sua Instituio de Ensino na Internet.

www.planetay.com.br

27.1.1. Conectando-se a um Banco de Dados Usando uma Adaptadora


Esta seo descreve como criar uma instncia de uma classe adaptadora de banco de dados. Isso corresponde a fazer uma conexo com seu servidor SGBDR a partir de sua aplicao PHP.

27.1.1.1. Usando um Construtor de Adaptadora Zend_Db


Voc pode criar uma instncia de uma classe adaptadora usando seu construtor. Um construtor de classe adaptadora leva um argumento, que um matriz de parmetros usado para declarar a conexo. Exemplo 27.1. Usando um Construtor de Adaptadora
$db = new Zend_Db_Adapter_Pdo_Mysql(array(

5 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

'host' 'username' 'password' 'dbname' ));

=> => => =>

'127.0.0.1', 'webuser', 'xxxxxxxx', 'test'

27.1.1.2. Usando a Fbrica Zend_Db


Como uma alternativa ao uso direto do construtor da classe adaptadora, voc pode criar uma instncia de uma adaptadora usando o mtodo esttico Zend_Db::factory(). Este mtodo carrega dinamicamente o arquivo da classe adaptadora sob demanda usando o mtodo Zend_Loader::loadClass(). O primeiro argumento um string que identifica o nome base da classe adaptadora. Por exemplo, a string 'Pdo_Mysql' corresponde classe Zend_Db_Adapter_Pdo_Mysql. O segundo argumento a mesma matriz de parmetros que voc teria passado para o construtor da adaptadora. Exemplo 27.2. Using the Adapter Factory Method
// Ns no precisamos seguir a declarao a seguir porque o // arquivo Zend_Db_Adapter_Pdo_Mysql ser carregado para ns pelo mtodo Zend_Db // factory. // require_once 'Zend/Db/Adapter/Pdo/Mysql.php'; // Carrega automaticamente a classe Zend_Db_Adapter_Pdo_Mysql // e cria uma instncia dela. $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test' ));

Se voc criar sua prpria classe que estende Zend_Db_Adapter_Abstract, mas no nomear sua classe com o prefixo de pacote "Zend_Db_Adapter", voc pode usar o mtodo factory() para carregar sua adaptadora se voc especificar a parte principal da classe adaptadora com a chave 'adapterNamespace' na matriz de parmetros. Exemplo 27.3. Usando o Mtodo de Fbrica da Adaptadora para uma Classe Adaptadora Personalizada
// Ns no precisamos carregar o arquivo da classe adaptadora // porque ele ser carregado para ns pelo mtodo de fbrica do Zend_Db. // Carrega automaticamente a classe MyProject_Db_Adapter_Pdo_Mysql e cria // uma instncia dela. $db = Zend_Db::factory('Pdo_Mysql', array( 'host' => '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test', 'adapterNamespace' => 'MyProject_Db_Adapter' ));

27.1.1.3. Usando Zend_Config com Zend_Db Factory


Opcionalmente, voc pode especificar cada argumento do mtodo factory() como um objeto do tipo Zend_Config. Se o primeiro argumento um objeto de configurao, espera-se que ele contenha uma propriedade chamada

6 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

adapter, contendo uma string que designa a base do nome da classe adaptadora. Opcionalmente, o objeto pode conter uma propriedade chamada params, com subpropriedades correspondentes aos nomes de parmetro da adaptadora. Isso usado somente se o segundo argumento do mtodo factory() for omitido. Exemplo 27.4. Usando o Mtodo de Fbrica da Adaptadora com um Objeto Zend_Config No exemplo abaixo, um objeto Zend_Config criado a partir de um matriz. Voc pode tambm carregar dados a partir de um arquivo externo usando classes tais como Zend_Config_Ini e Zend_Config_Xml.
$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);

O segundo argumento do mtodo factory() pode ser um matriz associativo contendo entradas correspondentes aos parmetros da adaptadora. Esse argumento opcional. Se o primeiro argumento do tipo Zend_Config, assumido que ele contm todos os parmetros, e o segundo argumento ignorado

27.1.1.4. Parmetros da Adaptadora


A seguinte lista explica parmetros comuns reconhecidos pelas classes adaptadoras Zend_Db.

host: uma string contendo um hostname ou endereo IP do servidor de banco de dados. Se o banco de
dados est rodando no mesmo servidor anfitrio da aplicao PHP, voc pode usar 'localhost' ou '127.0.0.1'.

username: identificador da conta para autenticar uma conexo com o servidor SGBDR. password: credencial de senha para autenticar uma conexo com o servidor SGBDR. dbname: nome da instncia do banco de dados no servidor SGBDR. port: alguns servidores SGBDR podem aceitar conexes de rede em um nmero de porta especificado pelo
administrador. O parmetro port permite que voc especifique a porta a qual sua aplicao PHP se conecta, para casar com a porta configurada no servidor SGBDR.

charset: especifica o conjunto de caracteres usado para a conexo. options: este parmetro um matriz associativo de opes que so genricas para todas as classes
Zend_Db_Adapter.

driver_options: este parmetro um matriz associativo de opes adicionais que so especficas para uma
dada extenso de banco de dados. Um uso tpico deste parmetro para configurar atributos de um driver PDO.

adapterNamespace: nomeia a parte inicial do nome da classe para a adaptadora, em vez de


'Zend_Db_Adapter'. Use isto se voc precisar do mtodo factory() para carregar uma classe adaptadora de banco de dados no-Zend.

7 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

Exemplo 27.5. Passando a Opo Case-Folding para a Fbrica Voc pode especificar essa opo pela constante Zend_Db::CASE_FOLDING. Ela corresponde ao atributo ATTR_CASE nos drivers de banco de dados PDO e IBM DB2, ajustando a caixa das chaves de string nos conjuntos de resultado de consulta. A opo leva os valores Zend_Db::CASE_NATURAL (padro), Zend_Db::CASE_UPPER, e Zend_Db::CASE_LOWER.
$options = array( Zend_Db::CASE_FOLDING => Zend_Db::CASE_UPPER ); $params = array( 'host' 'username' 'password' 'dbname' 'options' );

=> => => => =>

'127.0.0.1', 'webuser', 'xxxxxxxx', 'test', $options

$db = Zend_Db::factory('Db2', $params);

Exemplo 27.6. Passando a Opo Auto-Quoting para a Fbrica Voc pode especificar essa opo pela constante Zend_Db::AUTO_QUOTE_IDENTIFIERS. Se o valor TRUE (padro), identificadores como nomes de tabela, nomes de coluna, e mesmo apelidos so delimitados em toda sintaxe SQL gerada pelo objeto adaptador. Isso torna simples usar identificadores que contm palavras-chave SQL, ou caracteres especiais. Se o valor FALSE, identificadores no so delimitados automaticamente. Se voc precisa delimitar identificadores, voc deve fazer por conta prpria usando o mtodo quoteIdentifier().
$options = array( Zend_Db::AUTO_QUOTE_IDENTIFIERS => false ); $params = array( 'host' 'username' 'password' 'dbname' 'options' );

=> => => => =>

'127.0.0.1', 'webuser', 'xxxxxxxx', 'test', $options

$db = Zend_Db::factory('Pdo_Mysql', $params);

Exemplo 27.7. Passando Opes de Driver PDO para a Fbrica


$pdoParams = array( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true ); $params = array( 'host' 'username' 'password' 'dbname' 'driver_options' );

=> => => => =>

'127.0.0.1', 'webuser', 'xxxxxxxx', 'test', $pdoParams

$db = Zend_Db::factory('Pdo_Mysql', $params); echo $db->getConnection()

8 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);

Exemplo 27.8. Passando Opes de Serializao para a Fbrica


$options = array( Zend_Db::ALLOW_SERIALIZATION => false ); $params = array( 'host' 'username' 'password' 'dbname' 'options' );

=> => => => =>

'127.0.0.1', 'webuser', 'xxxxxxxx', 'test', $options

$db = Zend_Db::factory('Pdo_Mysql', $params);

27.1.1.5. Gerenciando Conexes Preguiosas


Criar uma instncia de uma classe adaptadora no abre uma conexo com o servidor SGBDR imediatamente. A adaptadora guarda os parmetros de conexo, e a estabelece por demanda, na primeira vez que voc precisar executar uma consulta. Isso garante que criar um objeto adaptador rpido barato. Voc pode criar uma instncia de uma adaptadora mesmo se no estiver certo que precisa rodar quaisquer consultas de banco de dados durante a requisio atual que sua aplicao est servindo. Se voc precisa forar a adaptador a se conectar ao SGBDR, use o mtodo getConnection(). Esse mtodo retorna um objeto para a conexo como representado pela respectiva extenso de banco de dados PHP. Por exemplo, se voc usar qualquer uma das classes adaptadoras para drivers PDO, ento getConnection() retorna o objeto PDO, depois de inici-lo como uma conexo ativa para o banco de dados especificado. Pode ser til forar a conexo se voc quer capturar quaisquer excees que ela lanar como resultado de credenciais de conta invlidas, ou outra falha ao conectar-se ao servidor SGBDR. Essas excees no so lanadas at que a conexo seja feita, assim isso pode ajudar a simplificar o cdigo de sua aplicao se voc manipular as excees em um lugar, em vez de faz-lo na primeira consulta ao banco de dados. Adicionalmente, uma adaptadora pode ser serializada para armazen-la, por exemplo, em uma varivel de sesso. Isso pode ser muito til no somente para a prpria adaptadora, mas para outros objetos que a agreguem, como um objeto Zend_Db_Select. Por padro, adaptadoras tm permisso de serem serializadas, se voc no quiser isso, deve considerar passar a opo Zend_Db::ALLOW_SERIALIZATION com FALSE, veja o exemplo abaixo. Em respeito ao princpio de conexes preguiosas, a adaptadora no reconectar a si prpria depois de ser revertida sua serializao. Voc deve ento chamar getConnection() por conta prpria. Voc pode fazer a adaptadora se autorreconectar pela passagem de Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE com TRUE como uma opo da adaptadora. Exemplo 27.9. Manipulando Excees de Conexo
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 no est rodando } catch (Zend_Exception $e) { // talvez factory() falhou em carregar a classe adaptadora especificada }

9 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.1.2. Banco de Dados de Exemplo


Na documentao para classes Zend_Db, ns usamos um conjunto de tabelas simples para ilustrar o uso de classes e mtodos. Estas tabelas de exemplo podem armazenar informaes sobre rastreamento de bugs em um projeto de desenvolvimento de software. O banco de dados contm quatro tabelas:

accounts armazena informao sobre cada usurio do banco de dados de rastreamento de bugs. products armazena informao sobre cada produto para o qual um bug pode ser registrado. bugs armazena informao 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 correo.

bugs_products armazena um relacionamento entre bugs e produtos. Ela implementa um relacionamento


muitos-para-muitos, porque para um dado bug pode ter relevncia para mltiplos produtos, e, obviamente, um dado produto pode ter mltiplos bugs. O seguinte pseudocdigo de linguagem de definio de dados SQL descreve as tabelas neste banco de dados de exemplo. Estas tabelas de exemplo so extensivamente usadas pelos testes unitrios automatizados de Zend_Db.
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) );

Note tambm que a tabela 'bugs' contm mltiplas referncias de chave estrangeira para a tabela 'accounts'. Cada uma das chaves estrangeiras pode referenciar uma linha diferente na tabela 'accounts' para um dado bug. O diagrama abaixo ilustra o modelo fsico de dados do banco de dados de exemplo.

10 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.1.3. Lendo Resultados de Consulta


Esta seo descreve mtodos da classe adaptadora com os quais voc pode rodar consultas SELECT e recuperar seus resultados.

27.1.3.1. Buscando um Conjunto Completo de Resultados


Voc pode rodar uma consulta SQL SELECT e recuperar seus resultados em um passo usando o mtodo fetchAll(). O primeiro argumento para este mtodo uma string contendo uma declarao SELECT. Como alternativa, o primeiro argumento pode ser um objeto da classe Zend_Db_Select. A classe adaptadora converte automaticamente esse objeto em uma representao de string da declarao SELECT. O segundo argumento para fetchAll() um matriz de valores para substituir por curingas de parmetro na declarao SQL. Exemplo 27.10. Usando fetchAll()
$sql = 'SELECT * FROM bugs WHERE bug_id = ?'; $result = $db->fetchAll($sql, 2);

27.1.3.2. Alterando o Modo de Busca


Por padro, fetchAll() retorna um matriz de linhas, cada uma das quais um matriz associativo. As chaves do matriz associativo so as colunas ou apelidos de coluna dados na consulta de seleo. Voc pode especificar um estilo diferente de resultados de busca usando o mtodo setFetchMode(). Os modos suportados so identificados por constantes:

Zend_Db::FETCH_ASSOC: retorna dados em um matriz de matrizs associativos. As chaves de matriz so


nomes de coluna, como strings. Este o modo padro de busca para classes Zend_Db_Adapter. Note que se sua lista de seleo contm mais de uma coluna com o mesmo nome, por exemplo se elas so de duas tabelas diferentes em um JOIN, pode haver somente uma entrada na matriz associativa para o nome dado. Se voc usa o modo FETCH_ASSOC, deve especificar apelidos de coluna em sua consulta SELECT para garantir que os nomes resultem em chaves de matriz nicas.

11 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

Por padro, essas strings so devolvidas como foram devolvidas pelo driver de banco de dados. Isso tipicamente a leitura da coluna no servidor SGBDR. Voc pode especificar a caixa para essas strings, usando a opo Zend_Db::CASE_FOLDING. Especifique isso quando instanciar a adaptadora. Veja este exemplo.

Zend_Db::FETCH_NUM: retorna dados em um matriz de matrizs. Os matrizs so indexados por inteiros,


correspondendo posio do respectivo campo na lista de seleo da consulta.

Zend_Db::FETCH_BOTH: retorna dados em um matriz de matrizs. As chaves de matriz so tanto strings como as usadas no modo FETCH_ASSOC, como inteiros como os usados no modo FETCH_NUM. Note que o nmero de elementos na matriz o dobro do que seria se voc usasse FETCH_ASSOC ou FETCH_NUM. Zend_Db::FETCH_COLUMN: retorna dados em um matriz de valores. O valor em cada matriz o valor
retornado pela coluna do conjunto de resultados. Por padro, essa a primeira coluna, indexada por 0.

Zend_Db::FETCH_OBJ: retorna dados em um matriz de objetos. A classe padro a classe interna PHP
stdClass. Colunas do conjunto de resultados esto disponveis como propriedades pblicas do objeto. Exemplo 27.11. Usando setFetchMode()
$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;

27.1.3.3. Buscando um Conjunto de Resultados como um matriz Associativo


O mtodo fetchAssoc() 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. Exemplo 27.12. Usando fetchAssoc()
$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']; // Descrio do Bug #2 echo $result[1]['bug_description']; // Descrio do Bug #1

27.1.3.4. Buscando uma nica Coluna a partir de um Conjunto de Resultados


O mtodo fetchCol() 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 so descartadas. Se voc precisar devolver uma outra coluna que no seja a primeira, veja esta seo. Exemplo 27.13. Usando fetchCol()
$db->setFetchMode(Zend_Db::FETCH_OBJ); $result = $db->fetchCol(

12 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

'SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2); // contm bug_description; bug_id no devolvida echo $result[0];

27.1.3.5. Buscando Pares Chave-Valor a partir de um Conjunto de Resultados


O mtodo fetchPairs() 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 SELECT. O valor tomado da segunda coluna devolvida pela consulta SELECT. Quaisquer outras colunas devolvidas pela consulta so descartadas. Voc deve projetar a conuslta SELECT de modo que a primeira coluna devolvida tenha valores nicos. Se h valores duplicados na primeira coluna, entradas na matriz associativo sero sobrescritas. Exemplo 27.14. Usando fetchPairs()
$db->setFetchMode(Zend_Db::FETCH_OBJ); $result = $db->fetchPairs('SELECT bug_id, bug_status FROM bugs'); echo $result[2];

27.1.3.6. Buscando uma Linha nica a partir de um Conjunto de Resultados


O mtodo fetchRow() retorna dados usando o modo de busca atual, mas retorna somente a primeira linha buscada a partir do conjunto de resultados. Exemplo 27.15. Using fetchRow()
$db->setFetchMode(Zend_Db::FETCH_OBJ); $result = $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2'); // note que $result um nico objeto, no um matriz de objetos echo $result->bug_description;

27.1.3.7. Buscando um Escalar nico a partir de um Conjunto de Resultados


O mtodo fetchOne() como uma combinao do mtodo fetchRow() com o mtodo fetchCol(), 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. Exemplo 27.16. Usando fetchOne()
$result = $db->fetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2'); // este um valor string nico echo $result;

27.1.4. Gravando Mudanas no Banco de Dados

13 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

Voc pode usar a classe adaptadora para gravar novos dados ou alterar dados existentes em seu banco de dados. Esta seo descreve mtodos para fazer essas operaes.

27.1.4.1. Incluindo Dados


Voc pode adicionar novas linhas em uma tabela de seu banco de dados usando o mtodo insert(). O primeiro argumento uma string que denomina a tabela, e o segundo argumento um matriz associativo, mapeando nomes de coluna para valores de dados. Exemplo 27.17. Incluindo em uma Tabela
$data = array( 'created_on' => '2007-03-22', 'bug_description' => 'Something wrong', 'bug_status' => 'NEW' ); $db->insert('bugs', $data);

Colunas que voc excluir da matriz de dados no sero especificadas para o banco de dados. Portanto, elas seguem as mesmas regras que uma declarao SQL INSERT segue: se a coluna tem uma clusula DEFAULT, a coluna leva o valor na linha criada, caso contrrio deixado em um estado NULL. Por padro, os valores em seu matriz de dados so includos usando parmetros. ISso reduz o risco de alguns tipos de problemas de segurana. Voc no precisa aplicar escaping ou quoting para valores na matriz de dados. Voc pode precisar que valores na matriz de dados sejam tratados como expresses SQL, caso no qual elas no devam sofrer quoting. Por padro, todos os valores de dados passados como strings so tratados como literais string. Para especificar que o valor uma expresso SQL e portanto no deve sofrer quoting, passe o valor na matriz de dados como um objeto do tipo Zend_Db_Expr em vez de texto claro. Exemplo 27.18. Incluindo Expresses em uma Tabela
$data = array( 'created_on' => new Zend_Db_Expr('CURDATE()'), 'bug_description' => 'Something wrong', 'bug_status' => 'NEW' ); $db->insert('bugs', $data);

27.1.4.2. Recuperando um Valor Gerado


Algumas marcas de SGBDR suportam autoincremento de chaves primrias. Uma tabela definida desse modo gera um valor de chave primria automaticamente durante um INSERT de uma nova linha. O valor de retorno do mtodo insert() no o ltimo ID includo, porque a tabela pode no ter uma coluna de autoincremento. Em vez disso, o valor de retorno o nmero de linhas afetadas (geralmente 1). Se sua tabela definida com uma chave primria de autoincremento voc pode chamar o mtodo lastInsertId() depois da incluso. Esse mtodo retonra o ltimo valor gerado no escopo da conexo atual com o banco de dados. Exemplo 27.19. Usando lastInsertId() para uma Chave de Autoincremento
$db->insert('bugs', $data);

14 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

// retorna o ltimo valor gerado por uma coluna de autoincremento $id = $db->lastInsertId();

Algumas marcas de SGBDR suportam um objeto de sequencia, que gera valores nicos para servir como valores da chave primria. Para suportar sequencias, o mtodo lastInsertId() aceita dois argumentos string opcionais. Esses argumentos denominam a tabela e a coluna, assumindo que voc tenha seguido a conveno 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 conveno usada pelo PostgreSQL quando nomeia sequencias para colunas SERIAL. Por exemplo, uma tabela "bugs" com a coluna de chave primria "bug_id" usaria uma sequencia denominada "bugs_bug_id_seq". Exemplo 27.20. Usando lastInsertId() para uma Sequencia
$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');

Se o nome de seu objeto de sequencia no seguir essa conveno de nomes, use o mtodo lastSequenceId() em seu lugar. Esse mtodo leva um nico argumento string, nomeando literalmente a sequencia. Exemplo 27.21. Usando lastSequenceId()
$db->insert('bugs', $data); // retorna o ltimo valor gerado pela sequencia 'bugs_id_gen'. $id = $db->lastSequenceId('bugs_id_gen');

Para as marcas de SGBDR que no suportam sequencias, incluindo MariaDB, MySQL, Microsoft SQL Server, e SQLite, os argumentos para o mtodo lastInsertId() so ignorados, e o valor devolvido o valor mais recente gerado para qualquer tabela por operaes INSERT durante a conexo atual. Para essas marcas de SGBDR, o mtodo lastSequenceId() sempre devolve NULL.
Porque No Usar "SELECT MAX(id) FROM table"? Algumas essa consulta retorna valor de chave primria mais recente includo em uma tabela. Entretanto, essa tcnica no segura para ser usada em um ambiente onde mltiplos clientes esto incluindo registros no banco de dados. possvel, e portanto pode acontecer eventualmente, que outro cliente inclua outra linha no instante entre a incluso executada por sua aplicao cliente e sua consulta para o valor de MAX(id). Assim o valor devolvido no identifica a linha que voc incluiu, mas sim a linha includa por algum outro cliente. No h um modo de saber quando isso aconteceu. Usar um modo de isolamento de transao forte tal como "repeatable read" pode mitigar esse risco, mas algumas marcas de SGBDR no suportam o isolamento de transao necessrio para isso, ou sua aplicao pode usar um modo de isolamento de transao baixo por projeto. Alm disso, usar uma expresso como "MAX(id)+1" para gerar um novo valor para uma chave primria no seguro, porque dois clientes poderiam fazer esta consulta simultanamente, e em seguida, ambos usariam o mesmo valor calculado para sua prxima operao INSERT.

15 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

Todas as marcas de SGBDR fornecem mecanismos para gerar valores nicos e retornar o ltimo valor gerado. Esses mecanismos necessariamente trabalham fora do escopo de isolamento da transao, portanto, no h chance de dois clientes gerarem o mesmo valor, e no h chance de que o valor gerado por um outro cliente possa ser informado sua conexo de cliente como o ltimo valor gerado.

Promoo Cursos ERPSAP Funcional, Basis, BW, A B A P4 e Fi Co Mm Pp Sd a partir 790,00 Trainning.com.br/academia_sapcurs Doutorado em Computao Aulas- Frias Escolares (Jan e Jul) Universidade Federal Argentina-UNS www.iunip.com Darr & Bueno Marcas Registros de Marcas e Patentes. Fone: 11 3129- 4363. Buscas grtis
www.darreebueno.com.br

27.1.4.3. Updating Data


Voc pode atualizar linhas em uma tabela de banco de dados usando o mtodo update() de uma adaptadora. Esse mtodo leva trs argumentos: o primeiro o nome da tabela, o segundo um matriz associativo mapeando as colunas a serem alteradas para os novos valores a serem atribudos a essas colunas. Os valores na matriz de dados so tratados como sequncias de caracteres. Veja esta seo para obter informaes sobre como utilizar expresses SQL na matriz de dados. O terceiro argumento uma string contendo uma expresso SQL que usada como critrio para as linhas a serem alteradas. Os valores e identificadores nesse argumento no so citados ou escapados. Voc responsvel por garantir que o contedo dinmico seja interpolados para essa sequncia de forma segura. Veja esta seo para mtodos que o ajudam a fazer isso. O valor de retorno o nmero de linhas afetadas pela operao de atualizao. Exemplo 27.22. Atualizando Linhas
$data = array( 'updated_on' 'bug_status' );

=> '2007-03-23', => 'FIXED'

$n = $db->update('bugs', $data, 'bug_id = 2');

Se voc omitir o terceiro argumento, ento todas as linhas na tabela do banco de dados so atualizadas com os valores especificados no matriz de dados. Se voc fornecer um matriz de strings como terceiro argumento, essas strings so unidas como termos em uma expresso separada por operadores AND. Se voc fornecer um matriz de matrizs como terceiro argumento, os valores sero automaticamente citados dentro das chaves. Esses sero ento unidos como termos, separados por operadores AND. Exemplo 27.23. Atualizando Linhas Usando um matriz de Expresses
$data = array( 'updated_on' 'bug_status' );

=> '2007-03-23', => 'FIXED'

$where[] = "reported_by = 'goofy'"; $where[] = "bug_status = 'OPEN'"; $n = $db->update('bugs', $data, $where);

16 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

// A SQL resultante : // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED' // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')

Exemplo 27.24. Atualizando Linhas Usando um matriz de matrizs


$data = array( 'updated_on' 'bug_status' );

=> '2007-03-23', => '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')

27.1.4.4. Excluindo Dados


Voc pode excluir linhas de uma tabela de banco de dados usando o mtodo delete()methodName>. Esse mtodo leva dois argumentos: O primeiro uma string com o nome da tabela. O segundo argumento uma string contendo uma expresso SQL que usada como critrio para as linhas a eliminar. Os valores e identificadores nesse argumento no so citados ou escapado. Voc responsvel por garantir que o contedo dinmico seja interpolado para esta seqncia de forma segura. Veja esta seo para mtodos que o ajudam a fazer isso. O valor de retorno o nmero de linhas afetadas pela operao de excluso. Exemplo 27.25. Excluindo Linhas
$n = $db->delete('bugs', 'bug_id = 3');

Se voc omitir o segundo argumento, o resultado que todas as linhas na tabela do banco de dados so eliminadas. Se voc fornecer um matriz de strings como o segundo argumento, essas strings so unidas como termos em uma expresso separada por operadores AND. Se voc fornecer um matriz de matrizs como segundo argumento, os valores sero automaticamente citados dentro das chaves. Esses sero ento unidos como termos, separados por operadores AND.

27.1.5. Citando Valores e Identificadores


Quando voc monta consultas SQL, muitas vezes o caso de voc precisar incluir os valores de variveisPHP em expresses SQL. Isso arriscado, porque se o valor em uma string PHP contm certos smbolos, como o smbolo de citao, isso pode resultar em SQL invlido. Por exemplo, observe os apstrofos no balanceados na seguinte consulta:
$name = "O'Reilly";

17 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

$sql = "SELECT * FROM bugs WHERE reported_by = '$name'"; echo $sql; // SELECT * FROM bugs WHERE reported_by = 'O'Reilly'

Ainda pior o risco de tais erros de cdigo possam ser explorados deliberadamente por uma pessoa que est tentando manipular a funo de sua aplicao web. Se eles podem especificar o valor de uma varivel PHP atravs do uso de um parmetro HTTP ou outro mecanismo, eles podem ser capazes de fazer suas consultas SQL fazerem coisas que voc no pretendia que elas fizessem, tais retornar dados para a pessoa que no deveria ter o privilgio de l-los. Essa uma tcnica grave e generalizada para violar a segurana do aplicativo, conhecido como "SQL Injection" (veja http://en.wikipedia.org/wiki/SQL_Injection ). A classe adaptadora Zend_Db fornece funes convenientes para ajudar a reduzir as vulnerabilidades para ataques de Injeo de SQL em seu cdigo PHP. A soluo escapar caracteres especiais tais como apstrofos em valores PHP antes deles serem interpolados em suas strings SQL. Isso protege tanto contra manipulao acidental quanto deliberada de strings SQL por variveis PHP que contm caracteres especiais.

27.1.5.1. Usando quote()


O mtodo quote() aceita um nico argumento, um valor string escalar. Ele retorna o valor com caracteres especiais de uma forma adequada para o SGBDR que voc est usando, e rodeado por delimitadores de valor de string. O delimitador de valor de string padro SQL o apstrofo ( '). Exemplo 27.26. Usando quote()
$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'

Note que o valor de retorno de quote() inclui os delimitadores de citao em torno da cadeia. Isso diferente de algumas funes que escapam caracteres especiais, mas no adicionam os delimitadores de citao, por exemplo mysql_real_escape_string() . Os valores podem precisar ser citados ou no citados de acordo com o contexto de tipo de dados SQL em que eles so usados. Por exemplo, em algumas marcas de SGBDR, um valor inteiro no deve ser citado como uma string se for comparado a uma coluna ou expresso do tipo inteiro. Em outras palavras, o cdigo seguinte um erro em algumas implementaes SQL, assumindo que intColumn tem um tipo de dados SQL INTEGER
SELECT * FROM atable WHERE intColumn = '123'

Voc pode usar o segundo argumento opcional para o mtodo quote() para aplicar citao seletivamente para o tipo de dados SQL que voc especificar. Exemplo 27.27. Usando quote() com um Tipo SQL
$value = '1234'; $sql = 'SELECT * FROM atable WHERE intColumn = ' . $db->quote($value, 'INTEGER');

18 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

Cada classe Zend_Db_Adapter tem codificada os nomes de tipos de dados SQL numricos para a respectiva marca de SGBDR. Voc tambm pode usar as constantes Zend_Db::INT_TYPE, Zend_Db::BIGINT_TYPE, e Zend_Db::FLOAT_TYPE para escrever cdigo de uma forma mais independente de SGBDR. Zend_Db_Table especifica SQL para quote() automaticamente ao gerar consultas SQL que referenciam colunas-chave de uma tabela.

27.1.5.2. Usando quoteInto()


O uso mais tpico de citao para interpolar uma varivel PHP em uma expresso ou declarao SQL. Voc pode usar o mtodo quoteInto() para fazer isso em uma nica etapa. Esse mtodo leva dois argumentos: o primeiro argumento uma string contendo um smbolo marcador (?), e o segundo argumento um valor ou varivel PHP que deve ser substituda pelo marcador. O smbolo marcador o mesmo smbolo usado por muitas marcas de SGBDR para parmetros posicionais, mas o mtodo quoteInto() apenas emula parmetros de consulta. O mtodo simplesmente interpola o valor para a string, escapa caracteres especiais, e aplica apstrofos em torno dele. Parmetros de consulta verdadeiros mantm a separao entre a string SQL e os parmetros assim que a declarao analisada no servidor SGBDR. Exemplo 27.28. Usando quoteInto()
$sql = $db->quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly"); echo $sql; // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'

Voc pode usar o terceiro parmetro opcional de quoteInto() para especificar o tipo de dados SQL. Tipos de dados numricos no so citados, e outros tipos so citados. Exemplo 27.29. Using quoteInto() with a SQL Type
$sql = $db ->quoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER'); echo $sql; // SELECT * FROM bugs WHERE reported_by = 1234

27.1.5.3. Usando quoteIdentifier()


Os valores no so a nica parte da sintaxe SQL que pode precisar ser varivel. Se voc usar variveis PHP para nomear tabelas, colunas, ou outros identificadores em suas declaraes SQL, pode ser necessrio citar essas strings tambm. Por padro, identificadores SQL tm regras de sintaxe como PHP e a maioria das outras linguagens de programao. Por exemplo, os identificadores no devem conter espaos, certas pontuaes ou caracteres especiais, ou ainda caracteres internacionais. Certas palavras tambm so reservadas para a sintaxe SQL, e no devem ser usadas como identificadores. No entanto, SQL tem um recurso chamado identificadores delimitados, que permite escolhas mais amplas para a grafia de identificadores. Se voc colocar um identificador SQL no tipo adequado de aspas, pode usar identificadores com dados que seriam invlidos sem as aspas. Identificadores delimitados podem conter espaos, pontuao, ou caracteres internacionais. Voc tambm pode usar palavras reservadas da SQL se coloc-las em identificadores delimitados. O mtodo quoteIdentifier() trabalha como quote(), mas ele aplica caracteres delimitadores de identificador para a string de acordo com o tipo de adaptador que voc usar. Por exemplo, a SQL padro usa aspas duplas (")

19 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

para delimitadores de identificador, e a maioria das marcas de SGBDR marcas usam esse smbolo. O MySQL usa crase (`) por padro. O mtodo quoteIdentifier() tambm escapa caracteres especiais dentro do argumento string. Exemplo 27.30. Usando quoteIdentifier()
// podemos deter um nome de tabela que uma palavra reservada SQL $tableName = $db->quoteIdentifier("order"); $sql = "SELECT * FROM $tableName"; echo $sql // SELECT * FROM "order"

Identificadores delimitados SQL so sensveis caixa, ao contrrio de identificadores no 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. Na maioria dos casos onde SQL gerada dentro de classes Zend_Db, o padro que todos os identificadores sejam delimitados automaticamente. Voc pode alterar esse comportamento com a opo Zend_Db::AUTO_QUOTE_IDENTIFIERS . Especifique essa opo ao instanciar o adaptador. Veja este exemplo.

27.1.6. Controlando Transaes de Banco de Dados


Bases de dados definem as operaes como unidades lgicas de trabalho que podem ser confirmadas ou revertidas como uma nica mudana, mesmo que operem em vrias tabelas. Todas as consultas ao banco de dados so executadas no contexto de uma transao, mesmo se o driver de banco de dados as gerencia implicitamente. Isso chamado modo auto-commit, no qual o driver de banco cria uma transao para cada declarao que voc executa, e confirma essa transao aps sua declarao SQL ser executada. Por padro, todas as classes adaptadoras Zend_Db operam em modo auto-commit. De forma alternativa, voc pode especificar o incio e resoluo de uma transao, e assim controlar quantas consultas SQL esto includas em um nico grupo que confirmado (ou revertido) como uma nica transao. Use o mtodo beginTransaction() para iniciar uma transao. Posteriormente declaraes SQL so executadas no contexto da mesma transao, at que voc o resolva explicitamente. Para resolver a transao, use o mtodo commit() ou rollBack(). O mtodo commit() altera marcas feitas durante a sua transao como confirmadas, o que significa que os efeitos dessas mudanas so mostrados em consultas executadas em outras transaes. O mtodo rollBack() faz o oposto: ele descarta as alteraes feitas durante a transao. As mudanas so efetivamente desfeitas, e o estado dos dados retorna a como estava antes de voc comear sua transao. No entanto, a reverso de sua transao no tem efeito sobre as mudanas feitas por outras transaes executadas simultaneamente. Depois de resolver essa operao, Zend_Db_Adapter retorna ao modo auto-commit, at que voc chame beginTransaction() novamente. Exemplo 27.31. Gerenciando uma Transao para Garantir Consistncia
// Inicie uma transao explicitamente. $db->beginTransaction(); try { // Tenta executar uma ou mais consultas: $db->query(...); $db->query(...);

20 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

$db->query(...); // Se todas tem sucesso, confirma a transao e todas as mudanas // so confirmadas de uma vez. $db->commit(); } catch (Exception $e) { // Se qualquer uma das consultas falhar e lanar uma exceo // ns queremos desfazer a transao inteira, revertendo // mudanas feitas na transao, mesmo aquelas que tiveram sucesso // Assim todas as mudanas so confirmadas juntas, ou nenhuma . $db->rollBack(); echo $e->getMessage(); }

27.1.7. Listando e Descrevendo Tabelas


O mtodo listTables() retorna uma matriz de strings, com os nomes de todas as tabelas do banco de dados atual. O mtodo describeTable() retorna uma matriz associativa de metadados sobre uma tabela. Especifique o nome da tabela como uma string no primeiro argumento para este mtodo. O segundo argumento opcional, e identifica o esquema no qual a tabela existe. As chaves da matriz associativa retornada so os nomes das colunas da tabela. O valor correspondente a cada coluna tambm uma matriz associativa, com as seguintes chaves e valores: Tabela 27.1. Campos de Metadados Devolvidos por describeTable()
Key SCHEMA_NAME TABLE_NAME COLUMN_NAME COLUMN_POSITION DATA_TYPE DEFAULT NULLABLE LENGTH SCALE PRECISION UNSIGNED PRIMARY Type (string) (string) (string) (integer) (string) (string) Description Nome do esquema do banco de dados no qual essa tabela existe. Nome da tabela a qual esta coluna pertence. Nome da coluna. Posio ordinal da coluna na tabela. Nome do tipo de dados do SGBDR da coluna. Valor padro para a coluna, se houver.

(boolean) TRUE se a coluna aceita SQL NULL's, FALSE se a coluna tem uma restrio NOT NULL. (integer) (integer) (integer) Comprimento ou tamanho da coluna como informado pelo SGBDR. Escala de tipo SQL NUMERIC ou DECIMAL. Preciso de tipo SQL NUMERIC ou DECIMAL.

(boolean) TRUE se um tipo baseado em inteiro for informado como UNSIGNED. (boolean) TRUE se a coluna parte da chave primria dessa tabela. Posio ordinal (baseada em 1) da coluna na chave primria.

PRIMARY_POSITION (integer) IDENTITY

(boolean) TRUE se a coluna usa um valor autogerado.

Como o Campo de Metadados IDENTITY Relaciona-se com SGBDRs Especficos O campo de metadados IDENTITY foi escolhido como um termo 'idiomtico' para representar uma relao de chaves substitutas. Este campo pode ser vulgarmente conhecido pelos seguintes valores: -IDENTITY - DB2, MSSQL AUTO_INCREMENT - MySQL/MariaDB SERIAL - PostgreSQL

21 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

SEQUENCE - Oracle

Se no houver nenhum tabela que se encaixe com o nome da tabela e nome de esquema opcional especificado, ento describeTable() retorna uma matriz vazia.

27.1.8. Fechando uma Conexo


Normalmente no necessrio fechar uma conexo de dados. PHP limpa automaticamente todos os recursos ao final de uma requisio. Extenses de Banco de Dados so projetadas para fechar a conexo assim que a referncia para o objeto do recurso eliminada. No entanto, se voc tem um script de longa durao PHP que inicia muitas conexes de banco de dados, talvez seja necessrio encerrar a conexo, para evitar um esgotamento da capacidade de seu servidor SGBDR. Voc pode usar o mtodo closeConnection() da classe adaptadora fechar explicitamente a conexo de dados subjacente. Desde a verso 1.7.2, voc pode verificar se est conectado ao servidor SGBDR com o mtodo isConnected(). Isso significa que um recurso de conexo foi iniciado e no foi fechado. Essa funo no atualmente capaz de testar, por exemplo, um fechamento do lado servidor da conexo. Ela usada internamente para fechar a conexo. Isso permite que voc feche a conexo vrias vezes sem erros. J era o caso antes de 1.7.2 para adaptadores PDO, mas no para os outros. Exemplo 27.32. Fechando uma Conexo com o Banco de Dados
$db->closeConnection();

Zend_Db Suporta Conexes Persistentes? Sim, a persistncia suportada atravs da adio da propriedade persistent definida como TRUE na configurao (no em driver_configuration) de um adaptador em Zend_Db. Exemplo 27.33. Usando a Propriedade Persistence com o Adaptador Oracle

$db = Zend_Db::factory('Oracle', array( 'host' => '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test', 'persistent' => true ));

Por favor, note que o uso de conexes persistentes pode causar um excesso de conexes inativas no servidor SGBDR, o que leva a mais problemas do que qualquer ganho de desempenho que voc possa obter por reduzir a sobrecarga de fazer conexes. Conexes de banco de dados tem estado. Isto , alguns objetos no servidor SGBDR existem no escopo de sesso. Exemplos so bloqueios, variveis de usurio, tabelas temporrias, e informaes sobre as consultas mais recentemente executadas, tais como linhas afetadas e o ltimo valor gerado de id. Se voc usa conexes persistentes, a sua aplicao pode acessar dados invlidos ou privilegiadas que foram criado em uma solicitao PHP anterior. Atualmente, apenas Oracle, DB2, e os adaptadores PDO (onde especificado pelo PHP) suportam persistncia em Zend_Db.

22 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.1.9. Rodando Outras Declaraes de Banco de Dados


Pode haver casos em que voc precisa acessar o objeto de conexo diretamente, como provido pela extenso de banco de dados PHP. Algumas dessas extenses podem oferecer recursos que no so cobertos por mtodos de Zend_Db_Adapter_Abstract. Por exemplo, todas as declaraes SQL rodadas por Zend_Db so preparadas, ento executadas. No entanto, algumas funes de banco de dados so incompatveis com declaraes preparadas. Instrues DDL como CREATE e ALTER no podem ser preparadas no MySQL. Alm disso, declaraes SQL no se beneficiam do MySQL Query Cache, antes do MySQL 5.1.17. A maioria das extenses de banco de dados PHP fornecem um mtodo para executar declaraes SQL sem prepar-los. Por exemplo, em PDO, esse mtodo exec(). Voc pode acessar o objeto de conexo na extenso PHP diretamente usando getConnection(). Exemplo 27.34. Rodando uma Declarao No Preparada em um Adaptador PDO
$result = $db->getConnection()->exec('DROP TABLE bugs');

A maioria das extenses de banco de dados PHP fornecem um mtodo para executar declaraes SQL sem prepar-los. Por exemplo, em PDO, esse mtodo exec(). Voc pode acessar o objeto de conexo na extenso PHP diretamente usando getConnection(). Em verses futuras de Zend_Db, haver oportunidades de adicionar pontos de entrada de mtodo para funcionalidades que so comuns s extenses de banco de dados PHP suportadas . Isso no afetar compatibilidade com verses anteriores.

27.1.10. Recuperanco a Verso do Servidor


Desde a verso 1.7.2, voc pode recuperar a verso do servidor no estilo de sintaxe PHP para ser capaz de usar version_compare(). Se a informao no estiver disponvel, voc receber NULL. Exemplo 27.35. Verificando a verso do servidor antes de rodar uma consulta
$version = $db->getServerVersion(); if (!is_null($version)) { if (version_compare($version, '5.0.0', '>=')) { // faz alguma coisa } else { // faz alguma outra coisa } } else { // impossvel ler a verso do servidor }

27.1.11. Notas sobre Adaptadores Especficos


Esta seo lista diferenas entre as classes adaptadoras sobre as quais voc deve ficar atento.

27.1.11.1. IBM DB2


Especifique esse adaptador para o mtodo factory() com o nome 'Db2'. Este adaptador usa a extenso PHP IBM_DB2.

23 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

IBM DB2 suporta tanto seqncias quanto chaves de autoincremento. Portanto os argumentos para lastInsertId() so opcionais. Se voc no 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 seqncia nomeada de acordo com a conveno 'table_column_seq'.

27.1.11.2. MySQLi
Especifique esse adaptador para o mtodo factory() com o nome 'Mysqli'. Este adaptador utiliza a extenso PHP. O MySQL e o MariaDB no suportam sequncias, assim lastInsertId() ignora seus argumentos e sempre retorna o ltimo valor gerado para uma chave de autoincremento. O mtodo lastSequenceId() retorna NULL.

27.1.11.3. Oracle
Especifique esse adaptador para o mtodo factory() com o nome de 'Oracle'. Esse adaptador usa a extenso PHP oci8. Oracle no suporta chaves de autoincremento, assim voc deve especificar o nome de uma sequncia de lastInsertId() ou lastSequenceId(). A extenso da Oracle no suporta parmetros posicionais. Voc deve usar parmetros nomeados. Atualmente, a opo Zend_Db::CASE_FOLDING no suportada pelo adaptador Oracle. Para utilizar essa opo com a Oracle, voc deve usar o adaptador PDO OCI. Por padro, os campos LOB so devolvidos como objetos OCI-Lob. Voc pode recuper-los como string para todas as solicitaes, utilizando as opes do driver 'lob_as_string' ou para uma solicitao particular, usando setLobAsString(boolean) no adaptador ou na declarao.

27.1.11.4. Microsoft SQL Server


Especifique esse adaptador para o mtodo factory() com o nome 'Sqlsrv'. Esse adaptador usa a extenso PHP sqlsrv. Somente o Microsoft SQL Server 2005 ou superior suportado. Microsoft SQL Server no suporta sequncias, assim lastInsertId() ignora o argumento de chave primria 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 insero. O mtodo lastSequenceId() retorna NULL. Zend_Db_Adapter_Sqlsrv configura QUOTED_IDENTIFIER ON imediatamente aps conectar-se a um servidor SQL. Isso faz com que o driver utilize o smbolo delimitador de identificador da SQL padro ( ") em vez dos colchetes que a sintaxe do SQL Server usa para delimitar identificadores. Voc pode especificar driver_options como uma chave na matriz de opes. O valor pode ser uma coisa qualquer coisa daqui http://msdn.microsoft.com/en-us/library/cc296161(SQL.90).aspx. Voc pode usar setTransactionIsolationLevel() para definir nvel de isolamento para a conexo atual. O valor pode ser SQLSRV_TXN_READ_UNCOMMITTED, SQLSRV_TXN_READ_COMMITTED, SQLSRV_TXN_REPEATABLE_READ, SQLSRV_TXN_SNAPSHOT ou SQLSRV_TXN_SERIALIZABLE. A partir de Zend Framework 1.9, a distribuio mnima suportada da extesno PHP para SQL Server da Microsoft a 1.0.1924.0. e o MSSQL Server Native Client verso 9.00.3042.00.

24 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

27.1.11.5. PDO para IBM DB2 e Informix Dynamic Server (IDS)


Especifique esse adaptador o mtodo factory() com o nome 'Pdo_Ibm'. Esse adaptador usa as extenses PHP PDO e PDO_IBM. Voc deve usar pelo menos a verso da extenso PDO_IBM 1.2.2. Se voc tiver uma verso anterior desta extenso, voc deve atualizar a extenso PDO_IBM a partir da PECL.

27.1.11.6. PDO Microsoft SQL Server


Especifique este adaptador para o mtodo factory() com o nome 'Pdo_Mssql'. Esse adaptador usa as extenses PHP pdo e pdo_dblib. Microsoft SQL Server no suporta sequncias, assim lastInsertId() ignora seus argumentos e sempre retorna o ltimo valor gerado para uma chave de autoincremento. O mtodo lastSequenceId() retorna NULL. Se voc est trabalhando com strings Unicode em uma codificao diferente de UCS-2 (tal como UTF-8), voc pode ter que realizar uma converso no cdigo de sua aplicao ou armazenar os dados em uma coluna binria. Por favor, consulte a Base de Conhecimento da Microsoft para mais informaes. Zend_Db_Adapter_Pdo_Mssql configura QUOTED_IDENTIFIER ON imediatamente depois de conectar-se a um banco de dados SQL Server. Isso faz com que o driver utilize o smbolo delimitador de identificador da SQL padro ( ") em vez dos colchetes que a sintaxe SQL Server utiliza para delimitar identificadores. Voc pode especificar pdoType como uma chave na matriz de opes. O valor pode ser "mssql" (o padro), "dblib", "FreeTDS", ou "Sybase". Essa opo afeta o prefixo DSN que o adaptador usa quando constri a string DSN. Tanto "FreeTDS" quanto "sybase" implicam um prefixo de "sybase:", que usado para o conjunto de bibliotecas FreeTDS. Veja tambm http://www.php.net/manual/en/ref.pdo-dblib.connection.php Para obter mais informaes sobre os prefixos DSN utilizados neste driver.

27.1.11.7. PDO MySQL


Especifique este adaptador para o mtodo factory() com o nome 'Pdo_Mysql'. Este adaptador usa as extenses PHP pdo e pdo_mysql. O MySQL e o MariaDB no suportam sequencias, assim lastInsertId() ignora seus argumentos e sempre retorna o ltimo valor gerado para uma chave de autoincremento. O mtodo lastSequenceId() retorna NULL.

27.1.11.8. PDO Oracle


Especifique este adaptador para o mtodo factory() com o nome 'Pdo_Oci'. Este adaptador usa as extenses PHP pdo e pdo_oci. Oracle no suporta chaves de autoincremento, assim voc deve especificar o nome de uma sequencia para lastInsertId() ou lastSequenceId().

27.1.11.9. PDO PostgreSQL


Especifique este adaptador para o mtodo factory() com o nome 'Pdo_Pgsql'. Este adaptador usa as extenses PHP pdo e pdo_pgsql.

25 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

PostgreSQL supporta tanto sequencias quanto chaves de autoincremento. Portanto os argumentos para lastInsertId() so opcionais. Se voc no 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 conveno 'table_column_seq'.

27.1.11.10. PDO SQLite


Especifique este adaptador para o mtodo factory() com o nome 'Pdo_Sqlite'. Este adaptador usa as extenses PHP pdo e pdo_sqlite. SQLite no suporta sequencias, assim lastInsertId() ignora seus argumentos e sempre retorna o ltimo valor gerado para uma chave de autoincremento. O mtodo lastSequenceId() retorna NULL. Para conectar-se com um banco de dados SQLite2, especifique 'sqlite2' => true na matriz de parmetros quando criar uma instncia do adaptador Pdo_Sqlite. Para conectar-se com um banco de dados SQLite em memria, especifique 'dbname' => ':memory:' na matriz de parmetros quando criar uma instncia do adaptador Pdo_Sqlite. Verses antigas do driver SQLite para PHP parecem no suportar os comandos PRAGMA necessrios para garantir que nomes de coluna curtos sejam usados em conjuntos de resultados. Se voc tem problemas que seus conjuntos de resultados so retornados com chaves da forma "tablename.columnname" quando voc faz uma consulta com juno, ento voc deve atualizar para a verso atual do PHP.

27.1.11.11. Firebird (Interbase)


Este adaptador usa a extenso PHP php_interbase. Firebird (Interbase) no suporta chaves de autoincremento, portanto, voc deve especificar o nome de uma sequncia para lastInsertId() ou lastSequenceId(). Atualmente, a opo Zend_Db::CASE_FOLDING no suportada pelo adaptador Firebird (Interbase). Identificadores no citadas so automaticamente devolvidos em maisculas. O nome do adaptador ZendX_Db_Adapter_Firebird. Lembre-se de usar o parmetro adapterNamespace com o valor ZendX_Db_Adapter. Recomendamos a atualizao de gds32.dll (ou equivalente Linux) empacotado junto com PHP, para a mesma verso do servidor. Para Firebird o equivalente de gds32.dll fbclient.dll. Por padro todos os identificadores (nomes de tabela, campos) so devolvidos em caixa alta.

Anterior 26.7. Working Examples

Acima Principal

Prxima 27.2. Zend_Db_Statement

Comments
ZendX-JQuery

26 de 27

02/04/2012 20:16

Zend Framework - Captulo 27. Zend_Db - Portugus do Brasil - zfdes.com http://manual.zfdes.com/pt-br/zend.db.html#zend.db.adapter.write.delete

You can follow any responses to this entry through the RSS 2.0 feed.

2 Responses to zend-db
Mrcio Ozrio de Jesus dice:
2010/08/14 en 2:51 PM Cara, esse site muuuuiiiiiito bom! Reune tudo sobre o assunto. Valeu mesmo, essa documentao demais! Um abrao, Mrcio 2.

1.

Soares dice: 2011/06/05 en 1:06 PM


maravilha!!!!!!!! Para o Portugues

Leave a Reply
Name (required)

Mail (will not be published) (required)

Website

Copyright 2005-2010 Zend Technologies Inc. (http://www.zend.com) Compilation Benjamn Gonzales

27 de 27

02/04/2012 20:16

You might also like