Asier Marqués

Hablando sobre tecnologías web y otras cosas que me interesan

Archivo de la categoría 'Bases de Datos'...

Archivado bajo Bases de Datos, Desarrollo Web, Frameworks, Microsoft, PHP, Sistemas, Trucos

En la actual versión de symfony se usa Propel junto a Creole para crear un orm y una capa de abstracción entre la base de datos y el resto de nuestra aplicación.

Esto nos permite desarrollar aplicaciones independientes del motor de base de datos que usemos.

Php utiliza oficialmente la librería mssql para conectarse a una base de datos Sql Server y aunque existe una opción mejor por parte de Microsoft en fase CTP, Propel (y por lo tanto Symfony) la utilizan para conectarse a este tipo de motor.

Sin embargo, para conseguir conectarse y operar con éxito con Sql Server 2005 hay que hacer una serie de configuraciones en php/symfony y hacks en creole.
(Espero que no os siente esto como un cubata de Baileys con tonica : )

Vamos a verlo paso por paso:

1- Actualizar la librería ntwdblib.dll a la versión 2000.80.194.0.

2- Activar las extensiones php_mssql y php_xsl en el php.ini.

Adicionalmente debemos indicar los siguientes parámetros para php_mssql:

mssql.datetimeconvert = 0
mssql.textlimit = 2147483647
mssql.textsize = 2147483647

3- Crear nuestra base de datos en Sql Server y asignar el login y permisos adecuados al usuario que usemos para conectarnos.

4- Editar el archivo schema.yml con nuestro esquema de base de datos.

5- Configurar la conexión a la base de datos:

[ruta_completa]\symfony.bat configure:database
“mssql://usuario:password@equipo\instancia/nombre_baseDatos”

6- Construir el modelo orm de symfony:

[ruta_completa]\symfony.bat propel:build_model

7- Editar el fichero MSSQLConnection.php ubicado en \lib\plugins\sfPropelPlugin\lib\vendor\creole\drivers\mssql dentro del directorio de symfony.

En el caso de que no se especifique un puerto en el string de conexión a la base de datos, creole te inserta el valor de puerto predeterminado para sql server. Sin embargo, en Sql Server 2005 esto provoca un fallo impidiendo realizar una conexión exitosa a la base de datos.

Para evitar que creole nos meta el puerto si o si, debemos modificar la siguiente secuencia de control en MSSQLConnection.php:

if(!empty($dsninfo['port'])) {
$dbhost .= $portDelimiter.$dsninfo['port'];

}

//*else {
//$dbhost .= $portDelimiter.’1433′;
// }

Con estas modificaciones ya deberíamos poder trabajar con sql server 2005 desde symfony.

Comentarios (0) Posted by Asier Marqués on Miércoles, Julio 16th, 2008

Archivado bajo Bases de Datos, Desarrollo, Desarrollo Web, Sistemas

Cuando manejamos tipos de datos datetime y smalldatetime, a menudo es necesaria hacer una cambio de formato de fecha al resultado obtenido de la base de datos.

En Sql Server podemos usar la función CONVERT para hacer dichas conversiones directamente en la consulta transact-sql, ahorrándonos trabajo en la lógica de aplicación.

La sintáxis para dicha función es el siguiente:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Un ejemplo aplicado sería:

CONVERT(varchar(11), campo_fecha, 112) as fecha

Esto nos convertiría el valor de un campo_fecha del tipo datetime a tipo varchar con un formato ISO (por ejemplo 081231), y le asigna un alias fecha.

Lo que sigue es una tabla de códigos con las distintas opciones de formato para las fechas.

Sin el siglo (aa) (1) Con el siglo ?(aaaa) Estándar Entrada/salida (3)
- 0 o 100 (1, 2) Valor predeterminado mes dd aaaa hh:mia.m. (o p. m.)
1 101 EE.UU. mm/dd/aaaa
2 102 ANSI
aa.mm.dd
3 103 Británico/Francés dd/mm/aa
4 104 Alemán dd.mm.aa
5 105 Italiano dd-mm-aa
6 106 (1) - dd mes aa
7 107 (1) - Mes dd, aa
8 108 - hh:mi:ss
- 9 o 109 (1, 2) Valor predeterminado + milisegundos mes dd aaaa hh:mi:ss:mmma.m. (o p. m.)
10 110 EE.UU. mm-dd-aa
11 111 JAPÓN aa/mm/dd
12 112 ISO aammdd
- 13 o 113 (1, 2) Europeo predeterminado + milisegundos dd mes aaaa hh:mi:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 o 120 (2) ODBC canónico aaaa-mm-dd hh:mi:ss(24h)
- 21 o 121 (2) ODBC canónico (con milisegundos) aaaa-mm-dd hh:mi:ss.mmm(24h)
- 126 (4) ISO8601 aaaa-mm-ddThh:mi:ss.mmm (sin espacios)
127(6, 7) ISO8601 con zona horaria Z. aaaa-mm-ddThh:mi:ss.mmmZ

