Driver de Microsoft para PHP y SQL Server

Muy útil este driver que mejora considerablemente el rendimiento de cualquier aplicación de PHP que actualmente utilice el driver ODBC, la ganancia de rendimiento y velocidad se puede ver incrementada en hasta un 70%, por lo menos en mi caso a sido así, aunque hay que tener algunas cosas en cuenta con este nuevo driver que puedes descargar desde este enlace.

Este tipo de driver por ejemplo aún no implementa saber el número de datos que devuelve una consulta del tipo SELECT, para UPDATE o DELETE si pero no para los SELECT, el típico mysql_num_rows, pues esto aún no existe aunque es muy probable que en este 2009 en la versión 1.1 sea implementado junto con la compatibilidad con PHP 5.3, estas noticias se pueden ver en su blog original.

Otra de las características interesantes es que las fechas no las devuelve como un simple string sino como un objeto del tipo DateTime, de tal manera que si queremos utilizar esta fecha como una cadena y no tratamos este tipo de datos obtenemos el siguiente error: “DEFAULT: Object of class DateTime could not be converted to string”. La referencia de la clase DateTime se puede ver en el siguiente enlace a la página oficial de PHP.

Este uso de las fecha como un string puede resultar como poco engorroso si ya tienes tu aplicación montada y la usas como una cadena, para esos casos el driver tiene una función muy útil sqlsrv_get_field, la cual lleva 3 parámetros, el resultado de la query, el número del campo y el más importante y que es opcional, el tipo de datos que quieres que te devuelva, o sea que si para un campo datetime o smalldatetime hacemos lo siguiente:

sqlsrv_get_field($r,$p,SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR))

Para obtener el tipo de campo utilizamos la función sqlsrv_field_metadata que devuelve entre otras cosas en nombre del cambo y el tipo (según las constantes definidas en la clase y que podemos encontrar aquí). Por tanto el ejemplo quedaría de la siguiente forma:

$connectionOptions = array( "UID"=>$SQLUserName,"PWD"=>$SQLPassword,"Database"=>$SQLDataBaseName);
$conn = sqlsrv_connect($SQLHost, $connectionOptions);
$tsql = "SELECT * FROM tabla_con_fecha where fecha_creacion = '2009-03-12 12:41:00' order by fecha desc";
$getProducts = sqlsrv_query($conn, $tsql);
$tipo_campo=sqlsrv_field_metadata($getProducts);
$i=0;
while($row = sqlsrv_fetch($getProducts)){
    for($f=0;$f<sqlsrv_num_fields($getProducts);$f++){
        $data = ($tipo_campo[$f]['Type'] == SQLSRV_SQLTYPE_FLOAT)?sqlsrv_get_field($getProducts, $f):sqlsrv_get_field($getProducts, $f, SQLSRV_PHPTYPE_STRING( SQLSRV_ENC_CHAR));
        $arr_asociativo[$tipo_campo[$f]['Name']] = $data;
           echo $tipo_campo[$f]['Name']."=>".$data."<br>";
    }
    $resultado[$i] =$arr_asociativo;
    $i++;
}

¿Porqué utilizo SQLSRV_SQLTYPE_FLOAT en vez de comparar con SQLSRV_SQLTYPE_DATETIME ó SQLSRV_SQLTYPE_SMALLDATETIME? Pues porque es más fácil convertir todos los campos en cadenas y ya no habrá problemas de ningún tipo. ¿Entonces porqué el float no lo devuelvo como cadena? Pues porque si se devuelve como cadena en algunos casos aleatorios en vez de devolver 1,49 devuelve ó 1,48999999 ó 1,4900001, en fin que te los des - redondea por así decirlo, supongo que esto ocurra también con los tipos de datos SQLSRV_SQLTYPE_REAL pero esto no lo puedo asegurar.

Comentarios