Ir para conteúdo

Sql Em Php Com O Pear::mdb2


Arkilus

Posts Recomendados

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):

  1. Vá em Iniciar -> Executar -> Digite cmd e dê enter
  2. O prompt de comando se abrirá, então navegue até a pasta em que esta o PEAR (normalmente /php/pear).
    Por exemplo, se a pasta do php estiver em C:\server\, digite cd C:\server\php
  3. Digite as seguintes linhas, aguardando o tempo de download/instalação de cada uma:

    1. pear install MDB2
    2. pear upgrade MDB2
    3. pear install MDB2_Driver_Mysql
    4. pear install MDB2_Driver_Mysqli

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:

  • phptype://usuario:password@host/database

Onde:

  • phptype = Tipo de DB, valores aceitos:
    • fbsql: FrontBase
    • ibase: InterBase
    • mssql: Microsoft SQL Server
    • mysql: MySQL
    • mysqli: MySQL Improved
    • oci8 : Oracle 7/8/9
    • pgsql: PostgreSQL
    • querysim: QuerySim
    • sqlite: SQLite

    [*]usuario = Nome de usuário

    [*]password = Senha

    [*]host = Host

    [*]database = Nome da DB

Exemplo:

$dsn = 'mysqli://josh:waitzkin@localhost/chess';

 

Uma outra forma de declarar a DSN seria através de uma array:

$dsn = array(
'phptype'  => 'mysqli',
'username' => 'josh',
'password' => 'waitzkin',
'hostspec' => 'localhost',
'database' => 'chess'
);

 

****Conectando

 

Declarada a DSN, falta chamar o método de conexão, existem três:

  • connect : era mais usado no package PEAR::DB, mas caiu em desuso com o MDB2 (mas preservado).
  • singleton : é usado para evitar que se sejam criadas duas conexões com a mesma DSN. Caso já haja alguma, ele retonará um erro.
  • factory : é o mais utilizado e recomendado para a maioria das tarefas

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.

ATENÇÃO!

***************************************************************

Para que o uso do MDB2 funcione corretamente é necessário o uso de um objeto-referência do objeto original em vez de uma cópia:

  • $con =& MDB2::factory($dsn);

e NÃO

  • $con = MDB2::factory($dsn);

***************************************************************

 

 

**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:

  • $result =& $con->query($sql_query);

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:

$rows = $result->numRows();

 

- Retirando dados do objeto-resultado

 

*Para os próximos exemplos estarei usando a seguinte tabela:

mysql_000.JPG

*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.

 

$row =& $result->fetchRow(MDB2_FETCHMODE_ORDERED);

 

Resultado:

  • $row[0] = "Valor1"
  • $row[1] = 1
  • $row[2] = "Valor3"

Retorno do print_r($row):

Array
(
[0] => Valor1
[1] => 1
[2] => Valor3
)

 

MDB2_FETCHMODE_ASSOC

- Esse modo retorna uma array em que cada chave é o nome da coluna correspondente.

 

$row =& $result->fetchRow(MDB2_FETCHMODE_ASSOC);

 

Resultado:

  • $row["coluna1"] = "Valor1"
  • $row["coluna2"] = 1
  • $row["coluna3"] = "Valor3"

Retorno do print_r($row):

Array
(
[coluna1] => Valor1
[coluna2] => 1
[coluna3] => Valor3
)

 

MDB2_FETCHMODE_OBJECT

- Esse modo retorna um objeto em que cada coluna é tratada como um atributo.

 

$row =& $result->fetchRow(MDB2_FETCHMODE_OBJECT);

 

Resultado:

  • $row->coluna1 = "Valor1"
  • $row->coluna2 = 1
  • $row->coluna3 = "Valor3"

Retorno do print_r($row):

stdClass Object
(
[coluna1] => Valor1
[coluna2] => 1
[coluna3] => Valor3
)

 

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:

$con->setFetchMode(MDB2_FETCHMODE_ORDERED);
// ou
$con->setFetchMode(MDB2_FETCHMODE_ASSOC);
//ou
$con->setFetchMode(MDB2_FETCHMODE_OBJECT);

 

 

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:

Array
(
[coluna1] => Valor1
[coluna2] => 1
[coluna3] => Valor3
)
Array
(
[coluna1] => V1
[coluna2] => 2
[coluna3] => V3
)

 

º Método fetchAll()

 

Esse método retorna uma array bidimensional contendo todas as linhas do objeto-resultado.

$row =& $result->fetchAll(MDB2_FETCHMODE_ASSOC);

Saída do print_r($row):

Array
(
[0] => Array
	(
		[coluna1] => Valor1
		[coluna2] => 1
		[coluna3] => Valor3
	)

[1] => Array
	(
		[coluna1] => V1
		[coluna2] => 2
		[coluna3] => V3
	)

)

 

º 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.

  • $nrows =& $con->exec($sql_query);

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:

  • MDB2 Error: no such table

#####################======================#####################

 

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 por Arkilus
Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...
×
×
  • Criar Novo...