quinta-feira, 1 de fevereiro de 2007

Uma forma diferente de acessar dados em PHP

Quem desenvolve em PHP provavelmente já sacou que no quesito acesso a dados a linguagem é um tanto acoplada. Cada banco de dados tem seus próprios métodos (functions) para manipulação de dados.

Um exemplo de uma página que faz um select no banco de dados:

<?
$conn = mssql_connect("ip_servidor", "usuario", "senha");
mssql_select_db("banco", $conn);

$sql = "select * from tabela";
$qry = mssql_query($sql, $conn);

while ($linha = mssql_fetch_array($qry)) {
//trata o registro na variavel array $linha
}

...


mssql_close($conn);
?>

Neste caso estou usando o MS SQL Server (depois eu posto como acessar o MS SQL Server no Linux). Para outros bancos, como o MySQL, trocamos tudo que tem mssql por mysql (ex: mysql_connect, mysql_query, ...).

Perceba agora. Cada página PHP que acessar dados precisará desta estrutura. A parte da conexão até pode ser separada com um script de include, mas e o resto do código? Felipe, não estou entendendo... Ok eu explico: imagina se você trocar de banco de dados no meio do desenvolvimento? Tipo: o MySQL não tá legal e vamos usar o MS SQL Server agora. Ótimo! Genial! Tudo o que tenho que fazer é alterar 123 script no meu site. Obrigado!

Agora a proposta: encapsular estes métodos dentro de uma biblioteca para manter o sistema organizado e não acoplado. Na hora de trocar o banco é só trocar nos métodos da biblioteca. Inteligente, não... Modularização, meu caro... POO, meu caro...

observe o arquivo db.php

<?

class DB {
$conexao;

function DB() {
// construtor da classe abre conexão com o banco de dados
$this->conexao = mssql_connect("servidor", "usuario", "senha");
mssql_select_db("banco", $this->conexao);
}

function executarConsultaSelecao($sql) {
$i = 0;
$id = mssql_query($sql, $this->conexao);
if ($id == 1) {
$resultado = array();
}
else {
while ($linha = mssql_fetch_array($id)) {
$resultado[$i] = $linha;
$i++;
}
mssql_free_result($id);
}
return $resultado;
}

function executarComandoSQL($sql) {
$retorno = true;
mssql_query($sql, $conexao) or $retorno = false;
return $retorno;

}

function fecharConexao() {
mssql_close($this->conexao);
}

}

?>


Pronto esse é o básico. Vamos explicar os métodos.

No construtor da classe abrimos conexão com banco de dados. Sempre que criamos uma nova instância da classe isso acontece.

No método executarConsultaSelecao enviamos um comando SQL e a função retorna um array multidimensional com os registros retornados.

No método executarComandoSQL enviamos um comando SQL que não retorna dados (como insert, update, delete e SP que não retorna nada).

Agora aplicando no nosso script:

<?
include("db.php");
$db = new DB();

$resultado = $db->executarConsultaSelecao("select * from tabela");

foreach ($resultado as $linha) {
// $linha é cada registro retornado dentro do loop
}


$db->executarComandoSQL("insert into tabela(...) values (...)");

$db->fecharConexao();
?>


Na minha humilde opinião ficou muito mais bonito hehe. E a qualidade também é muito boa. E, quando trocar o banco de dados é só alterar os métodos da classe DB no arquivo db.php.

Este é o primeiro passo para uma série de boas práticas de desenvolvimento. Sempre que der tempo eu vou postando a forma que eu desenvolvo aqui. Abraços a todos e até mais!

Nenhum comentário:

Postar um comentário