Trabajar con symfony y sql server 2005

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.

Sobre Asier

Arquitecto web enganchado al desarrollo, estudio y planteamiento de proyectos en internet. Trabajo en Blackslot, empresa que fundé en el 2009. Me encanta el cine, el café, el sexo, la cultura geek, la cultura oriental y la música electrónica.
Artículo publicado en Bases de Datos, Desarrollo Web, Frameworks, Microsoft, PHP, Sistemas y etiquetada . Aquí tienes su enlace permanente.

8 espuestas a Trabajar con symfony y sql server 2005

  1. Mauricio dijo:

    Hola Asier, espero que te encuentres muy bien.

    Asier, muy interesante tus recomendaciones pero tengo un problema, después de probar paso a paso tus recomendaciones con symfony instalado y configurado en Windows XP no puedo crear la BD en SQL Server 2005, arrojándome el siguiente error:

    [PHP Error] Capsule::include(sql/db-init/mssql/createdb.tpl): failed to open stream: No such file or directory [line 127 of C:\xampp\php\PEAR\symfony\vendor\phing\lib\Capsule.php]

    [PHP Error] Capsule::include(): Failed opening ‘sql/db-init/mssql/createdb.tpl’ for inclusion (include_path=’C:\xampp\php\PEAR\symfony\vendor\propel-generator\templates;C:\xampp\php\PEAR\symfony\vendor\propel-generator\templates;C:\xampp\php\PEAR\symfony\vendor\propel-generator\classes;C:\xampp\php\pear/symfony;C:\psmr17;C:\xampp\php\pear/symfony/vendor/propel-generator/classes;C:\psmr17\lib;C:\psmr17\apps\\lib;;C:\xampp\php\pear/symfony\vendor;.;C:\xampp\php\pear;C:\xampp\php\pear\’) [line 127 of C:\xampp\php\PEAR\symfony\vendor\phing\lib\Capsule.php]

    Al revisar los errores busque el archivo createdb.tpl en el directorio sql/db-init/mssql/, y no se encuentra implementado, es decir, los únicos archivos encontrados son:

    unix.tpl
    Contenido:
    #!/bin/sh

    #foreach ($databaseModel in $appData.Databases)
    dropdb $databaseModel.Name
    createdb $databaseModel.Name
    #end

    windows.tpl
    Contenido:
    ECHO Not implemented

    Como dato adicional te cuento que la version que tengo instalado como Symfony es: symfony version 1.0.11

    Asier, será posible con tu experiencia me puedas indicar como resolver este problema

    Por tu colaboración muchas gracias.
    Saludos,

  2. Gustavo dijo:

    Hola Asier,
    Con qué versión de Symfony hiciste esta guía? Tengo entendido que en la nueva versión (1.2) Symfony utiliza PDO en vez de Creole… quizás sea más fácil conectarse a SQL Server…

    Saludos!

  3. @Gustavo esto lo hice con la 1.1

    En efecto Propel 1.3 usa PDO, por lo que se gana en rendimiento.

    Más facil? Realmente no, la abstracción es la misma pero, de seguro, será mucho más fiable.

    Queda a la espera que el nuevo driver oficial de Microsoft para trabajar desde php con SQL 2005/2008 tenga en un futuro muy próximo interfaz PDO.

    Un saludo!

  4. Jose Venegas dijo:

    Hola Asier segui tu manual para SQL Server 2005 con symfony logro crear el schema.yml y las clases del modelo pero quiero por ejemplo hacer un propel:init-admin corre normal pero tengo este error al abrir la pagina

    [wrapped: Could not execute query [Native Error: sqlite_query() [function.sqlite-query]: no such table: Table_4] [User Info: SELECT COUNT(Table_4.ID) FROM Table_4]]

    lo extraño es Table_4.ID
    Yo creo que ID se refiere a un campo de la Base de Datos. Pero ese campo no lo tengo en mi tabla

    si me podrias ayudar por favor es posible trabajar en un entorno real con SQL Server 2005 y Symfony? si aqui ya me hice bolas me pregunto como seria los procedimientos almacenados vistas y gestion de usuarios

  5. andrea dijo:

    pueedes detallar el punto 5 y 6 porfavorr!!!
    =)

    te lo agradeceria un montoon!

  6. Pingback: Can you buy xanax without a prescription.

  7. gatto dijo:

    tengo una duda y si yo quiero utilizar como bd cualquier otra como Mysql por ejemplo y solo quiero en un módulo en específico hacer ciertas consultas a una bd de SQL Server para por ejemplo sacar ciertos datos trabajar con ellos y guardar los datos de los resultados en la otra, que tendria que hacer.

  8. José De Abreu dijo:

    Amigo no se si me puedes ayudar, esto tratando de conectar con sql server 2000 pero me da el siguiente error: [propel-sql-exec] SQLSTATE[42000]: [Microsoft][SQL Server Native Client 10.0][SQL Server]Permiso CREATE TABLE denegado en la base de datos ‘master’.
    Aparentemente parace que ya se conecta pero está tratando de crear las tablas en la BD master y mi bd es mobmar
    Se que tengo que colocar la base de datos en los archivos propel y database.yml pero he probado muchas formas y no funciona, podrías ayudarme.

    mi archivo propel.ini es:
    propel.targetPackage = lib.model
    propel.packageObjectModel = true
    propel.project = mobilemsql
    propel.database = sqlsrv
    propel.database.driver = sqlsrv
    propel.database.url = sqlsrv:server=PERSONAL\mm
    propel.database.creole.url = ${propel.database.url}
    propel.database.user = gaby
    propel.database.password = 20jdnata
    propel.database.encoding = utf8

    ; mysql options
    propel.mssql.tableType = InnoDB

    y Mi archivo database.yml (lo importante):
    all:
    propel:
    class: sfPropelDatabase
    param:
    phptype: sqlsrv
    classname: sqlsrvPropelPDO
    dsn: sqlsrv:server=PERSONAL\mm
    username: gaby
    password: 20jdnata
    encoding: utf8
    persistent: true
    pooling: true

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos, están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Notificarme los nuevos comentarios por correo electrónico. Tambien puedes suscribirte sin comentar.