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.
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,
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!
@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!
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
pueedes detallar el punto 5 y 6 porfavorr!!!
=)
te lo agradeceria un montoon!
Pingback: Can you buy xanax without a prescription.
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.
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