Buenos días, colegas. Este post como una autorespuesta para este hilo que hice hace un par de días.
Mil problemas para conectar PHP con Sql Server
Resulta que ya pude realizar la conexión. El problema era que necesitaba conectar una versión de php 5.3.0 o superior con SQL Server. Hay mucha info en la web de cómo hacerlo pero solo con la versión 5.2.6 del php. Yo necesitaba la 5.3.0 ya que hay métodos mágicos como el __invoke() que solo funcionan a partir de esta versión.
Después de tanto investigar, romperme el coco y hacer algunas pruebas logré hacerlo. Aunque solo con la versión 5.3.0 porque con la versión 5.4.3 no pude (de hecho estoy casi seguro que no se puede)... Lo que hice fue lo siguiente.
Esto está probado solo con el paquete WampServer, problablemente sirva también con el apache y el php por separado.
La versión del php que se debe instalar en el wampserver es la 5.3.0. La versión del WampServer es la 2.2 y la versión del apache es la 2.2.22.
Hay unos paquetes de librerías que proporciona Microsoft que necesitamos. estos se pueden descargar de esta página.
DLL de Microsoft *Descargar SQLSRV20.EXE y no la SQLSRV30.EXE
Deben extraer los ddl en una carpeta cualquiera y copiar los siguientes en la carpeta ext del php
php_sqlsrv_53_ts_vc6.ddl
php_pdo_sqlsrv_53_ts_vc6.ddl
*Recuerden que estas librerías son para la versión segura de PHP 5.3.0, hay otras versiones de estas librerías, pero probé con la php_sqlsrv_54_ts.ddl php_pdo_sqlsrv_54_ts.ddl para el PHP 5.4.3 y no me funcionó.
También recomiendo colocar las siguientes librerías en la misma carpeta
php_pdo.dll php_mssql.dll php_pdo_mssql.dll
También deben incluir estas librerías en el php.ini de la versión del php que se está usando, o sea la 5.3.0. Deben tener habilitadas todas estas extensiones recien agregadas... o sea debe quedar así:
Código:
extension=php_pdo.dll
extension=php_mssql.dll
extension=php_pdo_mssql.dll
;extension=php_sqlsrv_53_ts.dll
;extension=php_pdo_sqlsrv_53_ts.dll
;extension=php_pdo_sqlsrv_53_ts_vc9.dll
;extension=php_sqlsrv_53_ts_vc9.dll
extension=php_pdo_sqlsrv_53_ts_vc6.dll
extension=php_sqlsrv_53_ts_vc6.dll
[sqlsrv]
sqlsrv.LoadSubsystems=-1
sqlsrv.LogServerity=-1
sqlsrv.WarningsReturnsAsErrors=0
Las lineas que están antecedidas por un ; es porque están en comentario, coloco esto para que vean que intenté con otras versiones de las librerías de Microsoft. Solo me sirvieron las que no están comentadas.
Si se fijan también he agregado unas instrucciones para configurar algunos parámetros de la librería, es lo que está a partir del [sqlsrv].
Una vez configurado guardan el archivo. Ahora podrán ver estas nuevas líneas en el menú gráfico de las extensiones mediante el icono del wampserver, deben tildar cada una de las extensiones que acaban de agregar. Cada vez que tilden el servicio se va a reuniciar, sin embargo reinicien cuando terminen de tildar las extensiones.
*Deben asegurarse que están modificando el php.ini correcto (esto por si tienen otras versiones instaladas en el mismo WampServer.
También recomiendo colocar esta librería en C:\Windows\System32:
ntwdblib.dll
Y listo, ya debería estar configurado correctamente...
Para comprobar que efectivamente se estén leyendo las librerías usen un archivo con la función phpinfo(); para ver los detalles...
Una manera fácil de comprobarlo es buscando con el buscador del navegador (Ctrl+F) y buscar "sqlsrv". No estoy seguro pero deberían haber 10 resultados (al menos en mi caso es así). Y deben estar las secciones "pdo_sqlsrv", "sqlsrv", la seeción "PDO"debe estar así: mysql, odbc, sqlite, sqlsrv. Ademas de los otros resultados, pero si aparecen al menos estas secciones y estos resultados probablemente esté todo bien.
Ok, si todo va bien ya podremos realizar las conexión, pero aun queda un detalle, realmente lo que hemos hecho es cambiar las librerías para la conexión, esto quiere decir que hemos configurado el php para usar una nueva extensión de Sql Sever. Como todos sabemos al desarrollar la extensión es mssql_ pero ahora no es así, ahora es sqlsrv_. Un error que estaba cometiendo yo al momento de probar, ya con todo bien configurado, era usar mssql_connect() y me daba error. Y resulta que ahora es sqlsrv_connect.
Viene siendo prácticamente lo mismo... pero como todos saben Microsoft siempre complicando las cosas... Para mas información acerca de las funciones que se tienen que usar ahora visitar
http://php.net/manual/en/book.sqlsrv.php
Yo use este pequeño script para probar la conexión a un servidor de base de datos externo y funcionó correctamente:
Código PHP:
<?php
$serverName = "Servidor";
$connectionInfo = array( "Database"=>"BaseDeDatos","UID"=>"Usuario","PWD"=>"Contraseña");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if($conn){
echo('Conectado');
}else{
echo('No se pudo conectar<br/>');
die( print_r( sqlsrv_errors(), true));
}
$query = sqlsrv_query("Select * from motivos");
echo $query;
?>
Y bueno eso es todo. Cualquier cosa pueden escribir haber si les puedo echar una mano.
Saludos y espero que les haya servido.