PHPLIB são algumas bibliotecas de extensão do PHP. Podemos usá-lo para executar facilmente várias operações no banco de dados. No entanto, se você quiser usar vários bancos de dados, estará além de suas capacidades. Você tem o melhor dos dois mundos. Você pode usar vários bancos de dados ao usar PHPLIB e também pode aprender sobre programação orientada a objetos e como estender a biblioteca.
Gerenciamento de banco de dados
Você pode colocar qualquer tabela em um banco de dados grande. Porém, com o tempo, o banco de dados ficará cada vez maior. O servidor pode não conseguir acompanhar o trabalho de IO ou pode não ter memória suficiente para lidar com todos os acessos. É muito difícil separar os dados existentes. É aconselhável começar com bancos de dados separados e implementar um gerenciamento eficiente de bancos de dados. Se você tem um site que vende livros, provavelmente tem uma lista de autores, uma lista de preços de livros e uma lista de estoque e pedidos atuais. À medida que o seu negócio cresce, os pedidos continuarão a crescer e o processamento de cada pedido requer muito acesso ao disco. Muito provavelmente você colocará todos os seus pedidos em um sistema de contabilidade em algum momento.
Agora coloque os pedidos em um banco de dados separado. Como o estoque também é atualizado por meio de pedidos, as quantidades do estoque também são colocadas no mesmo banco de dados.
A lista de autores e a lista de livros são informações estáticas que devem ser lidas com frequência, mas raramente atualizadas. Na prática, a atualização do registro de um autor só pode precisar ser feita uma vez a cada 5 anos, somente quando o autor escreve um novo livro (ou morre). O servidor que hospeda esses dados pode ser configurado de forma completamente diferente do servidor que hospeda o banco de dados de pedidos.
Contém PHPLIB
PHPLIB acessa bancos de dados SQL através de uma classe chamada DB_Sql. Dependendo do tipo de banco de dados que você precisa usar, inclua diferentes arquivos inc em seu código. Neste exemplo estou usando a versão MySQL.
Para usar DB_Sql em seu código, instale os arquivos PHPLIB em seu próprio diretório. Em seguida, encontre seu diretório cgi-bin e crie o diretório phplib próximo ao diretório cgi-bin. Em seguida, copie todos os arquivos PHPLIB .inc para o diretório phplib. Por fim, modifique o arquivo php.inc, basta alterar a linha "include_path=" para o diretório phplib.
include_path é o diretório que o PHP procura ao usar include() ou require(). Na minha estação de trabalho NT, o caminho de inclusão é:
include_path
= ".;i:/project52/includes;i:/project52/phplib";
No seu sistema,
adicioneinclude_path = ".;/home/httpd/includes;/home/httpd/phplib"
;
<? php
exigir(common.php);
? >
common.php3 é colocado no diretório include e contém todos os dados e funções usados por cada página. Neste exemplo common.php é:
<? php
require(db_mysql.inc);
exigir(ct_sql.inc);
require(sessão.inc);
exigir(auth.inc);
exigir(perm.inc);
exigir(usuário.inc);
exigir(página.inc);
? >
Se quiser saber a finalidade de cada arquivo inc, você pode ler a documentação do PHPLIB em http://phplib.netuse.de . Db_mysql.inc contém as definições de todas as classes DB_SQL. Se você quiser usar PostGreSQL em vez de MySQL, basta usar db_pgsql.inc em vez de db_mysql.inc. Existem outros 10 arquivos .inc para uso com MS SQL, Oracle, Sybase ou outros bancos de dados.
Observe que neste exemplo, require() e include() são exatamente iguais. No entanto, se colocado em código ou usado em uma instrução if, o uso de Require() e include são completamente diferentes e têm resultados de execução diferentes.
Estendendo o PHPLIB
O PHPLIB acessa o banco de dados através de um objeto gerado pela classe DB_Sql. Db_mysql.inc contém a classe DB_Sql modificada para MySQL. Estenderemos DB_sql adicionando código a common.php após a linha que contém db_mysql.inc.
DB_Sql contém muitas funções para consulta. O que precisamos modificar é:
<? php
/* público: gerenciamento de conexão*/
function connect($BancoDeDados = "", $Host = "", $Usuário = "", $Senha = "") {
/* Manipula a conexão padrão */
if ("" == $BancoDeDados)
$BancoDeDados = $este->BancoDeDados;
if ("" == $Host)
$Host = $this->Host;
if ("" == $Usuário)
$Usuário = $este->Usuário;
if ("" == $Senha)
$Password = $this->Password;
/* Estabelece conexão e seleciona banco de dados*/
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $Usuário, $Senha);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) falhou.");
retornar 0;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("não é possível usar banco de dados ".$this->Database);
retornar 0;
}
}
retornar $this->Link_ID;
}
? >
Encontre a função connect() em seu db_mysql.inc (ou outros arquivos .inc relacionados ao banco de dados), copie-a para common.php e coloque-a atrás do código que contém db_mysql.inc. No final, você também deve adicionar. é encapsulado como uma definição de classe.
Achei o código um pouco difícil de ler, então primeiro tornei o código copiado mais legível:
<? php
/* público: gerenciamento de conexão*/
function connect($BancoDeDados = "", $Host = "", $Usuário = "", $Senha = "") {
/* Manipula a conexão padrão */
if ("" == $BancoDeDados) {
$BancoDeDados = $este->BancoDeDados;
}
if ("" == $Host) {
$Host = $this->Host;
}
if ("" == $Usuário) {
$Usuário = $este->Usuário;
}
if ("" == $Senha) {
$Senha = $esta->Senha;
}
/* Estabelece conexão e seleciona banco de dados */
if ( 0 == $this->Link_ID ) {
$this->Link_ID=mysql_pconnect($Host, $Usuário, $Senha);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) falhou.");
retornar 0;
}
if ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("não é possível usar banco de dados ".$this->Database);
retornar 0;
}
}
retorne $this->Link_ID;
}
? >
Ajustei a posição dos colchetes e adicionei uma chave antes e depois da linha única. Na instrução if do PHP, você não precisa de parênteses se houver apenas uma linha de código, mas se você adicionar mais uma linha de código, um erro ocorrerá imediatamente. Portanto, sugiro que você adicione um colchete para evitar erros ao adicionar código posteriormente.
Antes de alterar o código de conexão, você deve primeiro entender como funciona o connect(). Ele verifica se existe uma conexão no momento. Se não houver conexão, ele cria uma conexão. Antes de cada consulta ao banco de dados, primeiro execute esta função connect(). Infelizmente, ele seleciona o banco de dados apenas na primeira conexão. Se sua página PHP usar mais de um banco de dados, connect() não selecionará outro banco de dados.
Existem algumas maneiras diferentes de alterar o código. Precisamos escolher um método que tenha o menor impacto no PHPLIB e que nos permita exibir o status da conexão do banco de dados quando precisarmos analisar o problema. Precisamos salvar o ID da conexão e o nome do banco de dados fora do PHPLIB. Basta adicionar common.php:
<? php
$db_connection = 0; //ID da conexão com o banco de dados
$db_database = ""; // Status atual do banco de dados? >
A seguir, modificaremos o PHPLIB para armazenar o ID da conexão e o nome do banco de dados nessas variáveis. Você pode definir e usar o mesmo nome de variável em outro código. Ao analisar o problema, caso precise saber qual banco de dados está sendo utilizado, basta inserir o seguinte código na página:
<? php
Print("db_database: " . $db_database . "");
? >
Como podemos fazer com que connect() use essas novas variáveis? Podemos adicionar uma linha no topo:
<? php
{
globais $db_connect, $db_database;
/* Trata os padrões */
? >
Através destes códigos, as novas variáveis podem ser acessadas por connect().
Após definir $db_database, adicione:
<? php
função db_connect($db_connect_host="", $db_connect_user="",$db_connect_pass="") {
globais $db_connect;
if(!empty($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user, $db_connect_pass);
}
return($db_connect);
}
função db_database($db_database_new="") {
globais $db_database;
if(!empty($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
return($db_banco_dados);
}
? >
Contanto que você defina essas funções públicas uma vez, poderá usar essas variáveis públicas em locais diferentes sem adicionar declarações globais. A seguir estão as funções públicas usando a função db acima:
<? php
function connect($BancoDeDados = "", $Host = "", $Usuário = "", $Senha = "") {
/* Manipula a conexão padrão */
if ("" == $BancoDeDados) {
$BancoDeDados = $este->BancoDeDados;
}
if ("" == $Host) {
$Host = $this->Host;
}
if ("" == $Usuário) {
$Usuário = $este->Usuário;
}
if ("" == $Senha) {
$Senha = $esta->Senha;
}
/* Estabelece conexão e seleciona banco de dados */
if (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
if (!$this->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) falhou.");
retornar 0;
}
}
if (0! = db_connect()) {
if($Banco de dados != db_database()) {
$this->Banco de Dados = db_database($Banco de Dados))
if(empty($this->Banco de dados)) {
$this->halt("não é possível usar banco de dados " . $this->Database);
retornar 0;
}
}
}
retorne $this->Link_ID;
}
? >
Preste atenção nas seguintes alterações:
O teste do banco de dados é separado do teste da conexão, de forma que mesmo que connect() tenha uma conexão atual, ele ainda pode verificar se deve mudar para outro banco de dados. Isso significa que db_connect() se compara a 0 duas vezes mais que antes, mas esse processamento extra é necessário.
Mantemos a conexão e a seleção do banco de dados fora do PHPLIB para que você possa usar a mesma função de seleção de banco de dados em qualquer lugar do seu código PHP.
No entanto, há uma limitação do processamento atual. Aqui assumimos que o mesmo host, usuário e senha são usados para todos os bancos de dados. Se o seu banco de dados tiver permissões diferentes para usuários diferentes, você deverá estabelecer uma conexão especial para acessá-lo. Como? Basta definir as seguintes variáveis:
<? php
$db_host = "";
$db_user = "";
$db_pass = "";
? >
Ao estender a função db_database(), compare o usuário e host atuais com um determinado usuário e host. Você também pode adicionar:
<? php
$db_type = "";
? >
Esta variável é usada para armazenar o tipo de banco de dados, mysql ou Oracle, etc. Desta forma você pode acessar vários bancos de dados.
Mas alterar o código para lidar com vários tipos diferentes de bancos de dados é bastante complicado. Você também deve alterar a função de consulta, bem como as funções de junção e seleção. Você pode conectar-se via ODBC do PHP e usar as opções ODBC do PHPLIB para lidar com isso. ODBC lida com vários bancos de dados de maneira comum, por isso será mais lento. ODBC permite usar o mesmo código para lidar com vários tipos diferentes de bancos de dados. Mas haverá problemas quando for necessário usar datas em diferentes formatos de processamento, e também haverá algumas diferenças estranhas entre os bancos de dados. ODBC apenas simplifica a conexão, mas não modifica a forma como o banco de dados interpreta os dados e o SQL.
Agora vamos aprender como redefinir uma classe de objeto. A função connect() é encapsulada em uma definição de classe:
<? php
classe DB_Sql {
}
? >
Quando copiamos esta função para common.php, devemos redefinir a classe DB_Sql. Podemos encapsular connect() assim:
<? php
classe db_DB_Sql estende DB_Sql {
}
? >
Para saber mais sobre o funcionamento de "extends", podemos dar uma olhada na seção sobre objetos e classes na documentação do PHP. Simplificando: qualquer definição na extensão substitui e substitui todas as definições anteriores.
db_DB_Sql agora pode ser usado. Ao configurar o PHPLIB, você faz a seguinte instrução:
<? php
$x = novo BD_Sql;
? > Altere para: <? php
$x = novo db_DB_Sql;
? >
Desta forma você pode usar a classe modificada em vez da anterior.
Quando ocorre um erro ao conectar-se ao banco de dados, você pode gerar o status atual da conexão em uma função externa. Se ocorrer um erro na instrução SQL, você também pode copiar a função query() em DB_Sql para db_DB_Sql em common.PHP e, em seguida, inserir uma instrução de saída para ver qual é a instrução SQL atual.
Você também pode gravar informações de erro ou diagnóstico em um arquivo de disco. Ao definir
$db_log_file = "t:/diag.txt"
; Se estiver usando o Windows, você precisa ter certeza de que o diretório existe, caso contrário você receberá uma mensagem de erro.
Em seguida, defina uma função:
<? php
função db_log($db_log_message) {
globais $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, data("Y md H:i:s")." ".$db_log_message."rn");
fclose($db_log_f);
}
? >
Onde precisar registrar informações, adicione o seguinte código:
<? php
db_log("banco de dados atual: ". db_database());
? >
Na verdade, você pode usar arquivos de log integrados ou do sistema. Mas então você precisa encontrar uma pequena informação em vários arquivos. Portanto, este arquivo de log separado ajuda você nos testes. Sugiro escrever o seguinte código antes e depois da gravação:
<? php
db_log("banco de dados atual: ". db_database());
db_database("catálogo de livros");
db_log("banco de dados atual: ". db_database());
? >
Ao acessar os dados, lembre-se de utilizar o banco de dados correto e não o banco de dados definido no PHPLIB. Você pode criar uma função wrapper para o banco de dados ou alterar a função usada. Se você usar mysql_query(), você pode usar db_database() primeiro, você pode usar
<? php
$resultado = mysql_db_query(db_database("bookcatalogue"), "selecionar * de?",
db_connect());
? > que sugere a função: <? php
função db_query($db_query_database, $db_query_sql) {
return(mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
? >
em vez de
<? php
db_database("catálogo de livros");
$resultado = mysql_query("selecionar * de?", db_connect());
? Agora
você pode fazer isso
. Use PHPLIB (ou software similar) para acessar vários bancos de dados.
.extend classe/objeto
.Inserir testes de diagnóstico
.Criar arquivos de log