CONEXÃO PROGRESS 9 com PHP4 Criação da apostila: 20/08/2002 Nesta apostila, vou detalhar como pode ser feita a conexão do PHP4 com o Progress. Para isto, será necessário criar o seguinte ambiente: • SERVIDOR WINNT4 ou WIN2000Server; • IIS – Internet Information Server (versão 4 ou maior); • Banco de Dados Progress 9.1C; • Não necessita do client do banco instalado no servidor. Este é o ambiente utilizado para os testes, mas deve funcionar com algumas variações na versão do Banco de Dados (9.x) e com o Servidor de Internet APACHE para Windows. Aliás, segundo artigos de consultores, o APACHE rodando sobre o Windows é muito mais seguro que o próprio IIS da Microsoft. Mas uma boa configuração no IIS resolve todos os problemas. Instalando o PHP4 no Windows No site oficial do PHP (http://www.php.net/) você vai encontrar a versão mais recente do PHP4. No entanto, a versão distribuída por esse site é uma instalação básica e não dá suporte a todos os recursos do PHP. Recomendo então que vá ao endereço http://php4win.de/ e faça o download da última versão estável do PHP4. Normalmente, o link para o donwload do php neste site fica no canto superior direito da página. Deve ter aproximadamente 6MB. Se o arquivo baixado não tiver nenhuma extensão, renomeie o mesmo adicionando .exe no final. A seguir crie um diretório chamado c:\php e copie o arquivo que você fez o download para dentro deste diretório no servidor. Execute-o, ou descompacte-o dentro deste diretório. Feito isto, o diretório c:\php agora conterá diversos subdiretórios e alguns arquivos de texto. Também conterá uma arquivo chamado php.exe, que não será utilizado. Ao invés disto utilizaremos o arquivo php4ts.dll que está neste mesmo diretório. Copie este arquivo .dll para dentro de C:\WINNT\System32. Agora abra o subdiretório dlls e copie todos os arquivos contidos nesta pasta para dentro de C:\WINNT\System32. Se já existirem algum destes arquivos neste diretório, não substitua. Mantenha a versão anterior. Dentro do diretório C:\php deve haver um arquivo chamado de php.inirecommended. Copie-o para dentro de C:\WINNT com o nome php.ini. Se este arquivo não existir, deve existir um outro com o nome de php.ini-dist. Copie-o para dentro de C:\WINNT com o nome php.ini. Abra este arquivo com o Bloco de Notas e role o documento para baixo até encontrar uma linha como a seguinte e deixe-a como abaixo: extension_dir = c:\php\extensions; Certifique-se de que este caminho é o correto para o diretório extensions da instalação.do PHP4 descompactada. Se não for altere a linha acima para apontar para o lugar certo. O diretório extensions contém várias DLL’s cujo o nome começam com php_. Pronto, o PHP4 está instalado. Agora é só configurar o IIS. APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Configurando o IIS – Internet Information Server Inicie o Internet Services Manager. No Windows NT, você irá encontrá-lo em Wndows NT 4.0 Option Pack em seu menu Iniciar. No Windows 2000, ele estará em Iniciar > Programas > Ferramentas Administrativas. Segue Figura1 do Gerenciador de Serviços. Figuras 1Internet Information Services Clique com o botão direito do mouse sobre Site da Web padrão e acione suas propriedades. Deverão ser feitas duas alterações. Primeiro, vamos registrar o filtro ISAPI PHP4. Clique na guia Filtros ISAPI. Clique em seguida no botão Adicionar e crie um novo filtro com o nome de PHP – Figura 2. Na pasta dos arquivos PHP que foi feito o donwload existe um filtro ISAPI PHP no diretório sapi, com o nome de php4isapi.dll. Coloque o caminho correto para o arquivo php4isapi.dll (deve estar no diretório C:\php\sapi\php4isapi.dll). APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Figuras 2 APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. A seguir, precisaremos informar ao IIS a que arquivos aplicar o filtro PHP4. Este filtro deverá ser aplicado a todos os arquivos que terminem em .php que é a extensão padrão dos arquivos do PHP4. Para isto, vá para a guia “Pasta base” - Figura 3. Figuras 3 APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Em seguida Clique no botão “Configuração...” - Figura 4. Figuras 4 Clique no botão “Adicionar” e na tela que será aberta, especifique o caminho para php4isapi.dll. Informe ao IIS para aplicar este filtro aos arquivos .php como indica a Figura 5. Depois clique em “Ok”. Figuras 5 APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Agora, será preciso reiniciar completamente o IIS. A melhor maneira de encerrar completamente o IIS é restartá-lo é fazê-lo em uma janela de prompt de comando. Abra uma janela de prompt de comando e digite os seguintes comandos: Para parar o IIS: net stop iisadmin Ao aparecer a pergunta “Deseja continuar a operação? (S/N) [N]:” confirme com um “s”. No final de todo o processo, será mostrado várias mensagens de finalização com êxito. Para reiniciar o IIS: net start w3svc Se a mensagem no final relatar que o serviço foi inicializado com êxito, tudo está correto e você terá agora o PHP4 totalmente instalado. Você deve lembrar-se sempre que o diretório raiz do seu site web é por default C:\Inetpub\wwwroot. É dentro deste diretório que você vai colocar mais tarde todos os seus scripts php e páginas html do seu site. Testando a instalação do PHP4 Agora, vamos fazer um teste no php para ter certeza que ele está interpretando os scripts corretamente. Para isso, crie um arquivo no Bloco de Notas ou em qualquer outro editor de texto e digite os comandos como mostra a Figura 6. Figuras 6 Salve este arquivo no diretório padrão C:\Inetpub\wwwroot\ com o nome teste.php. O Bloco de Notas tem como padrão, acrescentar a extensão .txt em todos os arquivos feitos nele. A maneira mais simples de controlar isto é sempre colocar o nome do arquivo entre aspas duplas na hora de salvar. Ex.: “teste.php”. Agora no seu servidor, abra o browser (navegador web) e digite o seguinte endereço: http://localhost/teste.php. Se o arquivo tiver sido salvo no diretório correto e a instalação do PHP4 estiver correta, deve aparecer uma página com diversas informações referentes ao PHP, como mostra a figura 7. APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Figuras 7Página de teste do php APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Configurando o DSN – Data Source Name no Windows Depois de instalado e configurado o PHP4, supondo que você já tenha instalado o Progress 9.x, resta somente configurar um Data Source Name para que o driver ODBC execute a conexão com o Banco de Dados, configuração esta que será detalhada abaixo. Antes de começar a configurar o DSN, vá até o arquivo SERVICES do Windows, que normalmente fica localizado em C:\WinNT\System32\Drivers\etc e se ainda não foi criado, crie um serviço para a sua base de dados Progress. Ex.: dbprodsv 2050/tcp. Este serviço será usado na configuração do Data Source para a conexão do banco pelo ODBC. Abra agora o Painel de Controle do Windows, e dê duplo-clique no ícone “Ferramentas Administrativas”. Em seguida dê duplo-clique no ícone “Fontes de Dados ODBC”. A tela “ODBC Data Source Administrator” será aberta (Figura 8). Vá então até a guia “System DSN” e clique no botão “Add”. Na tela que se abre, escolha o Driver ODBC do Progress e em seguida clique em “Concluir” (Figura 9). Figuras 8Administrador de Fontes de Dados ODBC APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Figuras 9 Agora é só preencher os dados do Data Source de acordo com a instalação do Progress como mostra a Figura 10. Figuras 10 APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Os campos devem conter os seguintes valores: Data Source Name: Um nome qualquer para para o data source. Este nome vai ser utilizado no script PHP para fazer a conexão; Host Name: O endereço IP do servidor ou localhost; Port Number: O número do serviço criado para o banco no arquivo Services do Windows; Database Name: O Nome do banco de dados a ser acessado; User ID: Se o seu banco não tiver nenhum usuário cadastrado, deve ser colocado o usuário que se logou no servidor NT. O Progress toma como default o usuário do windows que criou o banco. Depois de preenchido todos os campos, clique no botão “Test Connect”para testar a conexão. Será aberta uma nova janela com os dados do Data Source faltando somente preencher o campo Password (Figura 11). No campo Password, coloque a senha do usuário que você utilizou para se logar no Windows e clique em seguida em Ok. Neste momento o seu banco de dados deve estar no ar. Se der uma mensagem de erro do tipo 1114, feche todas as janelas, baixe o banco de dados, reinicie a máquina e repita todo este processo. Figuras 11 APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Fazendo um script PHP para conexão com o Progress 9 Agora, despois de tudo estar devidamente instalado e configurado, vamos fazer um script básico que se conecta no Progress, e executa uma instrução SQL de seleção de alguns dados de uma tabela. A explicação detalhada sobre as funções PHP usadas no script, podem ser encontradas no Manual do PHP que pode ser baixado gratuitamente na internet no endereço http://www.php.net. Recomendo que você já tenha alguma familiaridade com a linguagem php antes de iniciar os testes com os script's abaixo. Como visto anteriormente, o script PHP pode ser escrito em qualquer editor de texto, tanto gráficos como de linha de comando, desde que salvo com a extensão .php. Vamos utilizar aqui o Bloco de Notas do Windows, mas existem alguns editores de código php freewares que podem ser baixados gratuitamente na internet como o PHP Coder que pode ser baixado em http://www.phpide.de/. No script php existem algumas variáveis que são utilizadas como parâmetros para os comandos sql. Estas variáveis vem de um formulário em html que será o chamador do script. Cada campo do formulário equivale a uma variável do script sendo que o mesmo nome dos campos do formulário são o nome da variável acrescida do $ no início. Se você não quiser fazer um formulário para testar o script, substitua as variáveis por um valor fixo. Ex.: $almox por 12001. Abaixo, vou colocar todo o script e depois faço os comentários das partes mais importantes. ===================== ÍNICIO DO ARQUIVO: cons_estoque.php =================== <html> <head> <title>Consulta de Estoque</title> </head> <body bgcolor="#FFFFE8"> <center> <H3><font color='darkblue' face='Arial'> CONSULTA DE ESTOQUE </font></H3> <HR width='61%'> </center> <?php /* INÍCIO DO SCRIPT PHP */ $conexao = odbc_connect("web", "administrador", "senha" ,SQL_CUR_USE_ODBC) or die("Não pude conectar com o Banco Progress."); if ($conexao) { $resultado = odbc_exec($conexao, "SELECT Nome FROM PUB.Almox WHERE IdAlmox = $almox"); $nomealmox = odbc_result( $resultado, 1 ); $resultado = odbc_exec($conexao, "SELECT Nome FROM PUB.Unicoop WHERE IdUnicoop = $unidade"); $nomeunidade = odbc_result( $resultado, 1 ); $resultado = odbc_exec($conexao, "SELECT Nome FROM PUB.Produto WHERE IdProduto = $produto"); $nomeproduto = odbc_result( $resultado, 1 ); print "<center><table border='0'>"; print "<tr><td width='91'><font color='darkblue' face='Arial' size='2'>Unidade :</font></td>"; printf("<td width='365'><font color='darkblue' face='Arial' size='2'>%s %s</font></td></tr>", $unidade, $nomeunidade); print "<tr><td width='91'><font color='darkblue' face='Arial' size='2'>Almoxarifado:</font></td>"; printf("<td width='365'><font color='darkblue' face='Arial' size='2'>%s - APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. %s</font></td></tr>", $almox, $nomealmox); print "<tr><td width='91'><font color='darkblue' face='Arial' size='2'>Produto :</font></td>"; printf("<td width='365'><font color='darkblue' face='Arial' size='2'>%s %s</font></td></tr>", $produto, $nomeproduto); print "</table><HR width='61%'></center>"; } if ($conexao) { $resultado = odbc_exec($conexao, "SELECT QdeEstoque, QdeDisponivel, CustoMedio, DataUltimaSaida FROM PUB.Estoque WHERE IdAlmox = $almox AND IdUnicoop = $unidade AND IdProduto = $produto"); if ($resultado) { print "<center><table border='0'><tr>"; printf("<th bgColor='darkblue' vAlign='top' width='129' align='center'> <b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Qtd. Estoque" ); printf("<th bgColor='darkblue' vAlign='top' width='100' align='center'> <b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Qtd. Disponível" ); printf("<th bgColor='darkblue' vAlign='top' width='91' align='center'> <b> <font color='white' face='Arial' size='2'>%s </font> </b> </th>", "Custo Médio" ); printf("<th bgColor='darkblue' vAlign='top' width='129' align='center'> <b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Data Última Saída"); while (odbc_fetch_row($resultado)) { print "<tr>"; printf("<td bgColor='lavender' width='129' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 1 )); printf("<td bgColor='lavender' width='100' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 2 )); printf("<td bgColor='lavender' width='91' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 3 )); printf("<td bgColor='lavender' width='129' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 4 )); print "</tr>"; } print "</table></center>"; } } odbc_close($conexao); ?> /* FIM DO SCRIPT PHP */ </body> </html> ===================== FIM DO ARQUIVO ====================================== O Script começa com uma conexão ao banco de dados Progress. A variável $conexão é uma variável lógica que receberá true se a conexão for efetuada com sucesso. Se a conexão não for possível, o comando die se encarregará de mostrar uma mensagem informativa no browser. $conexao = odbc_connect("web", "administrador", "senha" ,SQL_CUR_USE_ODBC) or die("Não pude conectar com o Banco Progress."); APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. Em seguida, é executado um comando select na base para se obter o nome do Almoxarifado. Note que foi colocado a palavra PUB antes do nome das tabelas para que o progress consiga achar a tabela. O resultado é armazenado na variável $nomealmox: $resultado = odbc_exec($conexao, "SELECT Nome FROM PUB.Almox WHERE IdAlmox = $almox"); $nomealmox = odbc_result( $resultado, 1 ); Repete-se o processo para obter o nome da unidade e o nome do produto que serão impressos logo em seguida, utilizando os comandos print e printf. print "<center><table border='0'>"; print "<tr><td width='91'><font color='darkblue' face='Arial' size='2'>Unidade :</font></td>"; printf("<td width='365'><font color='darkblue' face='Arial' size='2'>%s %s</font></td></tr>", $unidade, $nomeunidade); print "<tr><td width='91'><font color='darkblue' face='Arial' size='2'>Almoxarifado:</font></td>"; printf("<td width='365'><font color='darkblue' face='Arial' size='2'>%s %s</font></td></tr>", $almox, $nomealmox); print "<tr><td width='91'><font color='darkblue' face='Arial' size='2'>Produto :</font></td>"; printf("<td width='365'><font color='darkblue' face='Arial' size='2'>%s %s</font></td></tr>", $produto, $nomeproduto); print "</table><HR width='61%'></center>"; O comando print tem o mesmo efeito do echo. Já o comando printf recebe como parâmetro as variáveis que contém os valores que serão mostrados na tela, formatados com %s como na linguagem “C”. Os demais comandos são comandos html simples para formatação dos resultados em tabelas. Esta formatação pode ser feita em um editor de html qualquer como o FrontPage ou Dreamweaver e depois copiados para o script. Logo em seguida, é executado mais um comando SQL na base de dados para pegar as quantidades em estoque. $resultado = odbc_exec($conexao, "SELECT QdeEstoque, QdeDisponivel, CustoMedio, DataUltimaSaida FROM PUB.Estoque WHERE IdAlmox = $almox AND IdUnicoop = $unidade AND IdProduto = $produto"); O resultado retornado será diferente dos comandos executados anteriormente, que só retornavam uma linha como resultado. Este último Select retorna varias linhas e por isso será necessário percorrer cada uma destas linhas para imprimir na tela. while (odbc_fetch_row($resultado)) { print "<tr>"; printf("<td bgColor='lavender' width='129' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 1 )); printf("<td bgColor='lavender' width='100' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 2 )); printf("<td bgColor='lavender' width='91' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result($resultado, 3 )); printf("<td bgColor='lavender' width='129' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. odbc_result($resultado, 4 )); print "</tr>"; } Foi utilizado o comando de loop while juntamente com a função cursor odbc_fetch_row aplicada sobre o resultado do comando sql. Esta função, funciona como um cursor para cada uma das linhas retornadas. Para se obter o valor de cada campo individualmente, foi utilizado a função odbc_result, passando como parâmetro o resultado e o número de ordem do campo na instrução select. A ordem dos campos começa em 1. Note que uma vez feita a conexão com sucesso, será armazenado true na variável $conexao, e esta ficará persistente até o fim do script. Agora que já foi efetuada e impresso todos os comandos, só falta fechar a conexão com o banco de dados como a seguir: odbc_close($conexao); O script php termina com a tag ?>. Obs.: Os comandos html que você vê fora do script php serão processados pelo browser normalmente. Já os comandos do próprio script serão processados pelo servidor e o resultado será retornado para o browser. Se você, por curiosidade mandar exibir o código fonte da tela no browser, você não verá nenhum dos comandos php. Somente serão visíveis os comandos html. Isto funciona como uma segurança, já que no início do script é colocado o usuário e a senha do banco para efetuar a conexão. Esta não é maneira mais segura de se proteger um script, mas este não é o tema debatido agora e por isso não será tratado. Você pode obter mais informações nos manuais do php. O exemplo mostrado acima é um exemplo simples, mas o odbc do progress suporta muitas outras funções que podem ser exploradas e utilizadas, como criação de views, selects mais incrementados, etc. Abaixo, como curiosidade, vou listar um script utilizando a criação de uma view (visão) e em seguida, comandos sql executados sobre esta visão. Em algumas consultas mais complexas, a utilização de views torna a consulta mais rápida, como é o caso do exemplo que será mostrado abaixo, onde é efetuada uma busca por uma palavra no nome do produto. ===================== ÍNICIO DO ARQUIVO: cons_estnome.php =================== <?php //FAZ A CONEXÃO COM O BANCO DE DADOS $conexao = odbc_connect("web", "administrador", "senha" ,SQL_CUR_USE_ODBC) or die("Não pude conectar com o Banco Progress."); if ($conexao) { //EXECUTA A CRIAÇÃO DA VIEW $comando = "CREATE VIEW V_ALMOX AS SELECT Estoque.QdeEstoque, Estoque.QdeDisponivel, Estoque.CustoMedio, Estoque.DataUltimaSaida, Produto.IdProduto, Produto.Nome, Estoque.IdUnicoop FROM PUB.Estoque, PUB.Produto WHERE Estoque.IdProduto = Produto.IdProduto AND Estoque.IdUnicoop = $unidade AND Estoque.QdeDisponivel <> 0"; $res = odbc_exec($conexao, $comando); // SELECIONA TODOS OS REGISTROS QUE CONTENHAM A PALAVRA NO NOME DO PRODUTO APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. $comando = "SELECT * FROM V_ALMOX WHERE Nome LIKE '%$nome%'"; } //EXECUTA O COMANDO SQL SOBRE A VISÃO $resultado = odbc_exec($conexao, $comando); if ($resultado) { //IMPRIME O CABEÇALHO DAS COLUNAS NA TABELA print "<html><head><title>Consulta de Estoque</title></head><body bgcolor='#FFFFE8'>"; print "<center><table border='0'><tr>"; printf("<th bgColor='darkblue' vAlign='top' width='15' align='center'> <b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "UN."); printf("<th bgColor='darkblue' vAlign='top' width='40' align='center'><b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Código"); printf("<th bgColor='darkblue' vAlign='top' width='270' align='center'><b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Nome do Produto"); printf("<th bgColor='darkblue' vAlign='top' width='91' align='center'><b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Qtd. Estoque"); printf("<th bgColor='darkblue' vAlign='top' width='100' align='center'><b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Qtd. Disponível"); printf("<th bgColor='darkblue' vAlign='top' width='91' align='center'><b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Custo Médio"); printf("<th bgColor='darkblue' vAlign='top' width='91' align='center'><b> <font color='white' face='Arial' size='2'>%s </font></b></th>", "Última Saída"); //PERCORRE TODAS AS LINHAS DO RESULTADO while (odbc_fetch_row($resultado)) { //TESTA SE O VALOR DO CAMPO 2 É DIFERENTE DE 0 if (odbc_result($resultado,2) != 0) { print "<tr>"; printf("<td bgColor='lavender' width='15' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result( $resultado, 7 )); printf("<td bgColor='lavender' width='40' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result( $resultado, 5 )); printf("<td bgColor='lavender' width='270' align='left'> <font color='black' face='Arial' size='2'>%s</font></td>", odbc_result( $resultado, 6 )); printf("<td bgColor='lavender' width='91' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result( $resultado, 1 )); printf("<td bgColor='lavender' width='100' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", odbc_result( $resultado, 2 )); //IMPRIME O CAMPO FORMATADO PARA DUAS CASAS DECIMAIS printf("<td bgColor='lavender' width='91' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", sprintf("%0.5f",odbc_result( $resultado, 3 ))); //IMPRIME O CAMPO DATA FORMATADO printf("<td bgColor='lavender' width='91' align='center'><font color='black' face='Arial' size='2'>%s</font></td>", date("d/m/Y",strtotime (odbc_result( $resultado, 4 ) . "\n"))); print "</tr>"; } } print "</table></center>"; APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais. print "</body></html>"; } //DESTRÓI A VIEW QUE FOI CRIADA ACIMA $comando = "DROP VIEW V_ALMOX"; //FECHA A CONEXÃO COM O BANCO DE DADOS $res = odbc_exec($conexao, $comando); } odbc_close($conexao); ?> ===================== FIM DO ARQUIVO ====================================== Como visto até agora, são inúmeras as possibilidades de trabalho com o php. Tendo em vista que o Progress WebSpeed tem um valor muito elevado, esta se torna uma alternativa totalmente gratuita e muito eficiente. Com um pouco de criatividade, podese criar sites para a internet ou intranet totalmente dinâmicos e com os mais variados recursos. Espero que esta apostila tenha cumprido seus objetivos, e que a mesma seja de grande utilidade para todos. Até mais. Diógenes S. Cruz Analista de Sistemas – COCARI. Email: [email protected] APOSTILA GRATUITA. Proibida a reprodução parcial ou total para fins comerciais.