Acessando um Microsoft SQL Server 2000 via Apache+PHP+FreeTDS

Ricardo Iramar dos Santos - Agent Smith
19/01/2004 - Versão 0.1

Introdução

Hoje em dia é mais do que comum encontrar ambientes com sistemas mistos. A solução para servidores de arquivos coabitando em ambientes mistos mais conhecido sem dúvida é o SAMBA.

Mas existem outras serviços que também precisam conversar em ambientes mistos, tais como servidores de base de dados e servidores web. Uma solução de fácil implementação é o FreeTDS que cumpri muito bem seu papel e fornece uma rica documentação em seu site oficial.

Esta documentação descreve resumidamente como conectar uma máquina GNU/Linux rodando Apache+PHP+FreeTDS a um servidor Microsoft com SQL 2000. Subentendesse que você já tenha o Apache+PHP instalados corretamente.

Os procedimentos abaixo foram escritos baseados em uma máquina rodando Slackware 9.1 mas pode ser facilmente adaptada a qualquer outra versão do Slackware ou distribuição.

Hey Ho Let's Go!

Pré-requisitos

- Source do FreeTDS (última estável)

- Source do PHP 4.3.3

Instalando

Primeiramente precisamos instalar o FreeTDS.

  	agent@zion:~/src/FreeTDS$ wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
  	agent@zion:~/src/FreeTDS$ tar zxvf freetds-stable.tgz

Um diretório no formato freetds-X.YY.Z será criado onde X.YY.Z corresponde a última versão estável do FreeTDS. Nada data em que escrevi esta documentação era freetds-0.61.2.

  	agent@zion:~/src/FreeTDS$ cd freetds-0.61.2
  	agent@zion:~/src/FreeTDS/freetds-0.61.2$ ./configure --prefix=/usr/local/freetds --with-tdsver=8.0 --enable-msdblib --enable-dbmfix --with-gnu-ld --enable-shared --enable-static

A opção --with-tdsver define a versão padrão do protocolo utilizado pelo FreeTDS. Segue uma tabela retirada da documentação do FreeTDS para auxiliar na escolha.

Product TDS Version Comment
Sybase before System 10, Microsoft SQL Server 6.x 4.2 Still works with all products, subject to its limitations.
Sybase System 10 and above 5.0 Still the most current protocol used by Sybase.
Sybase System SQL Anywhere 5.0 only Originally Watcom SQL Server, a completely separate codebase. Our best information is that SQL Anywhere first supported TDS in version 5.5.03 using the OpenServer Gateway (OSG), and native TDS 5.0 support arrived with version 6.0.
Microsoft SQL Server 7.0 7.0 Includes support for the extended datatypes in SQL Server 7.0 (such as char/varchar fields of more than 255 characters), and support for Unicode.
Microsoft SQL Server 2000 8.0 Include support for bigint (64 bit integers), variant and collation on all fields. FreeTDS support for 8.0 is new. Variant are not supported, collation is not widely used. Use TDS 7.0 (or 4.2) if you experience problems.

As demais opções você pode consultar o help do configure (./configure --help). Agora vamos compilar e instalar.

  	agent@zion:~/src/FreeTDS/freetds-0.61.2$ make
  	agent@zion:~/src/FreeTDS/freetds-0.61.2$ su
  	agent@zion:/home/agent/src/FreeTDS/freetds-0.61.2# make install
  	agent@zion:/home/agent/src/FreeTDS/freetds-0.61.2# exit

Com o FreeTDS instalado precisamos configurá-lo através do arquivo freetds.conf. Edite o arquivo /usr/local/freetds/etc/freetds.conf e insira uma seção com os dados de seu servidor Microsoft SQL 2000. Exemplo:

  [MSSQL2K]
         host = 192.168.1.1
         port = 1433
         tds version = 8.0

O arquivo freetds.conf é todo comentado com vários exemplos.

Teste sua instalação com o seguinte comando:

  	agent@zion:/usr/local/freetds/bin$ ./tsql -S MSSQL2K -U sa
  	locale is "en_US.ISO8859-1"
  	charset is "ISO-8859-1"
  	Password: senhadosa

Se rotornar um prompt neste formato "1>" seu FreeTDS foi instalado corretamente, caso contrário revise os passos acima e faça tudo novamente.

Agora falta pouco, só recompilar e reinstalar o PHP.

  	agent@zion:~/src/PHP$ wget ftp://ftp.slackware.com/pub/slackware/slackware-9.1/source/n/php/php-4.3.3.tar.bz2
  	agent@zion:~/src/PHP$ tar jxvf php-4.3.3.tar.bz2
  	agent@zion:~/src/PHP$ cd php-4.3.3
  	agent@zion:~/src/PHP/php-4.3.3$ ./configure [opções] --with-sybase-ct=/usr/local/freetds
  	agent@zion:~/src/PHP/php-4.3.3$ make
  	agent@zion:~/src/PHP/php-4.3.3$ su
  	agent@zion:/home/agent/src/PHP/php-4.3.3# make install
  	agent@zion:/home/agent/src/PHP/php-4.3.3# exit

Na linha "./configure [opções] --with-sybase-ct=/usr/local/freetds" subtitua [opções] pelas opções a qual o PHP havia sido compilado. Se você não lembra, sabe ou tem o config.log crie um arquivo phpinfo.php com o conteúdo "<? phpinfo() ?>" e acesse o mesmo pelo browser para ver estas opções.

No Slackware 9.1 o PHP 4.3.3 foi compilado com suporte a imap e imap-ssl, se você não for utilizar estes recursos não inclua essas opções no ./configure, caso contrário você irá prcisar do source do PINE 4.58. Veja como o tio Patrick compila o PHP 4.3.3 para Slackware 9.1 no arquivo ftp://ftp.slackware.com/pub/slackware/slackware-9.1/source/n/php/php.build.

Conclusão

Você não precisa ficar amarrado aos produtos da Microsoft só por estar utilizando o Microsoft SQL. Infinitas possibilidades de utilização do Microsoft SQL com PHP rodando em uma máquina GNU/Linux e até mesmo com outras aplicações integradas. Segue um exemplo de como se conectar ao Microsoft SQL Server tomando como base o exemplo do freetds.conf acima citado.

  <?php
  	$con = mssql_connect( "MSSQL2K", "sa", "senhadosa" ) or die ("Falha ao conectar.");
  	mssql_select_db( "BASEDEDADOS" ) or die ("Falha ao selecionar a base de dados.");
  	$sql = "SELECT * FROM Tabela";
  	$rs = mssql_query( $sql, $con );
  	while( $row = mssql_fetch_array( $rs ) )
  	{
  		$campo1 = $row[ "campo1" ];
  		$campo2 = $row[ "campo2" ];
  		echo( "
  			Campo 1: $campo1<br>
  			Campo 2: $campo2<br>
  		" );
  	}
  	mssql_close( $con );
  ?>

Referências

- http://www.freetds.org

- http://www.php.net

- TaQ Server

- Accessing a Microsoft SQL Server database from PHP running under Linux


Dúvidas, críticas e sugestões devem ser enviadas para ricardo.iramar@gmail.com.

Quer saber mais um pouco sobre o autor desta documentação? Acesse minha home page em http://ricardo-iramar.com.