+1

Ampliando as possibilidades do PHP com componentes COM

criado por Daniel Melo em 29/09/2002 11:15pm
Antes de examinar o suporte PHP ao COM, precisamos entender um pouco mais como os componentes COM oferecem serviços a outros softwares.

Atualmente, a maioria dos softwares comerciais para Windows são construídos como uma coleção de componentes COM. Isto significa que estes softwares não são apenas um arquivo executável e algumas bibliotecas DLL convencionais, e sim um ou mais executável COM e um conjunto de bibliotecas COM (ou ActiveX). Estes componentes podem prover serviços para o próprio software e para outros softwares. "Para que ter trabalho formatando relatórios se o Word pode fazer isto para voce" ?

O modelo de componentização COM, diz que componentes COM devem prover serviços através do modelo de objetos. De fato, este componentes provêm serviços expondo uma ou mais classes para outras aplicações. Os softwares clientes então podem instanciar uma destas classes e utilizar os serviços desta classe, chamando os métodos publicados. O conjunto de classes oferecidos por um componente COM é chamada de "Type Library".

Como exemplo, o componente Word provem muitas classes, dentre elas está a classe "Document", que provem metodos para edição de documentos.

Agora vamos examinar como scripts PHP podem instanciar classes de um componente COM. O primeiro exemplo vai utilizar o componente ADO DB (Active Data Objects) de acesso a banco de dados, o mesmo utilizado por softwares escritos em Visual Basic e ASP.

O exemplo que será analizado passo a passo a seguir, fará uma conexão ADO, através de ODBC, a um banco de dados Access. Para testar este exemplo, crie um alias ODBC chamado "testecom" que se refere a um banco de dados access com uma tabela "exemplo", com os campos nome (texto) e idade (numerico).

<?php
$Conexao = new COM("ADODB.Connection");

$Conexao->Open("testecom");
?>

Neste momento estamos fazendo uma instancia da classe "Connection" do componente ADODB. A classe "Connection" é uma das muitas classes existentes na Type Library do ADODB. Como o próprio nome já remete, esta classe gerencia as conexões com os bancos de dados. Logo em seguida, chamamos o método "Open", que recebe como parâmetro o alias ODBC que criamos.

<?php
$RecordSet = $Conexao->execute("SELECT * FROM exemplo");
?>

Como estamos realizando uma operação de consulta, que logicamente retornará registros, precisamos de um objeto do tipo "RecordSet". O Recordset é retornado no método "execute" do objeto conexão. Se o comando SQL não retornasse registros, como um comando "INSERT", então o método "execute" não retornaria nada, e obviamente não precisariámos de um "RecordSet".

É importante notar que o objeto "RecordSet" retornado é uma instância da classe "ADODB.RecordSet" e oferece muitos serviços.

<?php
while (!$RecordSet->EOF) {
   echo "Nome  : ".$RecordSet->fields['nome']->value."<br">;
   echo "Idade : ".$RecordSet->fields['idade']->value."<br">;
   echo "<p>";
   $RecordSet->movenext();
}
?>

Neste trecho, estamos percorrendo usualmente o "RecordSet" e retornando os campos "nome" e "idade". Observe que é necessário chamar o método "movenext" para avançar o ponteiro para o próximo registro, ao contrário ficariámos mostrando o primeiro registro eternamente!.

<?php
$Conexao->Close();
?>

Agora, chamamos o métodos "Close" do objeto "Connection", para fechar a conexão. É realmente, bem simples e direto.

Algumas pessoas podem estar questionando : "Porque usar o componente ADODB, se eu posso utilzar funções odbc nativas do PHP?" . Na verdade, este foi apenas um exemplo bem simples. O componente ADO DB é bastante poderoso. O ADO DB oferece acesso uniforme a muitos bancos de dados, com OU SEM ODBC (Sim, você pode fazer acesso SEM ODBC com o ADO, é bem simples), além de contar com recursos de "Prepared Statements" e outra funcionalidades. Verifique a documentação do ADO em http://www.microsoft.com/data/ , ou peça ajuda ao seu programador VB/ASP preferido, pois tudo que ele pode fazer, você também pode fazer no PHP! Voces estão utilizando o mesmo componente!

Vamos continuar a examinar e exemplificar o uso de componentes COM no PHP ...

Comentários:

Mostrando 1 - 10 de 18 comentários
Tenho uma aplicação em PHP rodando em servidor linux, entretanto preciso em determinado momento, fazer um upload de um MDB, direto da maquina do usuario que esta em ambiente windows e inseri-lo no mysql que esta em servidor linux. É possivel fazer isso?
13/03/2006 4:09am (~18 anos atrás)

José Walter disse:
Tenho lido diversos artigos de exportação de dados do MySql+PHP para aplicativos Microsoft... alguém pode me informar como fazer esta exportação para planilhas e textos do OpenOffice?
05/02/2005 11:45pm (~19 anos atrás)

