miércoles, 22 de febrero de 2012

HOW-TO: Como conectar php5 y MS SQL Server usando ODBC desde GNU/Linux Debian y/o Ubuntu.

Quieres realizar una conexión con php para visualizar, ejecutar y/o actualizar datos de una BD Microsoft SQL Server desde un servidor GNU/Linux Debian o Ubuntu, acá los pasos para realizarlo.

1. Instala vía apt-get o aptitude los siguientes programas:

1.1 sudo apt-get install php5-odbc
php5-odbc: Modulo ODBC para php5.

1.2 sudo apt-get install unixodbc unixodbc-dev freetds-dev sqsh tdsodbc
unixodbc: Biblioteca de herramientas ODBC.
unixodbc-dev: Bibliotecas ODBC para unix.
freetds-dev: MS SQL and Sybase client library (static libs and headers).
sqsh: cliente de SQL en línea de órdenes para servidores MS SQL y Sybase
tdsodbc: Controlador ODBC para conectar servidores MS SQL y Sybase

1.3 sudo aptitude install unixodbc-bin
unixodbc-bin: Herramientas gráficas para la gestión y navegación por ODBC.

Nota: Si por algún motivo te da error al descargar e instalar el paquete sqsh en tu equipo por "error al descargar el paquete "libct4", descargalo desde el repositorio de tu distribución GNU/Linux e instalalo 1ro de esta forma:
dpkg -i libct4_0.82-7_i386.deb. Luego, instala sqsh.

2. Al instalar todos los paquetes, agrega al final del archivo /etc/freetds/freetds.conf las siguientes lineas:

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

Donde, [sqlserver] es el nombre que le estás dando a la conexión freetds, host es la ip del servidor MS SQL Server, port es el puerto de comunicación MS SQL Server y tds version es la versión de tds usada. Para el caso de MS SQL Server 2005, el tds version corresponde a 8.0
ProductTDS VersionComment
Sybase before System 10, Microsoft SQL Server 6.x4.2Still works with all products, subject to its limitations.
Sybase System 10 and above5.0Still the most current protocol used by Sybase.
Sybase System SQL Anywhere5.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.07.0Includes 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 20007.1Include support for bigint (64 bit integers), variant and collation on all fields. Collation is not widely used.
Microsoft SQL Server 20057.2Includes support for varchar(max), varbinary(max), xml datatypes and MARS[a].
Microsoft SQL Server 20087.2 (unchanged) 
Notes:

3). Prueba de conexión vía sqsh:
sqsh -S sqlserver -U el_usuarioBD -P el_passwordBD
sqsh -S 192.168.1.1 -U el_usuarioBD -P el_passwordBD



3.1) Prueba de select (En el prompt de sqsh):
    sqsh-2.1 Copyright (C) 1995-2001 Scott C. Gray
This is free software with ABSOLUTELY NO WARRANTY
For more information type '\warranty'
1> select * from bd.dbo.tabla
2> go
 id_primer   descripcion                                   mensaje                                       es_fijo   
    passport                                    
 ----------- --------------------------------------------- --------------------------------------------- -----------
    ---------------------------------------------
           1 Mensaje Personalizado                         |s|                                                     0
    1                                           
           2 Mensaje fijo                                  Mensaje fijo                                            1
    1                                           
           3 Mensaje con 2 parametros                      Mensaje |s| y |s|                                       0
    1                                           

(3 rows affected)
1>

5). Agregar el siguiente contenido al archivo /etc/odbc.ini:
[datasourcename]
Driver = FreeTDS
Description  = ODBC connection via FreeTDS
Trace = No
Servername = sqlserver
Database = mb_sms

Donde "[datasourcename]" es el nombre de la entrada que se está configurando, "Servername" es el nombre de la entra freetds configurada en el archivo /etc/freetds/freetds.conf y "Database" es el nombre de la bd en MS SQL Server a la cual deseo realizar la conexión.

6). Agregar el siguiente contenido al archivo /etc/odbcinst.ini:
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
CPTimeout =
CPReuse =
FileUsage = 1

7). Realiza un test de conexion usando isql:
isql -v datasourcename el_usuarioBD el_passwordBD

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

7.1) Prueba de select (En el prompt de isql):
    use bd
    select * from tabla

SQL> select * from tabla
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id_primer  | descripcion                                                                                                                                                                         | mensaje                                                                                                                                                                             | es_fijo    | passport                                                                                                                                                                            |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1          | Mensaje Personalizado                                                                                                                                                               | |s|                                                                                                                                                                                 | 0          | 1                                                                                                                                                                                   |
| 2          | Mensaje fijo                                                                                                                                                                        | Mensaje fijo                                                                                                                                                                        | 1          | 1                                                                                                                                                                                   |
| 3          | Mensaje con 2 parametros                                                                                                                                                            | Mensaje |s| y |s|                                                                                                                                                                   | 0          | 1                                                                                                                                                                                   |
+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns 3
3 rows fetched
SQL>

8). Por ultimo, ya puedes usar el origen de datos configurado [datasourcename] en PHP:
$connection = odbc_connect(‘datasourcename’, ‘username’, ‘password’);
if (!$connection) die(“Connection failed”);
else echo “works”;

1 comentario:

  1. Segui los pasos, y al final me salio este error

    Connection Failed:[unixODBC][Driver Manager]Can't open lib '/usr/lib/odbc/libtdsodbc.so' : file not found

    ResponderEliminar