(sin espacios)

- 130 (1, 2) Hijri (5) dd mes aaaa hh:mi:ss:mmma.m.
- 131 (2) Hijri (5) dd/mm/aa hh:mi:ss:mmma.m.

1 Estos valores de estilo devuelven resultados no deterministas. Incluye todos los estilos (aa) (sin el siglo) y un subconjunto de estilos (aaaa) (con el siglo).

2 Los valores predeterminados (style 0 o 100, 9 o 109, 13 o 113, 20 o 120 y 21 o 121) siempre devuelven el siglo (aaaa).

3 Entrada cuando se convierte en datetime; salida cuando se convierte en datos de caracteres.

4 Diseñado para usarse con XML. Para convertir datos datetime o smalldatetime en datos de caracteres, el formato de salida es el descrito en la tabla anterior.

5 Hijri es un sistema de calendario con varias variaciones. SQL Server 2005 usa el algoritmo Kuwaiti.

Enlace a la documentación oficial

Comentarios (1) Posted by Asier Marqués on Miércoles, Junio 25th, 2008

Archivado bajo Bases de Datos, Sistemas

Baron Schwartz, coautor de la segunda edición de MySql performance y consultor de Percona, hizo una presentación en el beCamp 2008, en la que hablaba de conceptos básicos sobre rendimiento en bases de datos mySQL.

Tenéis dicha presentación aquí y aquí.

Comentarios (0) Posted by Asier Marqués on Viernes, Mayo 16th, 2008

Archivado bajo Bases de Datos, Desarrollo Web, Microsoft, PHP, Sistemas

Microsoft ha publicó hace unos meses la versión RTM de su driver oficial para php que permite conectarse a sus bases de datos SQL Server.

Vamos a usar dicho driver para mostrar cómo recuperaríamos el último id insertado en una tabla.


[php,N]//Especificamos el servidor
$server = “HOST\INSTANCIA”;
//Especificamos los datos de acceso y la base de datos
$info = array( “Database”=>”bd”,”UID” =>”user”,”PWD” =>”pass”);
//nos conectamos
$c = sqlsrv_connect( $server, $info);
//especificamos el código sql para la consulta parametrizada
$sql = “INSERT INTO tabla (valor) VALUES (?);”;
//Scope_Identity nos devuelve el último id insertado
$sql .= “SELECT Scope_Identity() as id;”;
/*
especificamos el valor o valores que se pasarán como
parámetros en la consulta anterior
**/
$param = array($valor);
//preparamos la consulta
$s = sqlsrv_prepare($c, $sql, $param);
//ejecutamos la consulta
sqlsrv_execute($s);
/**
*
En este momento se ha ejecutado la consulta pero, al contrario
de lo que podamos deducir, no se devuelve ningún valor ‘id’
aunque hagamos un fetch
para obtenerlo debemos hacer un sqlsrv_next_result();
**/
sqlsrv_next_result($s);
//Ahora sí, hacemos un fetch
$r = sqlsrv_fetch_array($s, SQLSRV_FETCH_ASSOC);
//Mostramos el resultado
echo “Hemos insertado una fila con el id: “.$r['id'];
//liberamos la variable de estado
sqlsrv_free_stmt($s);
//cerramos la conexión
sqlsrv_close($c);

Comentarios (0) Posted by Asier Marqués on Miércoles, Mayo 14th, 2008

Archivado bajo Bases de Datos, Microsoft, Sistemas

Como sabéis, sql server 2005 express edition es una edición gratuita de sql server 2005.

