Professional Documents
Culture Documents
delete
Search :
Search
Espaol
English
Franais
Deutsch
Portugus do Brasil
Polski
API
ndice
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
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
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
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
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.
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
5 de 27
02/04/2012 20:16
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' ));
6 de 27
02/04/2012 20:16
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
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.
7 de 27
02/04/2012 20:16
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' );
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' );
8 de 27
02/04/2012 20:16
->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
9 de 27
02/04/2012 20:16
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.
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
11 de 27
02/04/2012 20:16
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_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;
12 de 27
02/04/2012 20:16
'SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2); // contm bug_description; bug_id no devolvida echo $result[0];
13 de 27
02/04/2012 20:16
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.
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);
14 de 27
02/04/2012 20:16
// 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
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
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' );
16 de 27
02/04/2012 20:16
// A SQL resultante : // UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED' // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')
$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')
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.
17 de 27
02/04/2012 20:16
$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.
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
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.
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
19 de 27
02/04/2012 20:16
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.
20 de 27
02/04/2012 20:16
$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(); }
(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.
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
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.
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
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.
23 de 27
02/04/2012 20:16
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.
24 de 27
02/04/2012 20:16
25 de 27
02/04/2012 20:16
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'.
Acima Principal
Comments
ZendX-JQuery
26 de 27
02/04/2012 20:16
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.
Leave a Reply
Name (required)
Website
27 de 27
02/04/2012 20:16