Archive for the ‘mysql’ Category

Filed Under (mysql, pdo, propel, session, symfony) by pgodel on Junio-5-2008

Symfony permite utilizar distintos medios para guardar los datos de sesión. Por defecto, Symfony utiliza el sistema de archivos (con el directorio /tmp)

Para correr Symfony en un cluster de servidores web es necesario guardar la sesión en un lugar centralizado. Para esto se puede utilizar Mysql.

Es necesario crear una tabla para guardar los datos. El schema es el siguiente:

CREATE TABLE IF NOT EXISTS `session` (
`id` VARCHAR(32) NOT NULL ,
`sess_time` INT NULL ,
`data` TEXT NULL ,
PRIMARY KEY (`id`) )

Luego, hay que configurar Symfony para utilizar esta tabla. Primero, debemos crear la conexión a la base de datos para la sesión . En el archivo config/databases.yml ponemos:

session:
class: sfPDODatabase
param:
dsn: mysql:dbname=mydb;host=localhost
username: myuser
password: mypass

Recuerden reemplazar los datos de dbname, host, username, y password con sus datos de conexión.

Luego, en la configuración de la aplicación es necesario definir la clase para guardar la sesión utilizando PDO. En el archivo config/factories.yml de la aplicación debemos agregar lo siguiente:

all:
class: sfPDOSessionStorage
param:
db_table: session
database: session
session_name: session
db_id_col: id
db_time_col: sess_time
db_data_col: data

Luego de limpiar el cache con symfony cc la sesión deberia ser guardada en la tabla.

También es posible utilizar la conexión de propel existente, pero al momento de escribir este artículo tengo algun problema con este método. Luego comentaré la solución.

Links para más información:



Filed Under (mysql, propel, symfony) by pgodel on Mayo-9-2008

Si utilizas propel para generar el sql desde el schema, y necesitas que incluya el tipo innodb en la declaración de creación de la tabla, debes incluir la siguiente línea en /config/propel.ini :

mebelipropel.mysql.tableType = InnoDB

Luego, ejecutando “symfony propel-build-sql” generará el archivo .sql en data/sql con el correspondiente tipo.



Filed Under (mysql, propel, symfony) by pgodel on Abril-8-2008

Al momento de crear algunas tablas en el modelo de datos, para algunos índices elegí el tipo de datos BIGINT de Mysql.

Luego de convertir el modelo a un schema.yml con propel, y generar un admin con propel-init-admin descubrí que el sorting usando columnas que son BIGINT no estaba correcto. El orden era calculado usando strings en vez de números.

Así fue como descubrí que propel convierte BIGINT a strings y no INT.

Para solucionar el problema, hay que reemplazar BIGINT por INTEGER y generar el modelo nuevamente.



Filed Under (mysql, symfony) by pgodel on Marzo-27-2008

Si no lo sabes, MySQL no tiene tipo de datos BOOLEAN como otras RDBMS. Cuando uno crea una tabla con columnas BOOLEAN, estas son creadas como TINYINT.

Por su parte, Symfony tiene un feature muy bueno: cuando uno crea un admin basado en un modelo, si encuentra una columna BOOLEAN, lo presenta con un checkbox, pero si es TINYINT pone un INPUT TEXT.

Como a mi me gusta generar el modelo usando el MySQL Workbench cuando genero el schema para el symfony utilizando la base de datos creada, symfony encuentra la columna como TINYINT.

Para resolver esto, utilizo el comando sed para hacer el reemplazo en un script de bash:

#!/bash/sh

symfony clear-cache

symfony propel-build-schema

mv config/schema.yml config/schema_bak.yml

sed s/TINYINT/BOOLEAN/ config/schema_bak.yml > config/schema.yml

symfony propel-build-model



Filed Under (mysql) by pgodel on Marzo-24-2008

Hace poco comence un nuevo proyecto que contiene muchas tablas en la base de datos. Para hacer la vida un poco más fácil, decidí usar el Mysql Workbench.

Este utilitario permite diseñar bases de datos y tablas visualmente. Una vez terminado, se puede exportar el resultado a SQL para crear todas las tablas.