A pesar de ser gratuita, posee una serie de funcionalidades que pueden cubrir de sobra los requisitos iniciales de muchos proyectos serios. En algunos casos los puede cubrir para todo su ciclo de vida útil como en el caso de un blog o pequeñas aplicaciones web cms para internet.

Migrar en un futuro la base de datos de un sistema express a una edición profesional es algo trivial, por lo que si un proyecto requiere sql server 2005, es imprescindible conocer bien lo que da de sí la versión express de la misma.

En éste post voy a poner los límites más importantes que tiene ésta edición de sql server 2005 (están sacados de la comparativa oficial MSDE vs SQL Server Express 2005)

Comentarios (0) Posted by Asier Marqués on Miércoles, Febrero 20th, 2008

Archivado bajo Bases de Datos, Desarrollo Web, How-To, Microsoft, PHP, Servidores Web, Sistemas

Ésta semana David Cervigón publicó un post sobre cómo servir aplicaciones php en IIS7.

Yo en éste post voy a explicar cómo instalar en windows 2008 server Drupal, uno de los CMS open source más serios actualmente y sobre el que hay mayor documentación. Sitios como la facultad de ingeniería y ciencia de la Universidad de Hardvard, MobuzzTv, TheNew York Observer entre otros, usan Drupal para publicar sus contenidos.

En éste tutorial no mostraré cómo optimizar Drupal ni IIS, ni el url_rewrite, ni cómo configurar el servicio SMTP para envío de correo. Lo dejo para post posteriores.

He utilizado un entorno con Windows 2008 Server Web Edition sobre 32 bits y en una instalación completa. (intentaré hacer un post en el futuro con una instalación server core, que es la que más me atrae sexualmente)

  1. Instalo la función del servidor IIS con el check de CGI cuando pregunte en el listado de servicios de función.

    iis7-php

  2. Voy a php.net y descargo la última versión de PHP (ahora mismo 5.2.5) para windows “non-thread safe
  3. Descomprimo el paquete en un directorio (ej: c:\php) y creo una nueva variable de entorno PHPRC en el sistema y modifico la variable PATH añadiéndole el directorio php.

    php-2008-full-1

    Reinicio el sistema. (Por cierto ni se te ocurra añadir el grupo “todos” a la pestaña de seguridad del php.ini ;) )

  4. Creo un nuevo sitio web en IIS (si respondiese a un dominio concreto, lo indicaría en el encabezado de host, excepto si necesitaría wildcard dns [*.dominio.com] que lo dejaría sin encabezado - hay que tener cuidado con ésto en entornos en los que alojemos varios dominios distintos -).
  5. En ese sitio web, voy a “asignaciones de controlador” php-2008-full-2 y creo una nueva “asignación de módulo”. Indico *.php en ruta de acceso, fastcgi cómo módulo y el ejecutable php-cgi.exe, tal y cómo vemos en la captura:

    php-2008-full-3

  6. En la raiz del sitio web voy a “Documento predeterminado” y añado “index.php”
  7. Bajamos mysql y lo instalamos (Si deseamos probar la versión 5.1RC deberemos descargar el paquete mysql-essential 5.1.22, el resto me han dado problemas al lanzar el configurador de instancias). Como comenta David Cervigón, la última versión estable para instalar que no da problemas es la 5.0.45.
  8. Una vez instalada mysql, abro el php.ini (Inicio/ejecutar php.ini -si hemos ejecutado bien el paso 3), descomento las extensiones para mysql (mysql y mysqli) junto a las otras que me hagan falta -como gd2 y mbstring por ejemplo- y modifico la variable extension_dir con extension_dir = “c:\php\ext”
  9. Bajamos la última versión estable de drupal, en mi caso la 6.0, y lo descomprimimos en el directorio de nuestro nuevo sitio web
  10. Creamos una base de datos nueva que usará drupal con un usuario que tenga permisos sobre esa base de datos exclusivamente (nunca el usuario root! ;) ). Recomiendo el uso de las herramientas oficiales de administración, mysql gui tools.. que son gratuitas.
  11. Hecho esto, accedemos a nuestro sitio web por el navegador y comenzamos la instalación de drupal.. la cual no tiene mucho misterio.
  12. Tras instalar no os olvideis de dar los permisos adecuados al sitio web y en el directorio ./sites/default/ dar permisos de lectura únicamente (quitando el resto) al usuario IIS_IUSRS (si podéis dejar sólo los grupos administradores, usuarios y IIS_IUSRS con permisos en la raiz del sitio.. mejor)
  13. Y con ésto ya tendríamos el sitio funcionando correctamente.

    php-2008-full-6