O PHP4 suporta CORBA, basta baixar a extensão Universe em http://universe-phpext.sourceforge.net. Esta extensão funciona muito bem.
O PHP5 ainda não suporta CORBA, mas estou criando uma extensão CORBA para PHP5. Você pode verificar em http://phporb.sourceforge.net.
17/01/2005 6:50am (~19 anos atrás)

Valmirez disse:
Acho que o ASP é 100% compatível
ao suporte COM porque é nativo da plataforma
17/10/2003 5:31am (~20 anos atrás)

darksaj disse:
assim... eu to migrando um site d asp para php.
para fazer a conecção com o banco de dados eu preciso usar o php d um servidor linux, mas o banco de dados é access.
eu usava a classe COM, mas n estava dando certo pq essa classe soh funciona em servidores windows!
será q alguem sabe com incluir essa classe no linux, ou c ha alguma outra classe para que eu possa usar???

obrigado!!!
24/07/2003 1:16pm (~21 anos atrás)

Bem,
finalmente consegui!!! Caminhei pelas dicas do Daniel sobre a Classe VARIANT, e após cansativos teste... consegui capturar um valor passado por referencia.
Exemplo: (copie e cole ...)

<?
$Comp = new COM("MeuComponente");

/* Metodo SOMAR

Parametros INPUT: value1, value2: Integer
PArametros OUTPUT: soma: OLEVARIANT; */

/* Sua implementação (em Delphi) segue abaixo:
Soma := 'O valor da soma é : IntToStr((Value1 + Value2)); */

/* Podemos passar os parametros de input tanto desta forma: */
$Value1 = new Variant(8, VT_INT);
$Value2 = new Variant(1000, VT_INT);
/* Como desta: */
$Value1 = 8;
$Value2 = 1000;
/* Que Funciona corretamente; */

/* Passa-se o Parametro de OUTPUT assim: */
$soma = new Variant;

/* Simplesmente isso... vc pode colocar um tipo para este VARIANT como VT_INT,
VT_BSTR, VT_VARIANT e funciona também. Por isso, realizei o teste sem passar
nenhum tipo e funcionou tb! ;) */

/* Feito isso, é só executar o método */

$Comp->Somar($Value1, $Value2, $soma);

/* E escrever na tela o valor de $soma...*/

echo $soma->value;

/* O Resultado mostrado na tela é :

O valor da soma é : 1008 */
?>

Prontinho... A grande sacada é o configurar o parametro de OUTPUT no seu componente como:
"OLEVARIANT".

Espero que seja util pra vcs...

Obrigado!!! Valeu a "luz" do Daniel e muito!!!! ehehehehe

Falow!!!

João Paulo Souza (JPSouza) - "A perfeição pode ser utópica, porém, deve ser uma tendência."
09/01/2003 3:35pm (~21 anos atrás)

Daniel,
valeu a dica... Mas até agora só o que recebo é "Warning: Invoke() failed: Tipo não correspondente". E olha que já fiz diversos testes alterando o tipo do VARIANT tanto no PHP como no componente COM. E sempre é isso... :(
Vou tentar mais... se conhecer alguem que já tenha passado por isso e conseguiu solução... me avise por favor...
E para outros que queiram me ajudar... agradeco desde já... Esta parece ser uma questao complicada... nao???

Falow
09/01/2003 1:21pm (~21 anos atrás)

Daniel Melo disse:
Eu já li que existe uma forma, mas eu confesso que pessoalmente nunca testei.

Se funcionar poste uma mensagem...

Se voce quiser passar um parametro por referencia para um componente COM, e necessario que a variavel seja do tipo Variant.

Como nao existe este tipo no PHP, existe uma classe Variant, para representar este tipo de dado.

O exemplo seria o seguinte:

$soma = new VARIANT(0, VI_4|VT_BYREF);
...
$comp->Somar(1,2,$soma);

O resultado estaria em : $soma->value;

VI_4 é uma constante que diz que a variável espera um inteiro de 4 bytes. Voce tem que ver na interface de seu componente, qual o tipo de dado que ele vai retornar e usar a constante adequada, senao pode dar type mismatch.

A lista das constantes voce encontra no manual PHP :

http://www.php.net/manual/en/class.variant.php

Saudacoes,

Daniel
03/01/2003 8:08pm (~21 anos atrás)

Valeu, então meus planos acho que foram por água abaixo...hehe...

Mas olha só, agora não tem muito a ver com o PHP, o excel consegue se conectar em um servidor com MySQL usando VB? Acho que sim né...

Não tem jeito mesmo, vou ter que aprender um pouco de VB.
28/11/2002 8:53pm (~21 anos atrás)

Daniel Melo disse:
A maquina que é o servidor WEB tem que SER obrigatoriamente Windows e ter o Excel instalado.

A maquina quem tem o arquivo Excel pode ser ate Linux. Basta o servidor Windows acessar uma pasta compartilhada no servidor Linux.
26/11/2002 3:40pm (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)