Una de las opciones más interesantes es que permite relacionar tablas usando foreign keys. Luego de crear unas cuantas tablas, al correr el SQL en el servidor, algunas tablas no eran creadas y obtenía el siguiente error:

Can’t create table errno: 121

Buscando en google encontre varias menciones pero nada concreto hasta que, finalmente, di en el clavo. El nombre de las relaciones son asignadas automáticamente por el programa (se pueden cambiar si es necesario/deseado), resulta que algunas relaciones tenian el mismo nombre. Fue cuestión de cambiar el nombre en la definición de la relación y listo.

Problema solucionado, pero me tomó un buen rato encontrar el significado de este error, no muy bien documentado.



Filed Under (Anuncios, Comentarios, Seguridad, apache, mysql) by pgodel on Enero-18-2008

Recientemente hemos visto como se han incrementado los ataques a instalaciones de phpMyAdmin.

En los logs de nuestros servers aparecen entradas como las siguientes:

     /MYADMIN/main.php: 2 Time(s)
     /MYadmin/main.php: 2 Time(s)
     /MyAdmin/main.php: 2 Time(s)
     /PHPMYADMIN/main.php: 2 Time(s)
     /PHPMYadmin/main.php: 2 Time(s)
     /PHPmyadmin/main.php: 2 Time(s)
     /PMA/main.php: 2 Time(s)
     /PMA/main.phpmain.php: 2 Time(s)
     /PhPmYaDmIn/main.php: 2 Time(s)
     /admin/main.phpmain.php: 2 Time(s)
     /admin/mysql/main.phpmain.php: 2 Time(s)
     /admin/phpmyadmin/main.phpmain.php: 2 Time(s)
     /admin/pma/main.phpmain.php: 2 Time(s)
     /db/main.phpmain.php: 2 Time(s)
     /dbadmin/main.phpmain.php: 2 Time(s)
     /favicon.ico: 4 Time(s)
     /main.phpmain.php: 2 Time(s)
     /myADMIN/main.php: 2 Time(s)
     /myadmin/main.php: 2 Time(s)
     /myadmin/main.phpmain.php: 2 Time(s)
     /mysql-admin/main.phpmain.php: 4 Time(s)
     /mysql/main.phpmain.php: 2 Time(s)
     /mysqladmin/main.phpmain.php: 2 Time(s)
     /pHpMyAdMiN/main.php: 2 Time(s)
     /phpMYadmin/main.php: 2 Time(s)
     /phpMyAdmin-2.2.0/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.2.3/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.2.6/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.2.7-pl1/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.2.7/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.5.1/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.5.4/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.5.6/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.6.4-pl4/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.6.4/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.7.0-pl2/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.7.0/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.8.1/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.8.2.1/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.8.2.2/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.8.2.4/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.9.0.1/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.9.0.2/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.9.0/main.phpmain.php: 2 Time(s)
     /phpMyAdmin-2.9.1/main.phpmain.php: 2 Time(s)
     /phpMyAdmin/main.php: 2 Time(s)
     /phpmyADMIN/main.php: 2 Time(s)
     /phpmyadmin/main.php: 2 Time(s)
     /phpmyadmin/main.phpmain.php: 2 Time(s)
     /phpmyadmin/test.phpmain.php: 2 Time(s)
     /phpmyadmin2/main.phpmain.php: 2 Time(s)
     /pma/main.php: 2 Time(s)
     /pmamy/main.php: 2 Time(s)
     /web/phpMyAdmin/main.phpmain.php: 2 Time(s)

De esto se desprenden las siguientes recomendaciones:
- Es importantisimo mantener actualizada la versión de phpMyAdmin para corregir problemas de seguridad.
- Igualmente importante es instalar la aplicación en un directorio con un nombre y ubicación no convencional, de esta forma, si llegara a descubrirse un nuevo problema, la instalación no será fácilmente accesible.
- De ser posible, es conveniente asegurar el directorio completo con autenticación de Apache utilizando AuthType, AuthName, etc.