Comentarios (4) Posted by Asier Marqués on Domingo, Febrero 17th, 2008

Archivado bajo Bases de Datos, Sistemas


Comentarios (0) Posted by Asier Marqués on Lunes, Enero 7th, 2008

Archivado bajo Bases de Datos, Seguridad, Sistemas

En mysql existe la función LOAD_FILE que admite como parámetro la ruta de un fichero local en Hexadecimal.

Si por ejemplo convertimos “c:\boot.ini” a su representación hexadecimal “0×633A5C626F6F742E696E69″ y se realiza la injection de abajo, la condición será True si la primera letra del fichero corresponde con el carácter ASCII 1.

http://www.dominioejemplo.com/index.php?id=1 and
mid(Load_File(0x633A5C626F6F742E696E69),1,1)=CHAR(1)

Por cada query de éste tipo carga el archivo completo en memoria, recorriendo todos los valores posibles del alfabeto hasta llegar al final del mismo.

Fuente: 3ª Parte del artículo “Técnicas avanzadas de Blind SQL Injection por Chema Alonso”

Comentarios (0) Posted by Asier Marqués on Martes, Diciembre 18th, 2007

Archivado bajo Bases de Datos, Calidad / Testing, Desarrollo Web, Sistemas, Usabilidad

Ésta es una selección de links que no me da tiempo a postear en profundidad y he encontrado interesantes.

Comentarios (0) Posted by Asier Marqués on Lunes, Noviembre 5th, 2007

Archivado bajo Bases de Datos, Desarrollo Web, Microsoft, PHP, Sistemas

Me ha alegrado saber que Microsoft ha desarrollado un driver para php5 de SQL Server 2005 (Asumo que será válido para la próxima versión 2008, ya que se trata de un service pack para 2005)

Han creado además un blog dedicado exclusivamente a ese driver en concreto, por lo que parece que está mucho más trabajado y se integra bastante mejor con SQL Server que la extensión mssql que tiene php5.

Funcion

Retorno

Descripcion

sqlsrv_conn_client_info($conn)

Array asociativo

Información del cliente

sqlsrv_conn_close($conn)

Boolean

Cierra la conexion

sqlsrv_connect($server, $options)

Recurso de conexión o null

Crea una conexion abierta

sqlsrv_conn_execute($conn, $tsql [, $params [, $sqlTypes]])

Recurso statement or null

Ejecuta una consulta T-SQL query.

sqlsrv_conn_prepare($conn, $tsql [, $sqlTypes])

Recurso statement or null

Prepara una consulta T-SQL sin ejecutarla.

sqlsrv_conn_server_info($conn)

Array asociativo or null

Información del servidor.

sqlsrv_errors()

Array or null

Error de la última operación.

sqlsrv_stmt_cancel($stmt)

Boolean

Cancela un statement.

sqlsrv_stmt_close($stmt)

Boolean

Cierra un statement.

sqlsrv_stmt_execute($stmt [, $params])

Boolean

Ejecuta un statement preparado.

sqlsrv_stmt_fetch($stmt)

Boolean

Extrae la fila siguiente del statement.

sqlsrv_stmt_fetch_array($stmt [, $fetchType])

Array asociativo, numeric array, o both

Extrae la fila siguiente del statement como un array.

sqlsrv_stmt_field_metadata($stmt)

Associative array o false

Retorna un campo como metadato.

sqlsrv_stmt_get_field($stmt, $fieldIndex [, $getAs])

Field value

Rotorna un campo actual mediante su índice.

sqlsrv_stmt_rows_affected($stmt)

Integer

Obtiene el número de filas modificadas.

sqlsrv_stmt_send_stream_data($stmt)

Boolean

Manda un estream de datos al servidor.

sqlsrv_warnings()

Array o null

Devuelve las alertas de última operación.

Es interesante ver cómo Microsoft se interesa por éste lenguaje (al igual que lo ha hecho por python) callando muchas bocas que hablan y opinan sobre php sin tener criterio alguno.

Comentarios (10) Posted by Asier Marqués on Viernes, Octubre 26th, 2007