Ótimo tutorial, Arkilus sempre mostrando seu potencial.
Além de tudo, é mais seguro que o tão famoso mysql_connect
info
Grupo: Visconde
Registrado: 10/06/06
Posts: 338
Reputação: +6
Char no Tibia: Setyte Berseker

Ótimo tutorial, Arkilus sempre mostrando seu potencial.
Além de tudo, é mais seguro que o tão famoso mysql_connect
info
Grupo: Campones
Registrado: 19/10/05
Posts: 33
Reputação: 0
SQL em PHP com o PEAR::MDB2
Introdução
As conexões com um banco de dados SQL estão presentes em 95% das páginas que utilizam algum tipo de controle de dados, mas o grande problema é que nem sempre quem escreve esses scripts sabe fazê-lo de forma segura e sustentável.
A forma mais comum e usada hoje em dia para uma conexão MySql seria o clássico mysql_connect(...). Acontece que essa forma de conexão obriga todos os utilizadores do script a usarem MySql, que nem sempre é o banco de dados desejado.
Para contornar isso, um grupo de programadores da PEAR* decidiram criar um package (uma classe) que melhorasse as conexões SQL e ao mesmo tempo fosse compatível e fácil de ser usado em diversos tipos de bancos de dados, assim surgiu o package PEAR::DB, posteriormente substituído pela mais nova solução para SQL em PHP: o PEAR::MDB2.
*PEAR é um repositório de packages (classes) PHP criado e mantido por centenas de programadores, com o intuito de criar e melhorar a usabilidade do PHP. Eles disponibilizam diversos pacotes que estão em constantes melhorias e cada qual com uma utilidade mais incrível que o outro.
Tamanhas são as utilidades dos pacotes PEAR que as versões mais novas do PHP já são distribuídas com o PEAR e seus pacotes mais usados já instalados.
Mais informações no site www.pear.php.net
Se você utiliza uma versão do PHP ou um servidor recentes, é muito provável que já tenha tanto o PEAR como o básico do pacote MDB2 instalados.
Instalando o MDB2 e o suporte para MySql e MySql Improved
Caso o MDB2 não esteja instalado, siga os seguintes passos para baixar e instalar ele no PEAR (em Windows, mas em Linux é praticamente a mesma coisa):
Por exemplo, se a pasta do php estiver em C:\server\, digite cd C:\server\php
Pronto, agora o pacote MDB2 está instalado e com suporte a MySql e MySql Improved
Utilizando o PEAR::MDB2
**Conexão
****Incluindo o pacote
A primeira coisa a se observar, é que para podermos usar um package da PEAR é necessário dar um include no arquivo principal deste, no nosso caso, devemos adicionar o arquivo MDB2.php no início de tudo (não é necessária a especificação do caminho):
require_once('MDB2.php');****Declaração da DSN
Feito isso, devemos nos conectar ao banco de dados. As conexões dos packages da PEAR (DB e MDB2) seguem uma sintaxe um pouco diferente da comumente utilizada pelos famosos mysql_connect, ou pg_connect, etc. Começando por uma DSN, que é uma string que possui uma forma especifica de declaração, englobando os dados da conexão:
Onde:
[*]usuario = Nome de usuário
[*]password = Senha
[*]host = Host
[*]database = Nome da DB
Exemplo:
Uma outra forma de declarar a DSN seria através de uma array:
****Conectando
Declarada a DSN, falta chamar o método de conexão, existem três:
Para chamá-los devemos precedê-los de MDB2:: e usar como argumento a DSN:
$con =& MDB2::factory($dsn); # ou $con =& MDB2::factory('mysqli://josh:waitzkin@localhost/chess');Então será retornado um objeto referente a esta conexão.
**Interagindo com o Banco de Dados
****Pesquisas
- Query Simples
Para recuperarmos dados da DB (SELECT, SHOW, EXPLAIN, etc) utilizamos o método query.
Ele deve ser chamado através do objeto da conexão:
Será retornado um handler para o resultado, e através dele podem ser usados outros métodos (atente novamente para o uso de referências - &).
Exemplos:
$result =& $con->query('SELECT * FROM table WHERE column=1'); $select = 'SELECT column FROM table WHERE column=0 ORDER BY date'; $result =& $con->query($select);- Número de linhas Retornadas
Para verificar o número de linhas retornadas devemos usar o método numRows() do objeto-resultado.
Exemplo:
- Retirando dados do objeto-resultado
*Para os próximos exemplos estarei usando a seguinte tabela:
*Supondo que $result seja o resultado dessa query
Após realizada a query, devemos chamar outro método caso desejemos usar os dados retornados: o fetchRow().
Este método aceita como parâmetro a forma como o resultado deve ser retornado, existem três tipos:
MDB2_FETCHMODE_ORDERED
- Modo padrão, retorna uma array em que cada chave numérica corresponde á coluna mais á esquerda, em ordem crescente e começando pelo 0.
Resultado:
Retorno do print_r($row):
MDB2_FETCHMODE_ASSOC
- Esse modo retorna uma array em que cada chave é o nome da coluna correspondente.
Resultado:
Retorno do print_r($row):
MDB2_FETCHMODE_OBJECT
- Esse modo retorna um objeto em que cada coluna é tratada como um atributo.
Resultado:
Retorno do print_r($row):
MDB2_FETCHMODE_DEFAULT
- Esse método retorna uma array na forma default configurada no PEAR, que por padrão é o ORDERED
- Configurando o padrão FETCHMODE da conexão
Alternativamente podemos configurar um FETCHMODE padrão para a conexão com que vamos trabalhar através do método setFetchMode(). Feito isso, caso chamemos, por exemplo, um fetchRow() (sem argumento), a forma retornada seria a indicada nesse método.
Uso:
A cada chamada á função fetchRow() será retornada uma linha, e false caso a última linha já tenha sido lida.
- Lendo todas as linhas retornadas
Para ler todas as linhas retornadas existem duas formas:
º Loop
while($row =& $result->fetchRow(MDB2_FETCHMODE_ASSOC)) { echo "<pre>"; print_r($row); echo "</pre>"; // Ações... }Saída:
º Método fetchAll()
Esse método retorna uma array bidimensional contendo todas as linhas do objeto-resultado.
Saída do print_r($row):
º query() + fetchAll() = queryAll()
Uma maneira mais rápida e prática e fazer isso tudo seria o uso do método queryAll():
$row =& $con->queryAll("SELECT * FROM test", MDB2_FETCHMODE_ASSOC);A saída desse código seria a MESMA que a mostrada acima no método fetchAll(), porém, deve-se notar que o uso desse método impossibilita o uso de outros, como por exemplo o numRows() - que ainda assim pode ser contornado por funções de array.
****DMQ - Data Manipulation Queries
- Query Simples
Para executar-se queries de manipulação de dados (INSERT, UPDATE, DELETE), não mais deve ser o usado o método query() e sim o exec()
Esse método retornará um erro caso seja usado com queries que não sejam DMQs, como SELECT.
Será retornado o número de linhas afetadas (note que no MDB2 não há mais o método affectedRows()).
Exemplos:
$nrows =& $con->exec("INSERT INTO test(coluna1, coluna2, coluna3) VALUES ('v_col1', 3, 'v_col3')"); $del = "DELETE FROM test WHERE coluna2='3'"; $nrows =& $con->exec($del);****Tratamento de erros
Para evitar problemas tanto no código como de segurança, deve-se sempre fazer uma verificação se a ação não resultou em um erro, para tanto usamos o método PEAR::isError($objeto-resultado).
Verificado que existe um erro, podemos obter a mensagem enviada pelo MDB2 através do método getMessage()
Exemplos:
$result =& $cnt->query("SELECT * FROM tabela_inexistente"); if(PEAR::isError($result)) { die($result->getMessage()); }Saída:
#####################======================#####################
Exemplo completo de como deveria ser escrito um script utilizando o PEAR::MDB2 :
// Inclusão do pacote require_once('MDB2.php'); // Declaração da DSN $dsn = array( 'phptype' => 'mysqli', 'username' => 'josh', 'password' => 'waitzkin', 'hostspec' => 'localhost', 'database' => 'chess' ); // Conectando $con =& MDB2::factory($dsn); if(PEAR::isError($con)) die($con->getMessage()); // Configurando o FETCHMODE padrão $con->setFectchMode(MDB2_FETCHMODE_OBJECT); // Realizando um SELECT $select = "SELECT * FROM test"; $sel_res =& $con->query($select); if(PEAR::isError($sel_res)) die($sel_res->getMessage()); elseif($sel_res->numRows() < 1) die("DataBase error: no rows returned"); else { while($row =& $sel_res->fetchRow()) { /*...*/ } } // Realizando um INSERT $insert = "INSERT INTO test(coluna1, coluna2, coluna3) VALUES ('v_col1', 4, 'v_col3')"; $nrows =& $con->exec($insert); if(PEAR::isError($nrows)) die($nrows->getMessage()); elseif($nrows < 1) die("DataBase error: no rows affected");#####################======================#####################
Alguns sites para se ler sobre o assunto:
#####################======================#####################
Quaisquer dúvidas é só postar! Enjoy
Editado Março 9 por Arkilus